1 回答

TA貢獻2011條經(jīng)驗 獲得超2個贊
是的,對于大量的人來說,aHashMap是有益的。
您的初始算法將花費很長時間,在嵌套的 for 循環(huán)中遍歷兩個列表。這是一個 O(n 2 ) 算法。A即使假設(shè)和中各有 1000 個項目,并假設(shè)比較兩個單獨的項目(一個來自和一個來自)B的成本為 1 ,您也會看到 500k 次比較(避免比較每個項目兩次)。經(jīng)常這樣做會導(dǎo)致性能下降。AB
假設(shè)你有一個很好的對象哈希碼算法,從 a 中查找一個值HashMap是 O(1) 訪問。您仍然會花費 O(n) 時間來構(gòu)建它,但如果您有大量項目,那與 O(n 2 ) 相比就不算什么了。
使用來自“B”的數(shù)據(jù)構(gòu)建HashMap一次“C”并多次使用它,只要B的信息沒有改變。如果您“需要經(jīng)常這樣做”,那么性能會更好,因為HashMap它已經(jīng)構(gòu)建好了——只需重用它。
如果需要維護順序,將B列表索引作為值存儲在哈希映射中。
您不需要“將該臨時哈希圖轉(zhuǎn)換回數(shù)組列表”,因為創(chuàng)建HashMap“C”不會破壞原始列表“B”。要注意的一件事是,如果列表中的對象B發(fā)生變化,則強制更新以HashMap保持一致。另一件需要注意的事情是你對非常大的列表的內(nèi)存使用——你能把對象、列表和散列圖保存在內(nèi)存中嗎?
你的偽代碼:
for each index in B:
get object b
put in hash map C values (b, index)
for each a in A:
if found in hash map C: do something with found object
對于較小的數(shù)字,O(n 2 ) 性能時間將足夠小,以至于HashMap不值得構(gòu)建它。這是您需要做出的決定——您需要決定何時列表足夠大,以至于構(gòu)建HashMap和使用它值得HashMap構(gòu)建成本。
添加回答
舉報