詳解如何使用java實(shí)現(xiàn)Open Addressing
你好! 我們這里總共向您提供三種open addression的方法,分別為linear probing、quadratic probing和double hashing。
Linear Probing
Linear probing是計(jì)算機(jī)程序解決散列表沖突時所采取的一種策略。散列表這種數(shù)據(jù)結(jié)構(gòu)用于保存鍵值對,并且能通過給出的鍵來查找表中對應(yīng)的值。Linear probing這種策略是在1954年由Gene Amdahl, Elaine M. McGraw,和 Arthur Samuel 所發(fā)明,并且最早于1963年由Donald Knuth對其進(jìn)行分析。
- 假設(shè)A是哈希表的一個容量N為15的數(shù)組;
- 將Keys(5、9、12、24、31、40、47、53、62、71)使用linear probing按照順序依次插入到數(shù)組中。
public static void main(String[] args) {
int N = 15;
int[] A = new int [N];
int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
for (int i = 0; i < Keys.length; i++) {
int j = 0;
int Position = Keys[i] % N;
while (A[Position] != 0) {
j = j + 1;
Position = Keys[i] % N + j;
}
A[Position] = Keys[i];
}
for (int i = 0; i < A.length; i++) {
System.out.println(A[i]);
}
}
Quadratic Probing
Quadratic probing是計(jì)算機(jī)程序解決散列表沖突時所采取的另一種策略,用于解決散列表中的沖突。Quadratic probing通過獲取原始哈希索引并將任意二次多項(xiàng)式的連續(xù)值相加,直到找到一個空槽來進(jìn)行操作。
- 假設(shè)A是哈希表的一個容量N為15的數(shù)組;
- 將Keys(5、9、12、24、31、40、47、53、62、71)使用quadratic probing按照順序依次插入到數(shù)組中。
public static void main(String[] args) {
int N = 15;
int[] A = new int [N];
int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
for (int i = 0; i < Keys.length; i++) {
int j = 0;
int Position = Keys[i] % N;
while (A[Position] != 0) {
j = j + 1;
Position = (Keys[i] % N + j*j) % N;
}
A[Position] = Keys[i];
}
for (int i = 0; i < A.length; i++) {
System.out.println(A[i]);
}
}
Double Hashing
Double hashing是計(jì)算機(jī)程序解決散列表沖突時所采取的另一種策略,與散列表中的開放尋址結(jié)合使用,通過使用密鑰的輔助哈希作為沖突發(fā)生時的偏移來解決哈希沖突。具有open addressing的double hashing是表上的經(jīng)典數(shù)據(jù)結(jié)構(gòu)。
- 假設(shè)A是哈希表的一個容量N為15的數(shù)組;
- 將Keys(5、9、12、24、31、40、47、53、62、71)使用double hashing(我們假設(shè)h'(k)為13 - (k mod 13))按照順序依次插入到數(shù)組中。
public static void main(String[] args) {
int N = 15;
int[] A = new int [N];
int[] Keys = {5, 9, 12, 24, 31, 40, 47, 53, 62, 71};
for (int i = 0; i < Keys.length; i++) {
int j = 0;
int Position = (Keys[i] % N + (13 - (Keys[i] % 13)) * j) % N;
while (A[Position] != 0) {
j = j + 1;
Position = (Keys[i] % N + (13 - (Keys[i] % 13)) * j) % N;
}
A[Position] = Keys[i];
}
for (int i = 0; i < A.length; i++) {
System.out.println(A[i]);
}
}
到此這篇關(guān)于詳解如何使用java實(shí)現(xiàn)Open Addressing的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)Open Addressing內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java開發(fā)深入分析講解二叉樹的遞歸和非遞歸遍歷方法
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點(diǎn))按分支關(guān)系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機(jī)構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法2022-05-05
spring?boot集成WebSocket日志實(shí)時輸出到web頁面
這篇文章主要為大家介紹了spring?boot集成WebSocket日志實(shí)時輸出到web頁面展示的詳細(xì)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
解決IDEA2020 創(chuàng)建maven項(xiàng)目沒有src/main/java目錄和webapp目錄問題
這篇文章主要介紹了IDEA2020 創(chuàng)建maven項(xiàng)目沒有src/main/java目錄和webapp目錄問題解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
SpringSecurity獲取當(dāng)前登錄用戶的信息的幾種方法實(shí)現(xiàn)
本文主要介紹了SpringSecurity中獲取當(dāng)前登錄用戶信息的多種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Java代理模式(Proxy)實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java代理模式(Proxy)實(shí)現(xiàn)的相關(guān)資料,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過引入代理對象來控制對目標(biāo)對象的訪問,代理模式的優(yōu)點(diǎn)包括職責(zé)清晰、擴(kuò)展性好、保護(hù)目標(biāo)對象和增強(qiáng)功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
spring boot空屬性賦值問題與aspect日志實(shí)現(xiàn)方法
這篇文章主要介紹了spring boot空屬性賦值問題與aspect日志實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

