簡體   English   中英

如果您進行更多處理,為什么以下算法之一比另一種更快?

[英]Why is one of the following algorithms faster than the other if you do more processing?

function reverseString(str) {
  let newStr = ''
  for (let i = (str.length - 1); i >= 0; i--) {
    newStr += str[i]
  }

  return newStr
}

// This algorithm is faster
function reverseString2(str) {
  str = str.split('')
  let left = 0
  let right = str.length - 1
  while (left < right) {
    const tmp = str[left]
    str[left] = str[right]
    str[right] = tmp
    left++
    right--
  }
  return str.join('')
}

如果reverseString進行更多處理,將字符串轉換為數組然后連接整個數組,為什么 reverseString2 比reverseString2快? 優點是主要算法是 O(n/2),但 rest 是 O(n)。 為什么會這樣?

結果如下:
字符串大小: 20000000
反向字符串: 4022.294ms
反向字符串2: 1329.758ms

提前致謝。

在第一個 function reverseString()中,發生的事情是循環運行了“n”次。 這里的“n”表示字符串的長度。 您可以看到您正在執行循環 n 次以獲取反轉的字符串。 所以這個 function 花費的總時間取決於“n”的值。

在第二個 function reverseString2()中,while 循環僅運行 n/2 次。 當您查看leftright變量時,您可以理解這一點。 對於循環的一次執行, left變量增加 1, right變量減少 1。因此您一次進行 2 次更新。 所以對於一個 n 長度的字符串,它只執行 n/2 次。

雖然第二個 function 中的語句要多得多,但它們的執行時間比第一個 function 中的語句要少得多。 因此 function reverseString2()更快。

暫無
暫無

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

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