Hash演算法小談

2021-09-01 13:52:18 字數 2700 閱讀 3638

hash演算法小談

一、初識hash:

一直都只知道hash是一種演算法,但是具體是什麼一直都是模糊的概念。之前知道object類中有hashcode()方法,此方法返回該物件的雜湊碼值。而雜湊碼值物件的記憶體位址。hash其實就是一種儲存資料的結構,一般來說我們所了解熟

悉的結構有:陣列、鍊錶、佇列、map、樹、圖等。但最基本的兩種結構是陣列和鍊錶,可以由陣列和鍊錶組合成不同的新的結構,至於是「陣列+陣列」、「鍊錶+鍊錶」還是「陣列+鍊錶」就要看你的需求是什麼,想要達到什麼樣的儲存效果。

二、hash是什麼?

現在我理解的hash就是一種儲存資料的結構,這種結構是「陣列+鍊錶」形式的一種結構。

三、為什麼要使用hash?

這種結構既有陣列的優點又有鍊錶相對應的一些優點,對大量資料的儲存很有優勢,增刪改查相對而言都比較方便。hash中的演算法可以使自己設定的,也可以使用系統中提供的。一般來說都是根據自己的需求來設定自己所需要的儲存資料的結構,即:設定自己所需要的hash結構。

四、hash的建立:

首先我們建立乙個模型:乙個長度為n的陣列,每乙個陣列元素存的是一段鍊錶的頭節點,鍊錶長度為m(每個鍊錶的m值相互無關),而鍊錶的每個節點儲存的則是乙個add類的物件,這樣無形中就形成了乙個二維的資料儲存結構,我們稱之為陣列加鍊表模型。假如有0~99這100個數需要存到這種模型中,我們可以讓陣列的第乙個元素專門儲存第一位為0的數(即一位數),鍊錶長度為10,儲存的資料分別為0、1、2、3、4、5、6、7、8、9;第二個元素儲存第一位為1的數……以此類推,直到全部存進。現在我們要查詢65,假設陣列名為a,我們只需要找到a[6],然後再迴圈查詢鍊錶的下乙個節點,直到找到65,只需要5次。而用鍊錶查詢,則需要查詢65次。當然如果用陣列定義的話直接a[65]就能得到,但是如果需要在65與66之間再插入乙個值就比較麻煩了,而上述陣列加鍊表模型依然能輕鬆的解決這一問題。

hash中有「閥值」這個概念,至於「閥值」是什麼都有不同的理解,一般的理解是:所有元素的個數與雜湊表位置的比值。對於「閥值」值的設定也是由自己的需求設定的,系統提供的「閥值」大小是:0.75,一般來說想要達到結構空間上的效率就盡量將「閥值」設定得大些,想要達到時間上的效率就將「閥值」設定得小些,一般都是將閥值得達到空間與時間的均衡。當鍊表節點過多,也就是超過閥值時,就需要擴充陣列,即需要再雜湊,也就是rehash。再雜湊後各個資料的儲存位置都發生了改變,雜湊結構和原來的是完全不一樣的。自己設定一種簡單的hash演算法(規則)用來對資料進行儲存,個人認為此法是用來得到元素儲存在陣列的那乙個位置的值。

* hash演算法

* @param value

* @return

*/int hash(int value)

return sum%prime;

}

* 

* @param element:陣列的第幾號元素

* @param adder:要新增的元素

* @param array:新增至的陣列

* @return:array

*/ add addto(int element,add adder,add array)

//若陣列為空

else if(array[element]==null)

else

adder.setnextadder(adder);

adder.setlastadder(adder1);

if (count > array.length * 0.75)

} return array;

}/**

* 當陣列需要擴張時的重新雜湊方法

* * @param array

*/

add rehash(add array) catch (nullpointerexception npe)

} }

for (int i = 0; i < list.size(); i++)

array = rearray;

return array;

}

五、hash各個演算法的實現(這裡僅實現了增和查):

/**

* 新增元素的方法

* @param dataarray

*/public void add(add dataarray)

checkadder=checkadder.getnextadder();

}adder=new add(value);

dataarray=addto(element,adder,dataarray);

}th.setflag(false);

trycatch(exception ef)

search(dataarray);

}

* 查詢元素的方法

* @param dataarray

*/public void search(add dataarray)

}else

sum+=num;

system.out.println("第"+i+"個元素的鍊錶中共有"+num+"個物件");

}system.out.println("共有"+sum+"個物件");

}

演算法小談 遞迴

基本概念 乙個函式呼叫它自身,就是遞迴 如求n的階乘的遞迴 includeusing namespace std int factorial int n int main 這裡在求n的階乘時,我們就用到遞迴的概念。假如n 3,那麼函式首先呼叫factorial 3 將函式呼叫壓入棧,繼續呼叫fact...

小談C STL演算法 sorting

c stl 也提供了排序演算法 sorting algorithms 排序就是將一組無序的序列變成有序的序列.首先介紹一下關於堆排序的內容 下面就是關於堆排序的一些演算法函式 push heap 元素入堆 就是將乙個元素置入已構成的堆的迭代器區間中 使得擴充套件的乙個元素的區間元素仍構成堆 會改變迭...

hash表 hash演算法

概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...