Add skip lists

This commit is contained in:
Tyler Perkins 2022-12-26 19:24:02 -05:00
parent 71aafdb23f
commit 53e8124d28
1 changed files with 63 additions and 0 deletions

63
Skip lists.html Normal file
View File

@ -0,0 +1,63 @@
<div class="post-2-1">
<div>
<p>Skiplists are possibly one of the most useful data structures that I don't
see talked about all that often. They are a special type of list that is
probabilistic in nature, and allows for O(log n) indexing and searching, and
O(1) insertion when provided an iterator. They are always sorted, and therefore
have great ordered traversal. Its insane just how fast these things are.</p>
<p>The general concept starts with a normal linked list, usually singly linked
lists. From there we make it so that each node in the list has pointers to more
than just the next element. With this we can skip forward through the last much
faster. By randomly placing pointers forward when traversing normally, we can
build up a well distributed set of pointers, allowing us to skip forward large
amounts at first, then slowing getting more precise as we find the element we
want.</p>
</div>
<div class="col-sm-4">
<figure>
<img src="../img/Skip_list.svg" class="fig-img"></img>
<figcaption>Diagram of a skiplist, from <a
href="https://en.wikipedia.org/wiki/Skip_list">Wikipedia</a>
</figcaption>
</figure>
</div>
</div>
<div class="row no-gutters">
<div class="col-sm">
<h4>Complexities</h4>
<h5>Average case</h5>
<ul>
<li>Search - log n</li>
<li>Insert - log n</li>
<li>Delete - log n</li>
<li>Index - log n (indexable skiplist implementation)</li>
<li>Space usage - n log n</li>
</ul>
<h5>Use cases</h5>
<p>The use case that lead me to find this was implementing a cache for often
repeated malloc() operations. I have a use case where textures need to be
allocated with strings on those textures. The set of string will repeat itself
often, however the strings to be shown are somewhat unpredictable. Therefore, I
am keeping a hash table of pointers to the allocated textures, and a skip list
associating the age of the entry with the string on the texture. Using a
skiplist allows for log n lookup and removal of the entries so we can keep
accurate track of what entries are how old. Due to its fast access of its
elements, and having O(1) access time to the head element, there is a slight
performance advantage to using this versus a Heap.</p>
<h5>Implementations</h5>
<p>I am using <a href="https://github.com/Samyak2/skip-list">this</a>
implementation right now to benchmark this cache system in context, then I
plan to build my own skip list. I hope this helps in your own projects!</p>
</div>
</div>