儲存系統實現 跳躍表實現索引檢索

2021-09-01 17:42:45 字數 1747 閱讀 6869

這一篇是我所實現的乙個通過跳躍表的方式進行索引的檢索。跳躍表的基本思路把單步檢索擴充套件到多步檢索,這樣依賴減少檢索的步驟來公升效能。

先用一張流程圖來闡述我檢索的步驟。

讀索引整體流程圖:

這裡舉乙個具體的例子來說一下檢索的步驟。這裡說一種檢索到的情況,假設整個檔案表10萬條,id是連續自增,檢索id=2312的值

第一步:走快取(這裡是第一次檢索肯定不能命中快取)

第二步:走千步長

1)id=1000,小於2312,繼續

2)id=2000,小於2312,繼續

3) id=3000,大於2312,回退到id=2000的值

第三步:走百步長

1)id=2100,小於2312,繼續

2)id=2200,小於2312,繼續

3)id=2300,小於2312,繼續

4)id=2400,大於2312,回退到id=2300的值

第四步:走十步長

1)id=2310,小於2312,繼續

2)id=2320,大於2312,回退到id=2310的值

第五步:走單步長

1)id=2311,小於2312,繼續

2)id=2312,等於2312,定位到該值,返回資料

從這裡可以看出檢索這樣乙個值,最多隻需要11步,如果快取命中的話只需要一步就找到值,而如果順序檢索的話則需要2312步才能檢索到值,這樣檢索效能得到極大的提公升。

下面把兩****給貼出來。

/**

* 先走一級步長,如果id>key,回退,走二級步長,id>key,一步一步走

* * @param id

* @return

*/public synchronized dataoffset read(int id)

long len;

try }}

system.out.println("[indexfilereader.read]key2="+key);

if (key == 0)

} catch (ioexception e)

return null;

}

這個方法是乙個私有方法,是乙個遞迴方法,走步長的時候通過遞迴走步長。

/**

* @param len

* @param nowstep

* @param id

* @param key

* @param steplevel

* @return 1:代表值還在後面,0:代表該節點即為值,-1:值在前面

* @throws ioexception

*/private int gobysteplevel(long len, long nowstep, int id, int key, long steplevel)

throws ioexception else if (id < key) else

} else else if (id < key) else

return 1;

} else }}

跳躍表原理和實現

有時候會被問到鍊錶如果做到二分搜尋,可能會有部分的人會去把鍊錶中的值儲存到陣列來進行二分,但是如果知道跳躍表的話,那麼這個資料結構就可以解決這個困惑,它允許快速查詢乙個有序連續元素的資料鏈表,它的效率可以做到和二分相同,都是o logn 的平均時間複雜度,其空間複雜度為o n 跳躍列表是在很多應用中...

sphinx中文索引實現中文檢索

介紹 2 sphinx使用的好處 快速檢索使用者需要的模糊資訊 替代like使用 本身還有中文 分詞 的實現,英文分詞通過 空格 區分,中文分詞通過技術實現 例如 匹配 使用習慣 sphinx是專業做資料檢索的乙個技術使用者去sphinx做模糊查詢,查詢 北京 相關的資訊,sphinx把 北京西二旗...

Redis的跳躍表底層實現

跳躍表是一種有序的資料結構,主要用在zset 有序集合 和集群節點的內部資料結構。在大部分情況下,跳躍表的效率可以和平衡樹相媲美,並且因為跳躍表的實現比平衡樹要來得更為簡單,所以有不少程式都使用跳躍表來代替平衡樹。注意mysql的底層採用的是b 樹實現。跳躍表的實現 redis的跳躍表由redis....