Add skip lists
This commit is contained in:
parent
71aafdb23f
commit
53e8124d28
63
Skip lists.html
Normal file
63
Skip lists.html
Normal 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>
|
Reference in New Issue
Block a user