跳跃表的结构定义如下:
// 跳跃表节点结构体
type SkipListNode struct {
val interface{} // 保存的值
score int // 用于排序的分值
level int // 层高
forwards []*SkipListNode // 每层前进指针
}
// 跳跃表结构体
type SkipList struct {
head *SkipListNode
level int
length int
}
实现操作如下:
- 获取跳跃表长度
- 获取跳跃表层数
- 插入节点
- 删除节点
- 查找节点
代码如下:
package main
import (
"math"
"math/rand"
)
// 跳跃表的实现
// 跳跃表的最高层数
const MAX_LEVEL = 16
// 跳跃表节点结构体
type SkipListNode struct {
val interface{} // 保存的值
score int // 用于排序的分值
level int // 层高
forwards []*SkipListNode // 每层前进指针
}
// 跳跃表结构体
type SkipList struct {
head *SkipListNode
level int
length int
}
// 新建跳跃表节点
func NewSkipListNode(v interface{}, score, level int) *SkipListNode {
return &SkipListNode{
val: v,
score: score,
level: level,
forwards: nil,
}
}
// 新建跳跃表对象
func NewSkipList() *SkipList {
// 头结点方便操作
head := NewSkipListNode(0, math.MaxInt32, MAX_LEVEL)
return &SkipList{
head: head,
level: 1,
length: 0,
}
}
// 获取跳跃表长度
func (this *SkipList)Length() int {
return this.length
}
// 获取跳跃表层级
func (this *SkipList)Level() int {
return this.level
}
// 插入节点到跳跃表中
func (this *SkipList) Insert(v interface{}, score int) int {
if nil == v {
return 1
}
// 查找插入位置
cur := this.head
// 记录每层的路径
update := [MAX_LEVEL]*SkipListNode{}
i := MAX_LEVEL - 1
for ; i >= 0; i-- {
for cur.forwards[i] != nil {
if cur.forwards[i].val == v {
return 2
}
if cur.forwards[i].score > score {
update[i] = cur
break
}
cur = cur.forwards[i]
}
if cur.forwards[i] == nil {
update[i] = cur
}
}
// 随机选取该节点层数
level := 1
for i := 1; i < MAX_LEVEL; i++ {
if rand.Int31() % 7 == 1 {
level++
}
}
// 新建跳跃表节点
newNode := NewSkipListNode(v, score, level)
// 原有节点连接
for i := 0; i <= level-1; i++ {
next := update[i].forwards[i]
update[i].forwards[i] = newNode
newNode.forwards[i] = next
}
// 更新跳跃表层数
if level > this.level {
this.level = level
}
this.length++
return 0
}
// 跳跃表的查找
func (this *SkipList) Find(v interface{}, score int) *SkipListNode {
if v == nil || this.length == 0 {
return nil
}
// 查找的节点
cur := this.head
for i := this.level-1; i >=0; i-- {
for cur.forwards[i] != nil {
if cur.forwards[i].score == score && cur.forwards[i].val == v {
return cur.forwards[i]
}else if cur.forwards[i].score > score {
break
}
cur = cur.forwards[i]
}
}
return nil
}
// 删除节点
func (this *SkipList) Delete(v interface{}, score int) int {
if v == nil {
return 1
}
// 查找前驱节点
cur := this.head
// 记录前驱路径
update := [MAX_LEVEL]*SkipListNode{}
for i:= this.level - 1; i>=0; i-- {
update[i] = this.head
for cur.forwards[i] != nil {
if cur.forwards[i].score == score && cur.forwards[i].val == v {
update[i] = cur
break
}
cur = cur.forwards[i]
}
}
cur = update[0].forwards[0]
for i:=cur.level-1; i>=0; i-- {
if update[i] == this.head && cur.forwards[i] == nil {
this.level = i
}
if update[i].forwards[i] == nil {
update[i].forwards[i] = nil
}else {
update[i].forwards[i] = update[i].forwards[i].forwards[i]
}
}
this.length--
return 0
}
func main() {
}

京公网安备 11010502036488号