簡體   English   中英

在滾動哈希中,哈希函數的除法中使用的質數與為數字選擇的基數之間是什么關系?

[英]In a rolling hash what is the relationship between the prime used in the division method of the hash function and the base chosen for the numbers?

我正在自學MIT的算法簡介。 有一段朗誦視頻深入介紹了抽象數據類型Rolling Hash。 這是該視頻的注釋的鏈接(第一頁是關於滾動哈希的): 復習9注釋

視頻中使用的示例是嘗試在大小為n的較大字符串中搜索大小為k的字符串(類似於在文檔中搜索單詞)。 滾動哈希可以使此任務以O(n)運行。

這個想法是,您有一個大小為k的窗口,該窗口從較大字符串的開頭開始。 在每一步中,您都對窗口中的字符串進行哈希處理,並將其與要搜索的字符串的哈希進行比較。 如果哈希值不匹配,則說明您找不到要搜索的字符串,因此將窗口向前滾動一個字符然后重試。

為了說明為什么這樣做,有必要將各個字符串字符視為b的整數(其中b可以是任何數字,但可以是可能的字符數,例如ASCII為256)。 字符串成為整數列表。 當您將搜索窗口“向前滾動”時,會使用滾動哈希操作,稱為“ append”和“ skip”(或“ pop”):消除(跳過或彈出)列表中的第一個整數,並附加下一個整數在列表中的文檔中。 該視頻深入介紹了如何在O(1)中從一個窗口的散列轉到下一個窗口的散列,但是所使用的散列函數只是簡單的模函數(可以在上面的鏈接說明中輕松看到)。

有一個聽眾的問題,以一種我無法理解的方式回答:

聽眾:p(模數函數中使用的質數)是否必須始終小於基數,或者可以是任何整數?

教授:它可以比基數大。 因此,如果我不想有很多誤報,那么假設我的底數是256,因為這是一個額外的字符。 之前我曾爭論說,我的誤報數量基本上是1 / P。 所以我希望p盡可能接近字長。 因此p將在2到40億之間。 所以絕對更大。 它可以以任何一種方式工作。 如果此處使用的算法更大,則更好。

首先,如果您在簡單哈希函數的模函數中使用質數p,那么發生沖突的概率(假設簡單均勻哈希)為1 / P,對嗎? 說P應該盡可能接近字長意味着什么?

我希望這對將來嘗試自學解決此課程的任何人有所幫助。

兩者之間確實沒有任何關系。 根據輸入的大小選擇底數,並選擇素數以使它足夠大,以使誤報的可能性很小,但又要足夠小,以方便/快速地進行計算。

您確實需要確保它們是互質的(因為p是質數,這意味着它不應該是基數的因數)。 如果p大於基數,則可以保證這一點,因此這實際上不是問題。

說P應該盡可能接近字長意味着什么?

字長是可以快速執行計算的體系結構的“自然”大小。 例如,在32位計算機上,字長為32位,因此您通常希望將散列存儲在32位無符號整數中,並使用接近2的32的質數,以便散列值覆蓋大多數可能的32位值。

暫無
暫無

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

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