游戏排行榜的实现思路:1、用数据库直接排序2、用跳表进行排序
游戏匹配的实现:将玩家塞入一个匹配池,然后蓄池后进行匹配。匹配是从池中获取相应数量的玩家,每次都优先匹配等待时间长的玩家。还有就是随着玩家匹配失败次数增加会不断扩大匹配范围,具体表现为参数不断减少。
记录一下自己迷糊的几个点:SavePoolTime和SavePoolCheckTime,具体来说就是不太清楚这两个字段的实际意义,结合MaxWaitTime(匹配超时时间),对于后面等待并蓄池的部分思路有些混乱;只是大概知道会等待然后蓄池,再从中进行匹配。
package main
import(
"time"
"sync"
)
type MatchParamModel struct {
Id uint32 //匹配id
SavePoolCheckTime uint32 //蓄池检测时间
SavePoolTime uint32 //蓄池最长时间
SavePoolNum uint32 //蓄池数量
MinCount uint32 //匹配队伍最少玩家数量
Count uint32 //匹配队伍玩家数量
MaxWaitTime uint32 //匹配超时时间
Param1 uint32 //匹配参数1间隔
Param2 uint32 //匹配参数2间隔
}
跳表
哈哈哈哈哈哈,这段代码好有意思
func (s *Skiplist) roll() int {
var level int
// 每次投出 1,则层数加 1
for rand.Int() > 0 {
level++
}
return level
}
时间复杂度是这样理解的,其实跳表严格来说就是链表的基础上,希望查得快点,所以想到了,类似于索引一样,分层,每层都接近是下一层的1/2。那么就有点像快排,最后就是O(logN)的。
但是其实每层遍历的时候,都是选择一个区域进行下一层的判断,由于每层都是下一层/2后上来的,所以相当于,这一层中间又多了一个分界点,然后进行相同的操作。每次操作要么是等于,要么是大于然后后移,要么是发现小于了要进入下一层,最多也就三次操作,所以查找的时间复杂度就是上面说的了