簡體   English   中英

Hashtable實施

[英]Hashtable Implementation

我最近被問到'你將如何實施一個可憎的'。 我知道哈希算法是關鍵的,因為較少的沖突會帶來更好的WRT性能,但是應該使用什么算法/數據結構來為插入/刪除/查找提供分攤的常量時間{O(1)}?

哈希表有兩種主要可能性:

  1. 打開尋址 ,這是一個簡單的數組 [動態數組實際上,如果你可以讓你的表在飛行中增長]。 一旦遇到沖突 - 您需要使用第二個哈希函數來查找元素將映射到的下一個主進程。 請注意,當您的哈希表也允許刪除時,此解決方案存在一些問題[可以解決]。 [“刪除”主菜的特殊標記]
  2. 鏈接 - 在此解決方案中, 數組中的每個主進程都是一個鏈接列表 - 包含對此主菜進行散列的所有元素。 在這里 - 映射到特定值的所有元素都在列表中。

關於哈希表[在兩個解決方案中]的重要部分,為了允許機動化的O(1)插入/ del /查找 - 分配更大的表並在達到預定義的加載因子后重新散列。

編輯:復雜性analsis:
對於某些p < 1假設負載因子為p

  1. 每次訪問中“碰撞”的概率是p因此,數組訪問的平均值是: Sigma(i * p^(i-1) * (1-p)) for each i in [1,n]這給出了: Sigma(i * p^(i-1) * (1-p)) = (1-p) * Sigma(i * p^(i-1)) <= (1-p) * 1/(p-1)^2 = 1-p = CONST [看看Sigma(i * p ^(i-1))<1 /(p-1)^ 2在wolfram alpha中的正確性。 因此平均導致對陣列的恆定訪問次數。 另外:在達到加載因子后,您可能需要重新散列所有元素,從而導致對數組的O(n)訪問。 這導致n * O(1) ops [添加n個元素]和1 * O(n) op [rehashing],因此得到: (n * O(1) + 1 * O(n)) / n = O(1)機動時間。
  2. 與(1)非常相似,但分析是在列表訪問上完成的。 每個操作只需要一次數組訪問,以及不同數量的列表訪問 - 使用與以前相同的分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM