删除 skiptable.go

This commit is contained in:
kingecg 2025-02-24 00:41:59 +08:00
parent 58f3bda481
commit a2ddea1365
1 changed files with 0 additions and 133 deletions

View File

@ -1,133 +0,0 @@
package main
import (
"fmt"
"math/rand"
"time"
)
const (
maxLevel = 32 // 最大层数
probability = 0.5 // 层数生成概率因子
)
// SkipNode 跳表节点结构
type SkipNode struct {
key int
value interface{}
forward []*SkipNode // 各层的前进指针
}
// NewSkipNode 创建新节点
func NewSkipNode(key int, value interface{}, level int) *SkipNode {
return &SkipNode{
key: key,
value: value,
forward: make([]*SkipNode, level),
}
}
// SkipList 跳表结构
type SkipList struct {
header *SkipNode // 头节点
level int // 当前最大层数
randSrc rand.Source // 随机数源
}
// NewSkipList 初始化跳表
func NewSkipList() *SkipList {
return &SkipList{
header: NewSkipNode(0, nil, maxLevel),
level: 1,
randSrc: rand.NewSource(time.Now().UnixNano()),
}
}
// randomLevel 生成随机层数 (抛硬币法)
func (sl *SkipList) randomLevel() int {
level := 1
for ; level < maxLevel && sl.randSrc.Int63()&0xFFFF < int64(probability*0xFFFF); level++ {
}
return level
}
// Search 查找键对应的值
func (sl *SkipList) Search(key int) (interface{}, bool) {
current := sl.header
// 从最高层开始查找
for i := sl.level - 1; i >= 0; i-- {
// 在当前层向右移动直到找到大于等于key的节点
for current.forward[i] != nil && current.forward[i].key < key {
current = current.forward[i]
}
}
// 移动到最底层(0层)的下一个节点
current = current.forward[0]
if current != nil && current.key == key {
return current.value, true
}
return nil, false
}
// Insert 插入键值对
func (sl *SkipList) Insert(key int, value interface{}) {
update := make([]*SkipNode, maxLevel) // 各层需要更新的前驱节点
current := sl.header
// 1. 查找各层的前驱节点
for i := sl.level - 1; i >= 0; i-- {
for current.forward[i] != nil && current.forward[i].key < key {
current = current.forward[i]
}
update[i] = current
}
// 2. 检查是否已存在相同key
current = current.forward[0]
if current != nil && current.key == key {
current.value = value // 更新值
return
}
// 3. 生成新节点的随机层数
newLevel := sl.randomLevel()
if newLevel > sl.level {
// 补充高层的前驱节点为header
for i := sl.level; i < newLevel; i++ {
update[i] = sl.header
}
sl.level = newLevel
}
// 4. 创建新节点并插入各层
newNode := NewSkipNode(key, value, newLevel)
for i := 0; i < newLevel; i++ {
newNode.forward[i] = update[i].forward[i]
update[i].forward[i] = newNode
}
}
// Delete 删除指定键的节点
func (sl *SkipList) Delete(key int) bool {
update := make([]*SkipNode, maxLevel)
current := sl.header
// 1. 查找各层的前驱节点
for i := sl.level - 1; i >= 0; i-- {
for current.forward[i] != nil && current.forward[i].key < key {
current = current.forward[i]
}
update[i] = current
}
// 2. 定位到目标节点
current = current.forward[0]
if current == nil || current.key != key {
return false // 未找到
}
// 3. 从各层链表中移除
for i := 0; i < sl.level; i++ {
if update[i].forward[i] != current {
break // 上层已