跳躍表是什麼

2021-09-25 15:38:00 字數 1370 閱讀 5962

加入我們要開發乙個遊戲裡面類似拍賣行的搜尋功能,我們要支援輸入道具名稱的精準查詢和不輸入名稱的全量查詢.

拍賣行商品數量幾十萬件,對應資料庫商品表的幾十萬條記錄,按照商品名稱精準查詢好辦,可以直接衝資料庫查出來,

如果沒有商品名稱的全量查詢怎麼辦?總不能把資料庫所有記錄查出來,還要支援不同欄位的排序.

拍賣行商品列表是線性的,最容易表達線性結構的是陣列和鍊錶,但是陣列使用二分查詢可以最快定位,時間複雜度o(logn)<

插入過程的時間複雜度o(n);鍊錶無法使用二分查詢,查詢的時間複雜度是o(n),插入的時間複雜度o(1),因此總體時間複雜度是o(n).

所以用到了跳躍表,跳躍表(skiplist)是一種基於有序鍊錶的擴充套件,簡稱調表.

怎麼快速查詢到乙個有序鍊錶的某一結點?

既然是鍊錶,就不能用二分查詢,我們可以利用類似索引的思想,提取鍊錶中部分關鍵節點.

確定新節點在關鍵節點中的位置,就可以回到原鍊錶,迅速定位到對應的位置插入.

既然提出了一層關鍵節點作為索引,那我們為何不能從索引中進一步提取,2層,3層索引.這樣當節點很多的時候,比較次數會減少到原來的四分之一,八分之一.

提取的極限是同一層只有兩個節點的時候,因為乙個節點沒有比較的意義了.

當大量的新節點通過逐層比較,最終插入到原鍊錶之後,需要從新節點中選取一部分提取到上一層,這個是否提取的策略是拋硬幣.

為什麼拋硬幣?因為跳躍表刪除和新增的節點是不可**的,很難用一種有效的演算法來保證跳表的索引分布始終均勻.

跳躍表的插入操作步驟:

1.新節點和各層索引節點逐一比較,確定原鍊錶的插入位置,時間複雜度和陣列的二分查詢一樣o(logn)

2.把索引插入到原鍊錶,時間複雜度o(1)

3.利用拋硬幣的隨機方式,決定新節點是否提公升為上一級索引,結果為"正"提公升並繼續拋硬幣,結果為"負"則停止,時間複雜度o(logn)

總體上,跳躍表插入操作的時間複雜度o(logn),資料結構所佔空間是2n,空間複雜度o(n)

跳躍表的刪除比較簡單,從索引層找到要刪除的節點,逐層刪除相同節點,如果某一層刪除後只剩下乙個節點,那麼整層都可以刪除了.

跳躍表刪除操作步驟:

1.自上而下,查詢第乙個出現節點的索引,逐層找到每一層對應節點,時間複雜督導o(logn)

2.刪除每一層查詢到的節點,如果該層只剩下1個節點,刪除整個一層(原鍊錶除外),時間複雜度o(logn)

總體上,跳躍表刪除操作的時間複雜度是o(logn)

跳躍表的有點事維持結構平衡的成本比較低,完全依靠隨機

二叉查詢樹在多次插入刪除後,需要rebalance來重新調整結構平衡

跳躍表應用:1.redis中的sorted-set這種有序集合,正是對於跳躍表的改進和應用

2.關聯式資料庫維護有序的記錄集合使用的是b+樹

參考:

dual表是什麼表

dual是乙個虛擬表,用來構成select的語法規則,oracle保證dual裡面永遠只有一條記錄。我們可以用它來做很多事情,如下 1 檢視當前使用者,可以在 sql plus中執行下面語句 select user from dual 2 用來呼叫系統函式 select to char sysdat...

表空間是什麼

表空間實質是組織資料檔案的一種途徑,oracle就是通過表空間這個資料庫物件完成對資料的組織的。在將資料插入oracle資料庫之前,必須首先建立表空間,然後將資料插入表空間的乙個物件中。解釋資料庫 表空間 資料檔案 表 資料檔案的最好辦法就是想象乙個裝滿東西的櫃子。資料庫其實就是櫃子,櫃中的抽屜是表...

sql Oracle 驅動表是什麼?

1.什麼是驅動表?通俗的講就是先從哪個表開始檢索啦,找到好的驅動表語句的優化就成功一半了 eg select from a,b where a.id b.id and a.姓名 美格瑞恩 and b.性別 女 在a,b表同等數量級的情況下顯然用a表做為驅動表比較好因為姓名相對於性別來說可以過濾掉更多...