64 lines
2.5 KiB
HTML
64 lines
2.5 KiB
HTML
|
<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>
|