這是最好的和最簡單的散列函數,它爲低於5000的整數生成唯一的散列值?整數低於5000的散列函數?
實際的問題是,我有一個大小約爲50的整數數組,其中包含1到5000之間的值。現在我必須做反向映射,即給定一個值,並且我必須找出它存儲的索引。我知道這可以通過使用二進制搜索來完成,因爲我的數組已排序。
請不要建議爲C.
這是最好的和最簡單的散列函數,它爲低於5000的整數生成唯一的散列值?整數低於5000的散列函數?
實際的問題是,我有一個大小約爲50的整數數組,其中包含1到5000之間的值。現在我必須做反向映射,即給定一個值,並且我必須找出它存儲的索引。我知道這可以通過使用二進制搜索來完成,因爲我的數組已排序。
請不要建議爲C.
除非5 KB的陣列空間,8位(char
)值太大,任何哈希庫,不要用哈希麻煩 - 使用數字作爲指標轉換爲字符數組,存儲1表示使用數字,0表示不使用數字。您可以通過將該陣列用作存儲位圖(因此您需要大約625個字節來存儲5000個位)來進一步減少存儲空間,再加上一些代碼來計算正確的位位置以查看。
或者,假設您需要將索引找到50個整數的數組中,請使用5 KB的空間將索引存儲到50個整數的數組中,可能有-1表示該數字未被使用。
int main_array[50];
signed char aux_array[5000];
// initialize aux_array to all -1
for (int i = 0; i < sizeof(aux_array); i++)
aux_array[i] = -1;
// for each value `v` in main_array, store its index `i` in `aux_array[v]`
for (int i = 0; i < num_values; i++)
{
int v = main_array[i];
if (aux_array[v] != -1)
...non-unique data in main_array...
aux_array[v] = i;
}
在aux_array
逆查找檢查是否該索引爲-1(不存在)或非負,以指示它被發現。這是一個倒排索引。如果最終需要超過127個值,則可以切換到unsigned char
或short
而不是signed char
(在適當調整標記值時,在我的示例中爲-1
)。
散列可能不符合成本效益。
實際上,我有一個固定大小的恆定數組50,並且這個值在項目的整個生命週期中都不會改變。所以我已經有了這些值,我只想爲這些值生成唯一的哈希值。如果這是一個普通的情況,那麼你所說的話是絕對正確的。如果你想要的價值,我也可以提供。 –
爲什麼你不能使用該號碼作爲自己的散列? – Blender
@Blender:可以,但是在這種情況下,我必須創建一個大小爲5000的哈希表,這就是爲什麼我來這裏尋找更好的方法。如果我沒有得到,我只會爲此而去。 –
如果數字範圍從'1 ... 5000',那麼就有'5000'個可能的散列(假設你想要獨特的散列,這對搜索有意義)。無論哪種方式,你將創建'5000'散列,所以爲什麼不去尋求簡單的解決方案? – Blender