跳跃表原理与实现!
跳跃表原理与实现!
月伴飞鱼对于下面这个链表,需要查找元素9。
- 一共遍历8个节点才能找到元素9。
由于元素是有序的,可以通过增加一些路径来加快查找速度。
- 通过这种方法,只需要遍历5次就可以找到元素9了(红色线路为查找路径)。
如果再加一层,只需要查找4次就能找到了。
对于具有n个元素的链表,可以采取
(logn+1)
层指针路径的形式
- 就可以实现在
O(logn)
的时间复杂度内,查找到某个目标元素了,这种数据结构,称之为跳跃表。
跳跃表有关性质
跳跃表的每一层都是一条有序的链表。
跳跃表的查找次数近似于层数。
- 时间复杂度为
O(logn)
,插入、删除也为O(logn)
。最底层的链表包含所有元素。
跳跃表是一种随机化的数据结构(通过抛硬币来决定层数)。
跳跃表的空间复杂度为
O(n)
。
查找操作
顶层索引节点定位:
- 从顶层索引节点开始,跳跃表会比较顶层索引节点所指向的节点值与目标值的大小关系。
- 然后根据比较结果选择继续向右移动还是向下移动。
向下移动:
- 如果顶层索引节点所指向的节点值小于目标值,则跳跃表将向右移动到下一个节点进行比较。
- 直到找到大于或等于目标值的节点为止。
回溯与向下查找:
- 一旦跳跃表在某一层找到了不小于目标值的节点后,就会回溯到下一层该节点所对应的位置。
- 然后继续向下查找,直到定位到目标节点或者无法向下查找为止。
插入操作
在跳跃表中进行插入操作时,首先需要确定插入节点的层数。
- 跳跃表通过随机生成节点的层数。
使得每个插入的节点都有一个随机的层数。
- 这种特性使得跳跃表可以根据数据动态调整索引结构,从而保证插入操作的高效性。