2012-07-01 98 views
0

假設我有一個唯一編號列表(例如105,342,432,34等),我想將它們映射到索引(0,1,2,3等)。有沒有一個通用的方法來做到這一點?如果不是,則假定您事先知道列表中的所有數字,並且可以硬編碼它們的值。如果這沒有幫助,另一個限制因素可能是這些數字「幾乎是連續的」。這意味着它們大部分是連續的,但可能存在差距(您事先知道這些差距)。將唯一編號映射到索引

回答

1

你想要做的是基本上實現一個哈希映射(或字典)。許多實現這種結構的語言都有很多庫。
在一個非常簡單的方式下,發生了什麼是一個數組和一個哈希函數,它將您的數字映射到數組中的某個索引,從而實現O(1)分期訪問您的元素基於他們的關鍵。
第二個重要方面是如何處理碰撞。舉例來說,你的數字的哈希函數是f(x) = x mod 10。 和將被散列爲。這是一次碰撞,必須予以處理。例如,您可以創建有序的元素列表並將其分配給您的陣列插槽。搜索元素時,您可以散列其密鑰並在指定數組位置的列表中搜索確切的密鑰匹配。
這僅僅是這一切的開始,你可能在維基百科上找到關於這一切的更多信息,在 Hash functionHash map
值得一提的是,在你的情況下,你只需要自己存儲密鑰。通常我們需要存儲更復雜的對象,並通過它們的鍵(通常是數字或字符串)來搜索它們,但也可能是任何類型的更復雜的對象。

編輯
我只是意識到,你的問題是更多關於尋找最好的散列函數你不是更通用的解決方案來與你相似問題的具體方案。
如果我理解正確,你是說你事先知道這個數字?如果這真的是這樣,你可以如果號碼分配你的數組中的索引他們每個人一個一個,在一個非常硬編碼的形式(如你所說你自己),如:

if (num == 105) 
    idx = 0; 
else if (num == 342) 
    idx = 1; 
... 

如果你不知道你的號碼,但你知道,也就是說,最小的和最偉大的人,你可以將它們散列到指數中:

f(x) = (x - smallest_num) mod (greatest_num - smallest_num + 1) 

在這種情況下,f(x)是一個完美的散列函數,這意味着不會有任何碰撞。考慮到你的數字並不總是連續的,你的數組仍然有一些空位。

注意:我仍然不確定您打算如何處理這個問題,因此我不確定我是否正確回答了您的問題。特別是事實上,你可能事先知道你的號碼,或者你可能知道很多關於他們的事情,這使我很困惑。也許如果你的目的已經明確,我們可以給你不同的方式來實現你的目標。