儘管在這種情況下它可能是一種矯枉過正,但是散列表不會是O(n)。
這使用的事實是,每個字符串都可以通過hashCode()
轉換爲int,而相等的字符串將產生相同的散列。
我們的字典可以被聲明爲:
LinkedList<String>[] dictionary;
在每個地方几個字符串可以駐留換句話說,這是由於可能發生的碰撞(不同串產生相同結果)。
加法,最簡單的解決辦法是:
public void add(String str)
{
dictionary[str.hashCode()].add(str);
}
但爲了做到這一點,你需要做一個數組的大小等於1小於最大hashCode()
功能。這對你來說可能太多了。所以我們可以做一點區別:
public void add(String str)
{
dictionary[str.hashCode()%dictionary.length].add(str);
}
這樣我們總是修改哈希。爲了獲得最好的結果,你應該讓你的字典大小一些素數,或者至少是單個素數的一個次方。
然後,當你想測試你做,你在原來的有什麼字符串的存在,但是你用你從哈希得到具體LinkedList
:
public static boolean dictHasWord(String str)
{
for(String existing : dictionary[str.hashCode()%dictionary.length])
{
if(str.equals(existing)){
return true;
}
}
return false;
}
此時你可能問:「不是O(n)?」。答案是不是,因爲哈希函數沒有考慮數組中元素的數量。你會給你的數組留下更多的內存,你將會遇到更少的碰撞,並且更多的這種方法將會轉向O(1)。
如果有人發現這個答案尋找真正的解決方案(不是家庭作業)。然後只需使用HashMap
。
您是否允許使用Arrays類? http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html –
您瞭解了哪些數據結構可以被允許使用?有幾個明顯的答案,但如果它們涉及到你已經學習的數據結構,那麼這是一個測試,以確保你已經學會了它,並且我不願意給你答案;如果你還沒有了解它們,期望你自己去找出它們太多了。如果不知道真正的限制和上下文的其餘部分,很難回答這樣的問題。 – ajb
我們只允許使用字符串數組創建我們的字典。沒有ArrayList或類似的東西。唯一的其他限制是我們無法調用Arrays.sort()或Arrays.binarySearch()。 – Frank