雜湊表 字典 二維陣列的區別是什麼?

時間 2021-05-29 22:48:41

1樓:漁歌

這個就是是乙個二維矩陣,或者說是乙個二維座標系,當橫縱座標x,y都確定的話,那座標系上的那個點的位置也就確定。

例如:array[i][j]就是乙個二維陣列當中,第i行第j列儲存的乙個值。

這個就是一種方式吧,對二維矩陣進行使用的一種「方式」。

比較難以區分的是雜湊表和字典,在這個回答中也看到了兩個完全相反的觀點,所以我會去從概念上對我的觀點進行乙個論證。

我們都知道,資料的儲存和檢索是計算機最基本的功能,對於資料的檢索,很容易看出,無非就是兩個方面:

一,是已儲存的資料集合

二,是檢索時提供的資訊

簡單來說就是要在一堆人中找到某乙個人,第乙個就是這一堆人中都有哪些人,第二個就是我們要找的那個人他的獨特資訊(例如姓名或者身份證號一類的),第乙個就是資料結合,第二個檢索時提供的資訊我們稱作檢索碼或者關鍵碼(key)。

檢索碼作為是檢索的基礎,一般具有某種特徵,可能是資料內容本身的一部分,也有可能是專門為資料檢索建立的標籤。(對應著找人的時候,可能通過人臉(人本身的一部分),也可能通過身份證號這種單獨建立的標籤)

現在我們就可以大概知道資料儲存由兩部分組成了:(1)與檢索有關的關鍵碼(2)與之關聯的資料

那現在就可以給出字典的定義了:

字典就是支援基於關鍵碼的資料儲存於檢索的資料結構。也常被稱為查詢表,對映或者關聯表等。

實際上,字典就是兩種功能的統一:

(1)作為一種資料結構,支援在字典裡儲存一批資料項。

(2)提供支援資料檢索的功能,設法維護從關鍵碼找到相關資料的聯絡資訊。

其實到這裡,字典是什麼大概就有答案了,是乙個「思想」去解決關於資料檢索問題。

雜湊法定義了一種將字元組成的字串轉換為固定長度的數值或索引值的方法。(因為轉換出來的雜湊值比用原始資料值短,故而資料庫搜尋的速度會更快),其相應的表,我們就稱為雜湊表(雜湊表)

為什麼要進行這樣的轉換呢?

無非就是檢索資料時的關鍵字不一定是整數,不一定能作為位址,所以我們通過某種方法,將其轉換為可以作為位址或者說下表的數值。

對於雜湊表,我們必不可少的了解一下雜湊法的基本思想:

第一步:在元素關鍵字k(即key)和元素儲存位置p之間建立對應關係f,使得p=f(k),f就是雜湊函式

第二步:在建立雜湊表時,把關鍵字為k的元素直接存入位址為f(k)的單元。(此處f(k)=p)

第三步:當查詢關鍵字為k的元素時,利用雜湊函式計算出該元素的儲存位置p=f(k),從而按關鍵字直接訪問元素。

也就是說,我們現在要做的就是構造雜湊函式,解決衝突,雜湊表查詢。

所以,可以知道兩者的關係:雜湊表是字典的一種實現方式,在python中字典通過雜湊表實現,在c++中map則是通過紅黑樹實現。

在裘宗燕老師的《資料結構與演算法》中有提到:

「雜湊表是實現字典的方式之一」綜上

2樓:

基本上是三個完全不同的東西。字典是偏應用的乙個概念,可以有不同的實現方式; 雜湊表(雜湊表)是一種抽象資料結構,實現上通常使用乙個一維陣列,或者也可能將一維陣列中元素作為煉表表頭(所以實際上是二維陣列); 二維陣列是另一種資料結構。

建議複習/學習雜湊表(雜湊表)原理,書上講的很清楚。

3樓:zpan

不要把抽象的資料結構跟其實現混為一談。

一維陣列,可以是線性表,也可以是向量,也可以是一維矩陣。

二維陣列,可以是二維矩陣,也可以是作為某種其他結構的內部儲存。

雜湊表,可以用來實現鍵值對結構,也可以用來實現集合。而鍵值對或集合也可以用樹來實現。

4樓:czj

可理解為,計算機定址是瞬間的。現實中,在一條街道上,你在1號,要去100號,必須挨家挨戶走過去。但對於計算計,從位址1號到2號,與從1號到100號,幾乎是一回事。

5樓:艾斯威.艾姆

我個人覺得啊,不考慮記憶體不連續帶來的額外開銷。hash表的字典和字首樹的字典在查詢某個存在的元素上消耗時間差不多。畢竟一般而言hash表是有衝突的,通過hashcode定位到乙個格仔之後還是要把單詞和待查詢單詞比較一下。

和直接在字首樹里比較差不多

6樓:VTECISBEST

陣列:陣列就是一塊連續的記憶體空間。這個空間可以放在棧上,可以放在堆上。因為知道元素的大小,再根據下標可以計算到元素在這塊連續的記憶體中的位置。

接著你就可以將你的元素儲存到這塊連續的記憶體的某個位置。這塊連續的記憶體不可能無限的大,所以要根據實際的情況來決定陣列需要多大。並且陣列進行擴充的話,有可能會出現記憶體拷貝的現象。。

因為你沒辦法知道你申請的那塊連續的記憶體空間的後面的記憶體有沒有人使用。

雜湊表(HashSet):

雜湊表也稱雜湊表。原理就是通過雜湊函式(下面使用hash()代替)計算元素的雜湊值。計算出來的雜湊值是32位的。

當然,我們可以把這32位的雜湊值看成乙個無符號的32位整形(下面使用uint32)。最後,我們再建立乙個key型別的陣列(假設大小為8)。這時候,假設我們要新增乙個元素,我們就使用 hash(key)%8 計算出元素應該儲存在陣列中的位置(hash(key)%8的範圍是0-7,不會使陣列越界)。

這時,key就與陣列之間建立了乙個對映關係。當然,不同的key計算(hash(key)%8)出來的結果(陣列的下標)有可能是一樣的。例如先前這個位置已經有元素儲存了,現在又有個元素對映到這個位置,我們怎麼辦?

這種情況我們稱為雜湊衝突,解決的方式有2種。

第1種為鏈式儲存法,也就是陣列的每個元素都是乙個鍊錶,來記錄對映到該下標的所有元素。

第2種為二度雜湊,也就是使用雜湊後加上一定的計算,在當前的位置下再計算另乙個位置出來。

當然,無論哪種,接下來的查詢都是線性的。

雜湊表一般都是HashSet,可以看到只有key,一般都用於儲存元素,並且可以快速的查詢元素在集合中是否存在。

字典(Dictionary):

字典也是雜湊表的一種,跟上面說的雜湊表唯一不同的就是。雜湊表使用hash(key)%8得到陣列儲存位置後,它儲存的是key。。而字典儲存的是value,僅此區別而已。

所以字典是Dictionary。。他的作用就是可以根據key快速的查詢到value。

所以,你的認知是錯誤的。

附上C# Dictionary的實現。

另外,C#的Dictionary是保證插入順序的,其實也比較簡單。因為它維護著2個陣列。key和陣列A建立雜湊關係,陣列A和陣列B建立順序關係。實現真的超簡單。。

7樓:pansz

雜湊表可以理解為一維陣列。因為只是單一的座標。當然如果考慮到雜湊碰撞,理解為二維陣列也無不可。

至於下標1跟10001,這個問題很好。你觀察到了,這樣的陣列會有大量的空洞。這是一種常見的現象。

一維的這種陣列叫做稀疏陣列,二維的這種陣列叫做稀疏矩陣。而對稀疏陣列跟稀疏矩陣都有專門的儲存演算法。

從數學角度,雜湊表可能是個稀疏陣列,或者如果你認為它是二維的話,那就是個稀疏矩陣,如果這樣的話,在訪問時,它往往需要用專門的辦法優化其儲存占用。

不過,在實際的工程中,乙個好的雜湊函式會盡可能的讓其儲存均勻分布,不褪變成稀疏陣列而是保持成為普通陣列,如此一來,可以通過選擇良好的雜湊函式避免儲存稀疏陣列的開銷,這也算是雜湊函式選擇的技巧了。

8樓:

建議看看書再問,這個問題太基礎了,雜湊表是解決查詢問題的,hashcode值就是你要找的資料所在的位置(下標),那個位置的值是value

零維材料和三維材料的區別是什麼?

AnR 真正的零維應該是沒有大小的點,量子點材料是一種準零維材料,因為物質都是有體積的,做不到真正的零維。在材料方面,我們說的低維是指能夠發生量子效應的尺寸,一般來說當材料的某個維度或者某幾個維度尺寸小於20nm就能夠看到比較明顯的量子效應了,我們把這些材料叫做低維量子材料。 這裡說的幾維是奈米材料...

自動化運維 和 手動運維的區別是什麼? 二者運用的環境又有什麼不同?

把原本已知且重複的運維工作內容交給機器來做,就是自動化運維,相對於手動運維而言,主要是工作效率提公升,大幅提高單位時間完成工作量。但是有其顯而易見的侷限,就是應對自由性差,還是要靠手動運維積累的經驗,不能取代手動運維,算是互補關係。 還有我的牛我的歌 自動化運維不容易出錯啊,手動不僅費勁,90 還會...

偽磁場是什麼,它對石墨烯或二維材料的性質有什麼影響

FOREST.Z 根據石墨烯的T B模型 其中 本徵能量 如果 對應就是標準的石墨烯,狄拉克出現在 的位置。如下圖所示 其中箭頭表示贗自旋的分布,這保證了 下面稍稍改動一下 的值,看看狄拉克點和贗自旋怎麼變化。為了簡單令 固定 不同tx下的能量以及贗自旋分布 這其實相當於調節布里淵區的大小,或者說狄...