hashtable是什麼,HashTable有什麼用

時間 2021-08-30 09:51:48

1樓:匿名使用者

hashtable 類基於 idictionary 介面,因此該集合中的每一元素是鍵和值對。

hashtable 由包含集合元素的儲存桶組成。儲存桶是 hashtable 中各元素的虛擬子組,與大多數集合中進行的搜尋和檢索相比,它可令搜尋和檢索更簡單、更快速。每一儲存桶都與一個雜湊**關聯,該雜湊**是使用雜湊函式生成的並基於該元素的鍵。

雜湊函式是基於鍵返回數值雜湊**的演算法。鍵是正被儲存的物件的某一屬性的值。雜湊函式必須始終為相同的鍵返回相同的雜湊**。

一個雜湊函式能夠為兩個不同的鍵生成相同的雜湊**,但從雜湊表檢索元素時,為每一唯一鍵生成唯一雜湊**的雜湊函式將令效能更佳。

在 hashtable 中用作元素的每一物件必須能夠使用 object.gethashcode 方法的實現為其自身生成雜湊**。但是,還可以通過使用 hashtable 建構函式(該建構函式將 ihashcodeprovider 實現作為其引數之一接受),為 hashtable 中的所有元素指定一個雜湊函式。

在將一個物件新增到 hashtable 時,它被儲存在儲存桶中,該儲存桶與匹配該物件的雜湊**的雜湊**關聯。當在 hashtable 內搜尋一個值時,為該值生成雜湊**,並且搜尋與該雜湊**關聯的儲存桶。

例如,一個字串的雜湊函式可以採用該字串中每一字元的 ascii **並它們新增到一起來生成一個雜湊**。字串「picnic」將具有與字串「basket」的雜湊**不同的雜湊**;因此,字串「picnic」和「basket」將處於不同的儲存桶中。與之相比,「stressed」和「desserts」將具有相同的雜湊**並將處於相同的儲存桶中。

using system;

using system.collections;

public class sampleshashtable

", myht.count );

console.writeline(myht[ "first "]);//***也可以這它!

console.writeline( " keys and values: " );

printkeysandvalues( myht );

} public static void printkeysandvalues( hashtable mylist )

:\t ", myenumerator.key, myenumerator.value); } }

2樓:吻雨

雜湊表(hashtable)又稱為「散置」,hashtable是會根據索引鍵的雜湊程式**組織成的索引鍵(key)和值(value)配對的集合。hashtable 物件是由包含集合中元素的雜湊桶(bucket)所組成的。而bucket是hashtable內元素的虛擬子群組,可以讓大部分集合中的搜尋和獲取工作更容易、更快速。

3樓:

在c#中是一個類。

這個類實現一個雜湊表,該雜湊表將鍵對映到相應的值。任何非 null 物件都可以用作鍵或值。為了成功地在雜湊表中儲存和獲取物件,用作鍵的物件必須實現 hashcode 方法和 equals 方法。

參考

4樓:匿名使用者

hashtable是個集合,通過鍵值對的方式來儲存資料,它通過add方法來新增add(object key,object value);

hashtable有什麼用?

5樓:匿名使用者

這個應該從物理來模型自和概念模型來說明比較bai好。hashtable這種資料du

結構屬於概念層的抽象數zhi據結構,定義

dao了一套adt,但是底層用什麼實現則取決於效率和方便。

hash結構還是很有用的,很多語言都提供了這種資料型別。當然,沒有什麼是不可替代的,但誰會傻比到有封裝過的hashmap這種適合問題解決的資料結構反而去用紅黑樹湊合呢?

什麼是雜湊表?特點是什麼

6樓:匿名使用者

簡單說就是按照雜湊函式關係建立的表

具體內容請參考資料結構相關知識~

下面引用一些別的地方

1 基本原理

我們使用一個下標範圍比較大的陣列來儲存元素。可以設計一個函式(雜湊函式),使得每個元素的關鍵字都與一個函式值(即陣列下標)相對應,於是用這個陣列單元來儲存這個元素;也可以簡單的理解為,按照關鍵字為每一個元素"分類",然後將這個元素儲存在相應"類"所對應的地方。

但是,不能夠保證每個元素的關鍵字與函式值是一一對應的,因此極有可能出現對於不同的元素,卻計算出了相同的函式值,這樣就產生了"衝突",換句話說,就是把不同的元素分在了相同的"類"之中。後面我們將看到一種解決"衝突"的簡便做法。

總的來說,"直接定址"與"解決衝突"是雜湊表的兩大特點。

2 函式構造

建構函式的常用方法(下面為了敘述簡潔,設 h(k) 表示關鍵字為 k 的元素所對應的函式值):

a) 除餘法:

選擇一個適當的正整數 p ,令 h(k ) = k mod p

這裡, p 如果選取的是比較大的素數,效果比較好。而且此法非常容易實現,因此是最常用的方法。

b) 數字選擇法:

如果關鍵字的位數比較多,超過長整型範圍而無法直接運算,可以選擇其中數字分佈比較均勻的若干位,所組成的新的值作為關鍵字或者直接作為函式值。

3 衝突處理

線性重新雜湊技術易於實現且可以較好的達到目的。令陣列元素個數為 s ,則當 h(k) 已經儲存了元素的時候,依次探查 (h(k)+i) mod s , i=1,2,3…… ,直到找到空的儲存單元為止(或者從頭到尾掃描一圈仍未發現空單元,這就是雜湊表已經滿了,發生了錯誤。當然這是可以通過擴大陣列範圍避免的)。

4 支援運算

雜湊表支援的運算主要有:初始化(makenull)、雜湊函式值的運算(h(x))、插入元素(insert)、查詢元素(member)。

設插入的元素的關鍵字為 x ,a 為儲存的陣列。

初始化比較容易,例如

const empty=maxlongint; // 用非常大的整數代表這個位置沒有儲存元素

p=9997; // 表的大小

procedure makenull;

var i:integer;

begin

for i:=0 to p-1 do

a[i]:=empty;

end;

雜湊函式值的運算根據函式的不同而變化,例如除餘法的一個例子:

function h(x:longint):integer;

begin

h:= x mod p;

end;

我們注意到,插入和查詢首先都需要對這個元素定位,即如果這個元素若存在,它應該儲存在什麼位置,因此加入一個定位的函式 locate

function locate(x:longint):integer;

var orig,i:integer;

begin

orig:=h(x);

i:=0;

while (ix)and(a[(orig+i)mod s]<>empty) do

inc(i);

//當這個迴圈停下來時,要麼找到一個空的儲存單元,要麼找到這個元

//素儲存的單元,要麼表已經滿了

locate:=(orig+i) mod s;

end;

插入元素

procedure insert(x:longint);

var posi:integer;

begin

posi:=locate(x); //定位函式的返回值

if a[posi]=empty then a[posi]:=x

else error; //error 即為發生了錯誤,當然這是可以避免的

end;

查詢元素是否已經在表中

procedure member(x:longint):boolean;

var posi:integer;

begin

posi:=locate(x);

if a[posi]=x then member:=true

else member:=false;

end;

這些就是建立在雜湊表上的常用基本運算。

7樓:匿名使用者

雜湊雜湊值表,一般是用來快速計算雜湊值的,就是sha-1

什麼是什麼是什麼是什麼造句,什麼是什麼,什麼也是什麼造句

日子像一條小溪,汩汩 g 地向前流去.日子像一雙筷子,夾著酸甜苦辣的現實.日子如 像一團麻,總有那解不開的疙疙瘩瘩。日子如 像水,掬不起來,只能眼睜睜的看它流走.語文是無色無味的清水,讓人反覆咀嚼。語文是清香苦澀的綠茶,讓人細細品味。語文是惟妙惟肖的國畫,讓人賞心悅目。語文是朗朗上口的詩句,讓人陶冶...

是什麼?是什麼?還是什麼造句,用是什麼是什麼還是什麼造句

1 小明的學習成績優秀,是刻苦?是努力?還是日積月累的沉澱?2 這種衣料很難分辨出是棉布?是麻布?還是化纖布?3 在你的學生時代中,你最喜歡的,是懵懵懂懂地小學?是青青澀澀地中學?還是真真實實地大學?4 迎面飄來的花香來自 是玫瑰?是月季?還是海棠?5 你最喜歡的季節,是春回大地 萬物復甦的春天,是...

父母的愛是什麼是什麼是什麼是什麼

黃土當如何 這個問題看上去很簡單,實際上卻有些難。在這年頭做父母的人還不如做子女的人。在子女眼中,父母是偉大的,是了不起的。對自己有大恩的,沒有他們就沒有我。但是在父母眼中,孩子是什麼,傳宗接代的工具。被父母逼的沒辦法敷衍父母的工具,一個長期的保險,一個低成本的投資。父母生孩子很少是因為愛孩子而生的...