1. 程式人生 > >MIT演算法導論公開課之第12課 跳躍表

MIT演算法導論公開課之第12課 跳躍表

動態搜尋結構

跳躍表(skip list)
樹堆(treap)
紅黑樹(red black tree)
B樹(B tree)

跳躍表

一種簡單、高效的動態搜尋結構,使用了隨機化演算法。
插入刪除操作的期望的執行時間為O(lgn),並且這種情況有很高的概率(≈1-1/n^α)。

有序的連結串列

有序的連結串列
搜尋一個排好序的連結串列所用時間為O(n),因為連結串列不支援隨機訪問。

改進連結串列

使用兩個有序的連結串列,以加快查詢速度。

改進連結串列

  • Ex(紐約地鐵第七大道線):

    • 站號(快線和慢線):
      14、23、34、42、50、59、66、72
      79、86、96、103、110、116、125
    • 結構示意圖:
      紐約地鐵第七大道線
      L2儲存所有的元素,L1儲存某些子集元素,L1和L2中鍵值相同的元素之間有連結。
  • 查詢過程:

    • Search(x):
      在頂層連結串列L1中從左向右遍歷,直到走過頭,後退一個結點,然後向下繼續走下層連結串列L2直到x。
  • 關於建立L1:
    最好均勻的選取結點作為L1中的結點。
    =>搜尋時間≈|L1|+|L2|/|L1|(|L2|=n)
    最小化|L1|+n/|L1|:
    當|L1|=n/|L1|能得到最小值,此時|L1|=n^(1/2),最小值為2·n^(1/2)。
    關於建立L1

  • 一般化分析:
    使用2個有序的連結串列,執行時間為O(2·n^(1/2))。
    使用3個有序的連結串列,執行時間為O(3·n^(1/3))。
    使用k個有序的連結串列,執行時間為O(k·n^(1/k))。
    k選取為lgn時,執行時間為O(lgn·n^(1/lgn))=O(lgn·2^(lgn/lgn))=O(2lgn)。
    一共有lgn層,所有相鄰兩層比值的乘積應該等於n,即r^(lgn)=n=>r=2。
    相鄰兩層比值為2。
    一般化分析

跳躍表

實現插入和刪除,並能儘量好的維護這個結構,使搜尋代價仍為O(lgn)。
  • 跳躍表操作:
Insert(x):
    確定x在底層連結串列中的位置,把x插入到此位置。
    確定是否將該元素提升到上一層:
        拋一枚硬幣,正面就提升到上一層連結串列,並再拋一次硬幣,反面就結束操作。
        注:為保證能從多層連結串列的左上角開始操作,將每一層開始結點值設為負無窮。
高度提升到lgn以上的概率為(1/2)^lgn=1/(2^lgn)=1/n。
演算法對輸入序列無要求,但這個資料結構執行速度快的高概率要求每次隨機拋硬幣。
delete(x):
    在每一層中找到x,並刪除。
  • 跳躍表特性:
    跳躍表特性

相關推薦

MIT演算法導論開課12 跳躍

動態搜尋結構 跳躍表(skip list) 樹堆(treap) 紅黑樹(red black tree) B樹(B tree) 跳躍表 一種簡單、高效的動態搜尋結構,使用了隨機化演算法。 插入刪除操作的期望的執行時間為O(lgn),並且這種情

MIT演算法導論開課18 最短路徑演算法、Bellman和差分約束系統

Bellman-Ford 演算法 圖G=(V,E),選取s∈V作為圖的原點,此演算法可計算最短路徑δ(s,v)(v∈V)或報告出圖中存在負權值的環路。 Exercise 在路徑中存在負權值的環路時,將δ(s,v)設定為-∞。 Bellman-F

MIT演算法導論開課15 動態規劃、最長公共子序列

動態規劃(Dynamic programming) 動態規劃是一種設計技巧,而不是一種特定的演算法,就像分治法一樣。 最長公共子序列(Longest common subsequence)問題 有兩個序列,序列x[1~m],序列y[1~n],找到它們的最長

MIT演算法導論開課3 分治法

分治法 1. 將一個問題劃分為若干個子問題。 2. 遞迴的解決每一個子問題。 3. 將子問題的解合併成為整個大問題的解。 歸併排序 1. 將一個數組分為兩個子陣列。 2. 遞迴的對每一個子陣列進行排序。 3. 合併兩個有序子陣列。 執行

MIT演算法導論開課八講全域雜湊和完全雜湊

全域雜湊            對於任意雜湊函式而言,都存在一個不好的健集,使得所有的健都會雜湊到同一個槽裡去,那麼如何解決這種情況呢?如何防止對某個鍵集永遠有較差的表現?如何防止競爭對手使用這個鍵集來降低你的效能表現? 一個詞解決這個問題 —— 隨機! 全域雜湊的方法

【問鏈-EOS開課 EOS 資料庫與持久化 API(一)

在 EOS 中,智慧合約執行完畢後,所佔用的記憶體會釋放。程式中的所有變數都會丟失。如果智慧合約裡要持久地記錄資訊,比如遊戲智慧合約要記錄每位使用者遊戲記錄,本次合約執行完畢後資料不能丟失,就需要將資料儲存到 EOS 資料庫中。與資料庫互動的 API 被官方成為 Persistence API,中文可以叫做持

【問鏈-EOS開課 EOS 資料庫與持久化 API(二)

上次的文章詳細講解了 EOS 資料庫的架構,本文將以官方示例為基礎,詳解 EOS 資料庫的開發實戰。 基本步驟 在智慧合約裡與 EOS 資料庫互動,首先要定義儲存的資料: 定義物件:具體就是定義一個 C++ 類或者 C++ 結構體,資料表就由一個個物件組成。 定

【問鏈-EOS開課 EOS 錯誤碼整理

EOS 目前大約有180種錯誤型別,雖然有錯誤碼,但是還是很籠統的,具體的報錯資訊還得看detail裡面的內容 一、常見的錯誤碼以及issue上對應的錯誤記錄 3010001 Invalid name 賬戶名格式1-12位(a-z,1-5,“.” ) 且”.”不

【問鏈-EOS開課十三 EOS外掛機制深入解析

外掛體系 EOS外掛由三層類來實現。 最頂層是抽象類abstract_plugin,定義了外掛的基本介面。 中間層是外掛模板類plugin,主要用來解決外掛之間依賴呼叫。 最底層是具體外掛類,專注單個外掛的業務功能實現。 nodeos程序啟動後第一步是註冊外掛

韋東山嵌入式Linux學習筆記——128節 字元裝置驅動程式定時器防抖動

注:本文部分內容摘自《魚樹學員筆記》。 當按鍵按得比較快的時候,這裡出現了兩次中斷值,也即產生了抖動。 這裡產生了“抖動”,按鍵是機械開關,按下鬆開時裡面的金屬彈片可能抖動了好幾次。這種抖動產生了多次“脈衝”導致多次中斷。 方法: 使用定時器來防抖動。

機器學習開課筆記九周大數據梯度下降算法

機器學習 nbsp gradient min 三種 依次 再看 獲得 mini 一,隨機梯度下降法(Stochastic Gradient Descent) 當訓練集很大且使用普通梯度下降法(Batch Gradient Descent)時,因為每一次\(\theta\)

MIT線性代數開課學習筆記16~20

ots 正交 其中 圖片 線性 現在 出現 正交化 play 十六、投影矩陣和最小二乘 給出\(n\)組\(m-1\)個自變量的數據點(用\(n\times m\)大小的矩陣\(A\)表示,其中第一列均為1,代表常數項),以及它們的真實取值(用n維列向量\(b\)表示),現

MIT線性代數開課學習筆記21~25

幾何 教材 線性 學習 標量 求解 一個 spa lambda 二十一、特征值和特征向量 1、特征值和特征向量的定義、求解 給出\(n\)階方陣\(A\),若存在\(n\)維列向量\(x\)和標量\(\lambda\),有\(Ax=\lambda x\),則\(x\)是\(

MIT線性代數開課學習筆記31~35

圖像 .com 小波 要求 小波變換 ron 現在 alpha times 三十一、線性變換及對應矩陣 定義線性變換: \[T:\mathbb{R}^n\to \mathbb{R}^m\] 表示的是n維列向量到m維列向量的映射,該映射是可以線性組合的,即: \[T(ax+b

MIT演算法導論三節筆記——分治思想

這一節主要講了分治思想,首先我應該向大家推薦兩本參考書:《演算法導論》和《演算法概論》,很多講課內容都在這兩本書上,但不限於這兩本書。 這次視訊中設計的演算法如下: 歸併排序 折半查詢 求X的冪 斐波那契數,包括1. 遞迴演算法;2. 用儲存每一個計算過的斐波那契數的方式

MIT演算法導論——七講.雜湊

從作用上來講,構建雜湊表的目的是把搜尋的時間複雜度降低到O(1),考慮到一個長度為n的序列,如果依次去比較進行搜尋的話,時間複雜度是θ(n),或者對其先進行排序然後再搜尋會更快一些,但這兩種方法都不是最快的方法。 第一個話題: 計算機裡面所有儲存的內容都是數字,因此我

開課 tony 電子時鐘 (課堂筆記)

des %x 行程 設置背景圖片 自動填充 star init qpi RF # tony 之電子時鐘from PyQt5.QtWidgets import QApplication, QWidget, QLCDNumber, QDesktopWidget, QVBox

《Java從小白到大牛》12章 繼承與多態

數值類型 大牛 聲明 清華 school 重寫 協作圖 類型變量 caf 《Java從小白到大牛》紙質版已經上架了!!! 類的繼承性是面向對象語言的基本特性,多態性前提是繼承性。Java支持繼承性和多態性。這一章討論Java繼承性和多態性。 Java中的繼承 {#java}

【問鏈-EOS開課十五 用cleos註冊EOS主網賬戶、投票和發幣

第一步: 安裝docker https://www.docker.com/community-edition #install docker for CentOS. (其他作業系統看上面連結) sudo yum install -y yum-utils device-mapper-

【問鏈-EOS開課十四 EOS從單簽名到多簽名

一、基本知識 賬戶:是儲存在區塊鏈上的人們可識別的ID。 許可權:每個事務都有,它是由已配置許可的賬戶所評估的。 閾值:每個被命名的許可權都有一個有效範圍,必須滿足是在許可下的一個簽名事務,將被視為有效。 簽名:事務的簽名是通過利用一個客戶端來執行,該客戶端擁有一個已載入並已解鎖的錢包。