go语言-数据结构之跳表
本文所有的图来自于力扣1206.设计快表中的官方题解
为什么要跳表?
在单链表中,我们查找元素时,需要从链表头开始从前向后遍历,查找的时间复杂度为O(n)
跳表可以被看做二叉树的一个变种,它在性能上和红黑树、AVL 树不相上下,目前在 Redis 和LevelDB 中都有用到。跳表的期望空间复杂度为O(n),跳表的查询,插入和删除操作的期望时间复杂度均为O(logn)。
主要使用空间换时间的思想,形成层级形式的链表
跳表的操作
结构体、初始化和随机函数
const maxLevel = 32
const pFactor = 0.25
type SkipListNode struct {
val int //节点的值
next []*SkipListNode //节点各层级列表,并且存的是各层级的下一个节点
}
type Skiplist struct {
head *SkipListNode //假头节点
level int //最大层级
}
func Constructor() Skiplist {
return Skiplist{
&SkipListNode{
-1, make([]*SkipListNode, maxLevel)}, 0}
}
//通过期望p,随机层级
func (Skiplist) randomLevel() int {
lv := 1
for lv < maxLevel && rand.Float64()</