亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哈希表是如何工作的?

哈希表是如何工作的?

皈依舞 2019-07-04 18:15:47
哈希表是如何工作的?我在尋找一個關于哈希表是如何工作的解釋-用簡單的英語來解釋像我這樣的傻瓜!例如,我知道它接受鍵,計算散列(我正在尋找如何解釋),然后執行某種模塊化來計算它在存儲值的數組中的位置,但這就是我的知識停止的地方。有人能澄清這個過程嗎?編輯:我不是專門問哈希碼是如何計算的,而是對哈希表是如何工作的進行了概述。
查看完整描述

3 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

用法和靈芝:

  1. 散列表

    用于快速存儲和檢索數據(或記錄)。
  2. 記錄存儲在

    使用

    散列鍵

  3. 散列鍵

    通過將散列算法應用到選定的值(

    鑰匙

    值)包含在記錄中。所選值必須是所有記錄的公共值。
  4. 可以有多個按特定順序組織的記錄。

真實世界的例子:

哈希公司,成立于1803年,缺乏任何計算機技術,總共有300個文件柜,為他們的大約30,000名客戶保存詳細的信息(記錄)。每個文件夾都清楚地標識了其客戶端編號,這是一個從0到29,999之間的唯一編號。

當時的檔案辦事員必須迅速為工作人員提取和儲存客戶記錄。工作人員決定,使用散列方法存儲和檢索其記錄將更為有效。

若要歸檔客戶記錄,歸檔辦事員將使用寫入文件夾上的唯一客戶編號。使用此客戶端編號,它們將對散列鍵到300,以確定它包含在其中的文件柜。當他們打開文件柜時,他們會發現里面有許多按客戶編號訂購的文件夾。在確定正確的位置后,他們就會簡單地溜進去。

為了檢索客戶記錄,檔案辦事員將在一張紙條上得到客戶號碼。使用此唯一客戶端編號(散列鍵),他們會調整它300,以確定哪個文件柜有客戶文件夾。當他們打開文件柜時,他們會發現里面有許多按客戶編號訂購的文件夾。通過搜索記錄,他們會快速找到客戶端文件夾并檢索它。

在我們的現實世界中,我們的文件柜而我們記錄文件文件夾.


需要記住的一件重要的事情是,計算機(及其算法)處理數字比處理字符串更好。因此,使用索引訪問大型數組比按順序訪問要快得多。

正如西蒙提到的我相信非常重要哈希部分是轉換一個大空間(任意長度,通常是字符串等),并將其映射到一個小空間(已知大小,通常是數字)進行索引。這如果是非常重要的記??!

所以在上面的例子中,30,000個可能的客戶機被映射到一個較小的空間。


其中的主要思想是將整個數據集分割成段,以加快實際的搜索,這通常是耗時的。在我們上面的例子中,300個文件柜中的每一個都會(統計上)包含大約100條記錄。通過100條記錄進行搜索(不管順序如何)比處理30,000條記錄要快得多。

你可能已經注意到有些人實際上已經這樣做了。但是,在大多數情況下,它們不會設計哈希方法來生成散列密鑰,而只是使用姓氏的第一個字母。因此,如果你有26個文件柜,每個都包含一個字母從A到Z,理論上你只是分割了你的數據,并加強了歸檔和檢索過程。

希望這能幫上忙

吉奇!


查看完整回答
反對 回復 2019-07-04
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

這是一個很深的理論領域,但基本的輪廓很簡單。

從本質上說,散列函數只是一個函數,它從一個空格(例如任意長度的字符串)獲取事物,并將它們映射到一個用于索引的空間(例如,無符號整數)。

如果你只有一小部分要散列的東西,你就可以把這些事情解釋成整數,然后你就完成了(例如,4個字節字符串)。

通常情況下,你有一個更大的空間。如果允許作為鍵的事物的空間大于用于索引的東西的空間(您的uint 32或其他東西),那么您不可能對每個鍵都有唯一的值。當兩個或多個事物散列到相同的結果時,您將不得不以一種適當的方式處理冗余(這通常被稱為沖突,以及如何處理它,這在一定程度上取決于您使用哈希的目的是什么)。

這意味著您希望它不太可能有相同的結果,而且您可能也非常希望哈希函數很快。

平衡這兩個屬性(和其他幾個屬性)讓很多人都很忙!

在實踐中,您通常應該能夠找到一個為您的應用程序很好地工作的函數,并使用它。

現在,要將其作為一個哈希表使用:假設您不關心內存的使用。然后,您可以創建一個數組,只要您的索引集(所有uint 32,例如)。當您向表中添加某些內容時,您會散列它的鍵,并查看該索引處的數組。如果那里什么都沒有,你就把你的價值放在那里。如果已經有什么東西在那里,您可以將這個新條目添加到該地址的事物列表中,并提供足夠的信息(原始密鑰或一些聰明的信息),以找到哪個條目實際上屬于哪個鍵。

因此,在進行長時間操作時,哈希表(數組)中的每個條目要么為空,要么包含一個條目或一個條目列表。檢索就像索引到數組中一樣簡單,或者返回值,或者遍歷值列表并返回正確的值。

當然,在實踐中,您通常不能這樣做,這浪費了太多的內存。因此,您可以根據稀疏數組(其中唯一的條目是實際使用的條目,其他所有內容都隱式為空)來執行所有操作。

有很多方案和技巧可以使這個工作更好,但這是最基本的。


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 607 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號