2017-06-20 18 views
0

我有以下「單詞」,我將需要一個散列函數。HashFunction爲「單詞」

甲字瓦特具有形式瓦特=字符[字符]數字[位]括號[]意味着這些是可選的。字符A,B ... Z和數字是0,1,2 ...

因此,有26 * 26 * 10 * 10 = 67600個可能的話,我需要帶桌子的散列函數220個條目。劃分方法顯然會在這裏工作,但我在找的東西,可以更容易地計算出

希望得到任何幫助

+1

爲什麼你需要的東西,「可以更容易地計算出」比一個標準的哈希函數的字符串? – Thilo

+0

@Thilo我正在練習考試,這是我們必須找到的 – CheckersGuy

+1

考慮到可選項,我認爲你有26 * 27 * 10 * 11的可能性。 – Thilo

回答

1

有超過67,600個可能的單詞。您有:

  • 字符 - (A9,Q3等):26 * 10(260)可能
  • 字符 - 字符 - (AA3,BQ5等):26 * 26 * 10(6760)可能
  • 字符 - - 數字(A95,G4 7,等等):26 * 10 * 10(2600)可能
  • 字符 - 字符 - - :26 * 26 * 10 * 10(67600)可能

所以可能的字的總數爲260 + 6760 + 2600 + 67600 = 77220

其通過220整除所以你的「哈希函數」可以是一個簡單的模量:

bucket = index % 220 

我不認爲你會發現比模數更容易計算。你可以使用一個標準的字符串哈希碼函數,但是這將涉及多個移位和加法,最後可能是模數。你可以使用一個簡單的校驗和,這只是一些補充,但是這不可能讓你在哈希表中分配很好的項目。由於可能項目的總數是桶的數量的偶數倍,所以在速度或分佈方面難以擊敗模數。

順便提一下,@Thilo的評論是正確的:您的可能性總數爲26 * 27 * 10 * 11。如你所說,第二個字符和第二個數字是可選的。如果您將可選屬性視爲另一個可能的字符(空字符),則第二個字符的字母表將包含27個項目(26個字母字符和空字符)。因此,像「A99」字樣的實際形式:

字符空字符數字

1

你可以把你的話作爲數字系統與基礎整數36.見Wiki

但有一個邊緣情況,因爲你有可選的字符,所以你需要以某種方式忽略它們。您可以添加empty character(例如:#),在轉換過程中您會忽略它。

PS。它將是基數爲37的數字系統,但邏輯保持不變。

+0

但它不是基數-37。沒有可選字符,它不是base-36。您不能真正將這些值視爲傳統基本系統中的數字,因爲每個位置的有效數字不同。 –