深入理解開放尋址法中的三種探測序列

一、引言

開放尋址法是解決散列表中沖突的一種重要方法,當發生沖突(即兩個不同的鍵通過散列函數計算得到相同的散列值)時,它會在散列表中尋找下一個可用的存儲位置。而探測序列就是用于確定在發生沖突后,依次嘗試哪些存儲位置的規則。下面詳細介紹線性探測、二次探測和雙重散列這三種常見的探測序列。
在這里插入圖片描述

二、線性探測(Linear Probing)

1. 原理

線性探測是最簡單的開放尋址法探測序列。當插入一個鍵值對,計算出的散列值對應的存儲位置已被占用時,它會按照順序依次檢查下一個存儲位置(通常是逐個向后檢查),直到找到一個空的存儲位置為止。如果檢查到散列表的末尾還沒有找到空位置,就會從散列表的開頭繼續檢查。其探測函數的公式為:
h ( k , i ) = ( h ′ ( k ) + i ) m o d m h(k, i) = (h'(k)+i) \bmod m h(k,i)=(h(k)+i)modm
其中, h ( k , i ) h(k, i) h(k,i) 是經過 i i i 次探測后得到的存儲位置, h ′ ( k ) h'(k) h(k) 是初始的散列值(即通過散列函數直接計算得到的位置), i i i 是探測次數( i = 0 , 1 , 2 , ? i = 0, 1, 2, \cdots i=0,1,2,?), m m m 是散列表的大小。

2. 示例

假設散列表的大小 m = 10 m = 10 m=10,散列函數 h ′ ( k ) = k m o d 10 h'(k)=k \bmod 10 h(k)=kmod10。現在要依次插入鍵 23 23 23 33 33 33 43 43 43

  • 插入鍵 23 23 23 h ′ ( 23 ) = 23 m o d 10 = 3 h'(23)=23 \bmod 10 = 3 h(23)=23mod10=3,位置 3 3 3 為空,直接插入。
  • 插入鍵 33 33 33 h ′ ( 33 ) = 33 m o d 10 = 3 h'(33)=33 \bmod 10 = 3 h(33)=33mod10=3,位置 3 3 3 已被占用,進行第一次探測 i = 1 i = 1 i=1 h ( 33 , 1 ) = ( 3 + 1 ) m o d 10 = 4 h(33, 1)=(3 + 1)\bmod 10 = 4 h(33,1)=(3+1)mod10=4,位置 4 4 4 為空,插入到位置 4 4 4
  • 插入鍵 43 43 43 h ′ ( 43 ) = 43 m o d 10 = 3 h'(43)=43 \bmod 10 = 3 h(43)=43mod10=3,位置 3 3 3 已被占用,進行第一次探測 i = 1 i = 1 i=1 h ( 43 , 1 ) = ( 3 + 1 ) m o d 10 = 4 h(43, 1)=(3 + 1)\bmod 10 = 4 h(43,1)=(3+1)mod10=4,位置 4 4 4 也被占用,進行第二次探測 i = 2 i = 2 i=2 h ( 43 , 2 ) = ( 3 + 2 ) m o d 10 = 5 h(43, 2)=(3 + 2)\bmod 10 = 5 h(43,2)=(3+2)mod10=5,位置 5 5 5 為空,插入到位置 5 5 5
3. 優缺點
  • 優點:實現簡單,只需要進行簡單的加法和取模運算。
  • 缺點:容易產生“聚集”現象,即連續被占用的存儲位置會越來越長,導致后續插入和查找操作的效率降低。

三、二次探測(Quadratic Probing)

1. 原理

二次探測通過二次函數來確定探測序列,它在發生沖突時,不是像線性探測那樣逐個向后檢查,而是按照二次方的步長來檢查存儲位置。其探測函數的公式為:
h ( k , i ) = ( h ′ ( k ) + c 1 i + c 2 i 2 ) m o d m h(k, i)=(h'(k)+c_1i + c_2i^2) \bmod m h(k,i)=(h(k)+c1?i+c2?i2)modm
其中, c 1 c_1 c1? c 2 c_2 c2? 是正的常數, h ′ ( k ) h'(k) h(k) 是初始散列值, i i i 是探測次數( i = 0 , 1 , 2 , ? i = 0, 1, 2, \cdots i=0,1,2,?), m m m 是散列表的大小。常見的情況是 c 1 = c 2 = 1 c_1 = c_2 = 1 c1?=c2?=1

2. 示例

同樣假設散列表的大小 m = 10 m = 10 m=10,散列函數 h ′ ( k ) = k m o d 10 h'(k)=k \bmod 10 h(k)=kmod10 c 1 = c 2 = 1 c_1 = c_2 = 1 c1?=c2?=1。要插入鍵 23 23 23 33 33 33 43 43 43

  • 插入鍵 23 23 23 h ′ ( 23 ) = 23 m o d 10 = 3 h'(23)=23 \bmod 10 = 3 h(23)=23mod10=3,位置 3 3 3 為空,直接插入。
  • 插入鍵 33 33 33 h ′ ( 33 ) = 33 m o d 10 = 3 h'(33)=33 \bmod 10 = 3 h(33)=33mod10=3,位置 3 3 3 已被占用,進行第一次探測 i = 1 i = 1 i=1 h ( 33 , 1 ) = ( 3 + 1 × 1 + 1 × 1 2 ) m o d 10 = 5 h(33, 1)=(3+1\times1 + 1\times1^2)\bmod 10 = 5 h(33,1)=(3+1×1+1×12)mod10=5,位置 5 5 5 為空,插入到位置 5 5 5
  • 插入鍵 43 43 43 h ′ ( 43 ) = 43 m o d 10 = 3 h'(43)=43 \bmod 10 = 3 h(43)=43mod10=3,位置 3 3 3 已被占用,進行第一次探測 i = 1 i = 1 i=1 h ( 43 , 1 ) = ( 3 + 1 × 1 + 1 × 1 2 ) m o d 10 = 5 h(43, 1)=(3+1\times1 + 1\times1^2)\bmod 10 = 5 h(43,1)=(3+1×1+1×12)mod10=5,位置 5 5 5 也被占用,進行第二次探測 i = 2 i = 2 i=2 h ( 43 , 2 ) = ( 3 + 1 × 2 + 1 × 2 2 ) m o d 10 = 9 h(43, 2)=(3+1\times2 + 1\times2^2)\bmod 10 = 9 h(43,2)=(3+1×2+1×22)mod10=9,位置 9 9 9 為空,插入到位置 9 9 9
3. 優缺點
  • 優點:一定程度上緩解了線性探測的“聚集”問題,因為它的探測步長是變化的。
  • 缺點:仍然可能出現二次聚集的情況,即不同的初始散列值可能會產生相同的探測序列。

四、雙重散列(Double Hashing)

1. 原理

雙重散列使用兩個散列函數來確定探測序列。當發生沖突時,它會根據第二個散列函數計算出的步長來依次檢查存儲位置。其探測函數的公式為:
h ( k , i ) = ( h 1 ( k ) + i × h 2 ( k ) ) m o d m h(k, i)=(h_1(k)+i\times h_2(k)) \bmod m h(k,i)=(h1?(k)+i×h2?(k))modm
其中, h 1 ( k ) h_1(k) h1?(k) 是第一個散列函數計算得到的初始散列值, h 2 ( k ) h_2(k) h2?(k) 是第二個散列函數, i i i 是探測次數( i = 0 , 1 , 2 , ? i = 0, 1, 2, \cdots i=0,1,2,?), m m m 是散列表的大小。為了保證能夠遍歷散列表中的所有位置, h 2 ( k ) h_2(k) h2?(k) 的值必須與 m m m 互質。

2. 示例

假設散列表的大小 m = 10 m = 10 m=10,第一個散列函數 h 1 ( k ) = k m o d 10 h_1(k)=k \bmod 10 h1?(k)=kmod10,第二個散列函數 h 2 ( k ) = 7 ? ( k m o d 7 ) h_2(k)=7-(k \bmod 7) h2?(k)=7?(kmod7)。要插入鍵 23 23 23 33 33 33 43 43 43

  • 插入鍵 23 23 23 h 1 ( 23 ) = 23 m o d 10 = 3 h_1(23)=23 \bmod 10 = 3 h1?(23)=23mod10=3,位置 3 3 3 為空,直接插入。
  • 插入鍵 33 33 33 h 1 ( 33 ) = 33 m o d 10 = 3 h_1(33)=33 \bmod 10 = 3 h1?(33)=33mod10=3,位置 3 3 3 已被占用, h 2 ( 33 ) = 7 ? ( 33 m o d 7 ) = 7 ? 5 = 2 h_2(33)=7-(33 \bmod 7)=7 - 5 = 2 h2?(33)=7?(33mod7)=7?5=2,進行第一次探測 i = 1 i = 1 i=1 h ( 33 , 1 ) = ( 3 + 1 × 2 ) m o d 10 = 5 h(33, 1)=(3+1\times2)\bmod 10 = 5 h(33,1)=(3+1×2)mod10=5,位置 5 5 5 為空,插入到位置 5 5 5
  • 插入鍵 43 43 43 h 1 ( 43 ) = 43 m o d 10 = 3 h_1(43)=43 \bmod 10 = 3 h1?(43)=43mod10=3,位置 3 3 3 已被占用, h 2 ( 43 ) = 7 ? ( 43 m o d 7 ) = 7 ? 1 = 6 h_2(43)=7-(43 \bmod 7)=7 - 1 = 6 h2?(43)=7?(43mod7)=7?1=6,進行第一次探測 i = 1 i = 1 i=1 h ( 43 , 1 ) = ( 3 + 1 × 6 ) m o d 10 = 9 h(43, 1)=(3+1\times6)\bmod 10 = 9 h(43,1)=(3+1×6)mod10=9,位置 9 9 9 為空,插入到位置 9 9 9
3.優缺點
  • 優點:是開放尋址法中最好的方法之一,能更均勻地分布鍵,減少聚集現象,使插入、查找和刪除操作的平均性能更接近理想情況。
  • 缺點:需要設計兩個散列函數,實現相對復雜,計算開銷也會稍微大一些。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【雙指針題目】

雙指針 美麗區間&#xff08;滑動窗口&#xff09;合并數列&#xff08;雙指針的應用&#xff09;等腰三角形全部所有的子序列 美麗區間&#xff08;滑動窗口&#xff09; 美麗區間 滑動窗口模板&#xff1a; int left 0, right 0;while (right < nums.size()) {// 增大…

為什么命令“echo -e “\033[9;0]“ > /dev/tty0“能控制開發板上的LCD不熄屏?

為什么命令"echo -e “\033[9;0]” > /dev/tty0"能控制開發板上的LCD不熄屏&#xff1f; 在回答這個問題前請先閱讀我之前寫的與tty和終端有關的博文 https://blog.csdn.net/wenhao_ir/article/details/145431655 然后再來看這條命令的解釋就要容易些了。 這條…

嵌入式八股文面試題(一)C語言部分

1. 變量/函數的聲明和定義的區別&#xff1f; &#xff08;1&#xff09;變量 定義不僅告知編譯器變量的類型和名字&#xff0c;還會分配內存空間。 int x 10; // 定義并初始化x int x; //同樣是定義 聲明只是告訴編譯器變量的名字和類型&#xff0c;但并不為它分配內存空間…

go-zero學習筆記(三)

利用goctl生成rpc服務 編寫proto文件 // 聲明 proto 使用的語法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可選) option go_package "./demo";// 如需為 .proto 文件添加注釋&#xff0c;請使用 C/C 樣式的 // 和 /* ... */…

Javascript代碼庫-jQuery入門

摘自千鋒教育kerwin的js教程 jQuery 是一個前端庫&#xff0c;也是一個方法庫他里面封裝著一些列的方法供我們使用我們常用的一些方法它里面都有&#xff0c;我們可以直接拿來使用就行了jQuery 之所以好用&#xff0c;很多人愿意使用&#xff0c;是因為他的幾個優點太強大了 優…

【25考研】南開軟件考研復試復習重點!

一、復試內容 復試采取現場復試的方式。復試分為筆試、機試和面試三部分。三部分合計100分&#xff0c;其中筆試成績占30%、機試成績占30%、面試成績占40%。 1.筆試&#xff1a;專業綜合基礎測試 考核方式&#xff1a;閉卷考試&#xff0c;時長為90分鐘。 筆試考查內容范圍…

【最長上升子序列Ⅱ——樹狀數組,二分+DP,純DP】

題目 代碼&#xff08;只給出樹狀數組的&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]為尾的LIS的最大長度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…

012-51單片機CLD1602顯示萬年歷+鬧鐘+農歷+整點報時

1. 硬件設計 硬件是我自己設計的一個通用的51單片機開發平臺&#xff0c;可以根據需要自行焊接模塊&#xff0c;這是用立創EDA畫的一個雙層PCB板&#xff0c;所以模塊都是插針式&#xff0c;不是表貼的。電路原理圖在文末的鏈接里&#xff0c;PCB圖暫時不選擇開源。 B站上傳的…

容器迭代器iterator

文章目錄 1、自定義String實現iterator2、自定義vector實現iterator3、迭代器失效問題 迭代器的功能&#xff1a;提供一種統一的方式&#xff0c;來透明的遍歷容器。 迭代器可以透明的訪問容器內部的元素的值&#xff0c;而無需了解其底層遍歷機制具體是數組的下標還是鏈表的指…

對象的實例化、內存布局與訪問定位

一、創建對象的方式 二、創建對象的步驟: 一、判斷對象對應的類是否加載、鏈接、初始化: 虛擬機遇到一條new指令&#xff0c;首先去檢查這個指令的參數能否在Metaspace的常量池中定位到一個類的符號引用&#xff0c;并且檢查這個符號引用代表的類是否已經被加載、解析和初始化…

傳輸層協議 UDP 與 TCP

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux 目錄 一&#xff1a;&#x1f525; 前置復盤&#x1f98b; 傳輸層&#x1f98b; 再談端口號&#x1f98b; 端口號范圍劃分&#x1f98b; 認識知名端口號 (Well-Know Port Number) 二&#xf…

實驗十一 Servlet(二)

實驗十一 Servlet(二) 【實驗目的】 1&#xff0e;了解Servlet運行原理 2&#xff0e;掌握Servlet實現方式 【實驗內容】 改造實驗10&#xff0c;引入數據庫&#xff0c;創建用戶表&#xff0c;包括用戶名和密碼&#xff1a;客戶端通過login.jsp發出登錄請求&#xff0c;請求…

服務SDK三方新版中央倉庫和私服發布詳解

預備信息Github倉庫發布Gradle版本匹配Gradle項目構建全局變量定義Gradle項目Nexus倉庫配置與發布過程Gradle項目發布至Sonatype中央倉庫配置過程總結當我們在實現一個項目技術總結、工具類封裝或SDK封裝,通常是為了方便開發者使用特定服務或平臺而提供的一組工具和API。您可能…

git 新項目

新項目git 新建的項目如何進行git 配置git git config --global user.name "cc" git config --global user.email ccexample.com配置遠程倉庫路徑 // 添加 git remote add origin http://gogs/cc/mc.git //如果配錯了&#xff0c;刪除 git remote remove origin初…

openmv的端口被拆分為兩個 導致電腦無法訪問openmv文件系統解決辦法 openmv USB功能改動 openmv驅動被更改如何修復

我之前誤打誤撞遇到一次&#xff0c;直接把openmv的全部端口刪除卸載然后重新插上就會自動重新裝上一個openmv端口修復成功&#xff0c;大家可以先試試不行再用下面的方法 全部卸載再重新插拔openmv 要解決OpenMV IDE中出現的兩個端口問題&#xff0c;可以嘗試以下步驟&#x…

利用Python高效處理大規模詞匯數據

在本篇博客中&#xff0c;我們將探討如何使用Python及其強大的庫來處理和分析大規模的詞匯數據。我們將介紹如何從多個.pkl文件中讀取數據&#xff0c;并應用一系列算法來篩選和擴展一個核心詞匯列表。這個過程涉及到使用Pandas、Polars以及tqdm等庫來實現高效的數據處理。 引…

LabVIEW雙光子成像系統:自主創新,精準成像,賦能科研

雙光子成像系統&#xff1a;自主創新&#xff0c;精準成像&#xff0c;賦能科研 第一部分&#xff1a;概述 雙光子成像利用兩個低能量光子同時激發熒光分子&#xff0c;具有深層穿透、高分辨率、低光損傷等優勢。它能實現活體深層組織的成像&#xff0c;支持實時動態觀察&…

Deepseek-R1 和 OpenAI o1 這樣的推理模型普遍存在“思考不足”的問題

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

Vue3學習筆記-Vue開發前準備-1

一、安裝15.0或更高版本的Node.js node -v npm -v 二、創建Vue項目 npm init vuelatest 三、Vue項目結構 node_modules: Vue項目運行的依賴文件public&#xff1a;資源文件夾package.json&#xff1a;信息描述文件

Denavit-Hartenberg DH MDH坐標系

Denavit-Hartenberg坐標系及其規則詳解 6軸協作機器人的MDH模型詳細圖_6軸mdh-CSDN博客 N軸機械臂的MDH正向建模&#xff0c;及python算法_mdh建模-CSDN博客 運動學3-----正向運動學 | 魚香ROS 機器人學&#xff1a;MDH建模 - 哆啦美 - 博客園 機械臂學習——標準DH法和改進MDH…