package skiplist
import (
"math"
"math/rand"
)
type (
SkipList struct {
head *element
cacheList []*element
maxLevel int
}
element struct {
next []*element
key int
val interface{}
}
)
func NewSkipList(maxLevel int) *SkipList {
return &SkipList{
head: &element{
next: make([]*element, maxLevel),
key: math.MinInt32,
val: nil,
},
cacheList: make([]*element, maxLevel),
maxLevel: maxLevel,
}
}
func (sl *SkipList) Set(key int, val interface{}) {
var (
next *element
prev = sl.head
)
for i := sl.maxLevel - 1; i >= 0; i-- {
next = prev.next[i]
for next != nil && next.key < key {
prev = next
next = next.next[i]
}
sl.cacheList[i] = prev
}
if elm := sl.cacheList[0].next[0]; elm != nil && elm.key == key {
sl.cacheList[0].val = val
return
}
insertData := &element{
next: make([]*element, sl.randomLevel()),
key: key,
val: val,
}
for i := 0; i < len(insertData.next); i++ {
insertData.next[i] = sl.cacheList[i].next[i]
sl.cacheList[i].next[i] = insertData
}
}
func (sl *SkipList) Get(key int) (interface{}, bool) {
var (
prev = sl.head
next *element
)
for i := sl.maxLevel - 1; i >= 0; i-- {
next = prev.next[i]
for next != nil && next.key < key {
prev = next
next = next.next[i]
}
}
if next != nil && next.key == key {
return next.val, true
}
return nil, false
}
func (sl *SkipList) Del(key int) (interface{}, bool) {
var (
prev = sl.head
next *element
)
for i := sl.maxLevel - 1; i >= 0; i-- {
next = prev.next[i]
for next != nil && next.key < key {
prev = next
next = next.next[i]
}
sl.cacheList[i] = prev
}
if elm := sl.cacheList[0].next[0]; elm == nil || elm.key != key {
return nil, false
}
val := sl.cacheList[0].val
for i := 0; i < len(sl.cacheList[0].next[0].next); i++ {
sl.cacheList[i].next[i] = sl.cacheList[i].next[i].next[i]
}
return val, true
}
func (sl *SkipList) randomLevel() int {
level := 1
for {
if rand.Intn(1) == 0 {
level++
} else {
return level
}
if level >= sl.maxLevel {
return sl.maxLevel
}
}
}
跳表
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 链表加多级索引的结构,就是跳表。它是一种动态数据结构,可以支持快速的插入、删除、查找操作。 用跳表查询到底有多快?...
- 因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了...
- 跳表是一种神奇的数据结构,因为几乎所有版本的大学本科教材上都没有跳表这种数据结构,而且神书《算法导论》、《算法第四...
- leveldb 源码分析 —— SkipList跳表 原文 leveldb 存取数据,都在用 MemTable 这...