[英]Performance / readibility: Nested for-loops vs HashMap
(注意:很抱歉,如果我把這個問題放在錯誤的堆棧交換上,如果這個問題應該放在其他地方,我會重新發布它。)
我剛開始在一家科技公司實習,想問一下代碼性能和/或編碼實踐。 我正在查看由一位高級開發人員編寫的代碼,該代碼在性能方面對我來說似乎不正確,但是我不確定這是因為我沒有經驗還是歸因於他。
這是我正在查看的代碼:
// Given the following:
List<TypeA> aList = (...)
List<TypeB> bList = (...)
for(TypeA obj : aList) {
boolean found = false;
for(TypeB obj2 : bList) {
if(obj.name.equals(obj2.name) {
found = true;
break;
}
}
if(!found) {
obj.doSomething();
someOtherList.add(obj);
}
}
我的想法是,對於代碼嘗試執行的操作,O(n ^ 2)嵌套的for循環效率很低。 做這樣的事會更好嗎? (也請不要介意任何語法錯誤,我正在即時輸入它;)):
// Given the following:
List<TypeA> aList = (...)
List<TypeB> bList = (...)
Map<TypeB, String> bListToName = new HashMap<>()
bList.forEach(obj -> bListToName.put(obj, obj.name));
for(TypeA obj : aList) {
if(bListToName.get(obj.name) == null) {
obj.doSomething();
someOtherList.add(obj);
}
}
我的理由是,我使用了兩個O(n)循環,而不是嵌套的for循環,這將以相當大的幅度提高性能,尤其是在我們的a / bList足夠大或經常使用的情況下。
任何見解或想法將不勝感激,謝謝!
如您所暗示,大小是一個因素。 構建哈希圖意味着分配額外的內存,這可能會超過少量比較所節省的時間。
我建議您習慣進行時間測試以使您的理論得到可證明的結果。 無論如何,您都需要這樣做以證明在同行評審期間進行此類更改是合理的。
除此之外,我只想指出您的建議是一個半措施。 如果代碼確實很關鍵,那么首先將其構造為Map就是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.