簡體   English   中英

該算法最壞的運行時間是多少?

[英]What is the worst-case running time for this algorithm?

我正在為Facebook面試學習一些代碼。 我了解該算法的作用,但無法弄清楚它的復雜性。 這是我訪問過的網站上所說的:

由於將回文圖擴展到其中心可能需要O(N)時間,因此總體復雜度為O(N ^ 2)。

有人可以向我解釋他們如何獲得運行時間,特別是平均情況和最壞情況嗎?

給出的問題是找到最大的回文子字符串。 我對弦樂有點陌生。

我還想知道你們是否認為我應該學習Manacher算法,即O(N)。 這是一個使用更少內存的更好的解決方案,但是對我來說真的很難理解。

string expandAroundCenter(string s, int c1, int c2) {
  int l = c1, r = c2;
  int n = s.length();
  while (l >= 0 && r <= n-1 && s[l] == s[r]) {
    l--;
    r++;
  }
  return s.substr(l+1, r-l-1);
}

string longestPalindromeSimple(string s) {
  int n = s.length();
  if (n == 0) return "";
  string longest = s.substr(0, 1);  // a single char itself is a palindrome
  for (int i = 0; i < n-1; i++) {
    string p1 = expandAroundCenter(s, i, i);
    if (p1.length() > longest.length())
      longest = p1;

    string p2 = expandAroundCenter(s, i, i+1);
    if (p2.length() > longest.length())
      longest = p2;
  }
  return longest;
}

閱讀大O符號算法分析和一點點這個 ,然后再回來,看看我的答案的其余部分是有道理的。

在進行下一步之前,我將使用O(n)算法檢查字符串本身是否是回文。

讓我們看一下,您有一個運行n次的for循環,在每次迭代時,您都調用一個運行的函數...好吧,最糟糕的情況是,每次調用expandAroundCenter時,總是找到最長的回文,即迭代運行直到l < 0 || r > n-1 l < 0 || r > n-1 這意味着該算法為O(min(i, ni)) 現在,如果我們發現的總和從1到n個min(i, ni)我們得到這個 ,這是O(N²)的。

暫無
暫無

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

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