之前看某个视频或者书总结的,具体是哪个给忘记了。。感谢前人栽树,我这里只是简单实现和使用
package skip_list
import (
"math"
"math/rand"
"time"
)
const (
MaxLevel = 18 //最大层数
Probability = 1 / math.E //每一个节点是否可以向上的概率基数
)
type (
// Comparable 大于返回正数,小于返回负数,等于返回0
Comparable interface {
CompareTo(Comparable) int
}
KV struct {
K Comparable
V interface{
}
}
Element struct {
next []*Element
kv *KV
}
SkipList struct {
node Element //第一个为头结点,不存值
maxLevel int //最大层数
len int //跳表长度
randSource rand.Source //生成随机数
probTable []float64 //用于查询每一层生成索引的概率
prevNodeCache []*Element // 用于保存查询一个值时经过每一层时的最后一个节点
}
)
func NewKV(key Comparable, value interface{
}) *KV {
return &KV{
K: key,
V: value,
}
}
func NewSkipList() *SkipList {
return &SkipList{
node: Element{
next: make([]*Element, MaxLevel)},
maxLevel: MaxLevel,
randSource: rand.NewSource(time.Now().UnixNano()),
probTable: probabilityTable(Probability, MaxLevel),
prevNodeCache: make([]*Element, MaxLevel),
}
}
// Len 获取长度
func (sList *SkipList) Len() int {
return sList.len
}
// Get 获取数据 如果没有相等的数据,返回它的下一个元素(也可能是nil),bool仍是false
func (sList *SkipList) Get(k Comparable) (*KV, bool) {
prev := &sList.node //重要 从头结点开始遍历
var node *Element
for now := sList.maxLevel - 1; now >= 0; now-- {
node = prev.next[now]
for node != nil && k.