typedef
struct zskiplistnode level;
// index越大表示層級越高
} zskiplistnode;
typedef
struct zskiplist zskiplist;
typedef
struct zset zset;
命令: zadd key score value
zskiplistnode *
zslinsert
(zskiplist *zsl,
double score, sds ele)
// 如果無法往後走了,走到下一層。記錄這一層卡住的節點(新高度超過原有最高高度時使用)
update[i]
= x }
// 計算節點的層級
level =
zslrandomlevel()
;// 如果出現新的高度,將原來記錄的節點指向新節點
if(level > zsl->level)
zsl->level = level;
}// 建立乙個跳躍表節點
x =zslcreatenode
(level, score, ele)
;for
(i =
0; i < level; i++
)/* increment span for untouched levels 增加跨度*/
for(i = level; i < zsl->level; i++
)/* 更新後退指標 */
x->backward =
(update[0]
== zsl->header)
?null
: update[0]
;if(x->level[0]
.forward)
x->level[0]
.forward->backward = x;
else
zsl->tail = x;
zsl->length++
;return x;
}
命令: zscore key value
從資料結構上可以看到,由於zset中存在乙個dict,獲取乙個value的得分,應該是直接從字典拿就可以了
int
zsetscore
(robj *zobj, sds member,
double
*score)
else
if(zobj->encoding == obj_encoding_skiplist)
else
return c_ok
}
從上面新增元素的過程中可以看到,乙個節點的每一層,都會記錄乙個span,這個span其實就代表了它在這一層和上個節點的間隔。rank的計算就是通過查詢元素的過程中累加這個間隔來得到的
unsigned
long
zslgetrank
(zskiplist *zsl,
double score, sds ele)
if(x->ele &&
sdscmp
(x->ele, ele)==0
)}return0;
}
參考資料
《redis深度歷險》
字母跳一跳
題目 有一無限長的迴圈字母表,任意輸入乙個字母,按照規定時刻進行跳轉,每個時刻跳轉規定的步數,最後顯示跳轉後得到的字母 include using namespace std int main char i word 輸入字母 int i k,i t,n 跳轉步數k,時間t,組數n cin n ch...
微信跳一跳python 微信跳一跳Python
1 安裝python,我用的是python2.7 5.安裝pillow,放在scripts資料夾中,通過 pip install pillow安裝 6.安裝adb工具包,可以直接放在專案 的資料夾裡面,或者放在c盤目錄不過要配置一下環境變數,我這裡是直接放在專案 資料夾中。內建了cmd 命令 7.把...
opencv版跳一跳
主要問題有三個 1.如何獲取遊戲資訊 2.如果對遊戲內容進行解析,提取關鍵資訊 3.如何對遊戲進行操作 下面給出演算法流程,隨後進行細節上的闡述。step1縮小影象尺寸,提取roi區域 step2根據顏色特徵檢測棋子,計算其形心。根據棋子形態固定的特徵,把形心向下移動一定的距離獲取底部中心p1 x0...