[go]跳表的实现

本文介绍了跳表的实现原理,包括其查找和插入操作的时间复杂度,并展示了如何使用跳表维护可用服务器列表。在解决找到处理最多请求的服务器问题时,结合了优先队列来管理按结束时间排序的任务,利用跳表的特性高效查找和更新服务器。通过这种方式,能够快速找到满足条件的服务器,提高了调度效率。
摘要由CSDN通过智能技术生成

之前看某个视频或者书总结的,具体是哪个给忘记了。。感谢前人栽树,我这里只是简单实现和使用

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值