簡體   English   中英

什么是我的遞歸函數的Big-O分析?

[英]What is the Big-O analysis of my recursive function?

准備技術面試,我用遞歸解決方案解決了練習題。

這樣的遞歸函數的運行時復雜性是多少? 我更關心的是解釋而不是答案。

根據我的分析,操作次數將是n的一半。 也就是說,在最壞的情況下,一個10個字符的字符串將進行5次函數調用。 但我從未見過O(n / 2)運行時。 此外,我的分析排除了對輔助函數counterpartOf的調用。 有人可以給我一個正確的分析嗎?

編寫一個接受由括號({})組成的字符串的函數,並返回它是否是平衡的。

function checkBraces(input){
  // start at the center and work outwards, recursively
  var c = input.length / 2;

  if (input.charAt(c) !== counterpartOf(input.charAt(c-1))) {
    var match = false;
    return match;
  } else {
    // if only 2 characters are left, all braces matched
    if (input.length === 2){
      var match = true;
      return match;
    } else {
      input = input.substring(0,c-1) + input.substring(c+1,input.length);
      return checkBraces(input);
    }
  }
  return match;
}

function counterpartOf(brace){
  closing = ['}', ')', ']'];
  opening = ['{', '(', '['];
  var i = opening.indexOf(brace);
  var counterpart = closing[i];
  return counterpart;
}

常數是無關緊要的,這就是為什么你不會看到/ 2,* 2或類似的東西。

細節:

http://en.wikipedia.org/wiki/Big_O_notation#Multiplication_by_a_constant

如果k不為零,則O(k * g)= O(g)。

否則,因為Yevgeniy.Chernobrivets提到你的算法不准確。 但除了他的評論,我認為還有其他問題。

通常對於類似的任務,他們使用下推自動機。 關於這個問題有一些理論背景: http//people.cs.clemson.edu/~goddard/texts/theoryOfComputation/7.pdf

只有在javascript substring函數占用恆定時間的情況下,函數的復雜度才為O(n) 如果substring函數的復雜度為O(k) ,其中k是子串的長度,則函數的復雜度將為O(n^2) 你需要檢查javascript substring函數的實現。

有點偏離主題,不確定你是否需要使用遞歸,但我認為有一種更有效的方法來獲得結果:

function checkBraces( input )
{
   // if the string is an odd number of characters, return immediately.
   if( input.length % 2 !== 0 ) return false; 

   // split the string in half
   var c = input.length / 2;
   var r = input.substr( c );
   var l = input.substr( 0, c );

   // take the left side, reverse it, and swap each left bracket character with it's counterpart
   l = l.split('').reverse().join('').replace(/\{|\(|\[/g, counterpartOf );

   // strings should match
   return r == l;
}

暫無
暫無

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

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