簡體   English   中英

嵌套的 For in 循環是 O(n) 但應該是 O(n^2)?

[英]Nested For in loops are O(n) but should be O(n^2)?

const anagram = (str1, str2) => {
    str1 = str1.split('');
    str2 = str2.split('');
    
   let frequencyCounter1 = {};
   let frequencyCounter2 = {};

   for(let val of str1) {
       frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1;
   }

    for(let val of str2) {
       frequencyCounter2[val] = (frequencyCounter2[val] || 0) +1;
   }

   for(let key in frequencyCounter1) {

       if(!(key in frequencyCounter2)) {
           return false;
       }

       if(frequencyCounter1[key] !== frequencyCounter2[key]) {
           return false;
       }
   }

    return true;
}

anagram('racecar', 'racecar');

這個挑戰要求使用頻率計數器模式來測試 str2 是否是 str1 的字謎。 提供的答案應該是 O(n)。 這個 if 語句怎么可能:

if(!(key in frequencyCounter2)) {
           return false;
       }

這不是建議您循環遍歷 object 以確保它包含該密鑰,因此您有嵌套循環和 O(n^2)?

它實際上是 O(n) 因為

for(let key in frequencyCounter1) {

       if(!(key in frequencyCounter2)) {
           return false;
       }

       if(frequencyCounter1[key] !== frequencyCounter2[key]) {
           return false;
       }
   }

您正在對frequencyCounter1 O(n) 進行迭代,然后您在frequencyCounter2 中從frequencyCounter1 中找到每個迭代鍵,而js 對象基本上是鍵值對,因此查找鍵需要O(1)。 因此總時間復雜度為 O(n)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM