这个基本转换器的 Big-O 是什么?

What's the Big-O of this base converter?

我的答案是O(D + R)。正确吗?

我想弄清楚这段代码的大O。我正在做一个关于数据结构和算法的独立课程。

此代码摘自 L Groiner 女士的书 "Data Structure and Algorithms in JavaScript",PacktPub,我正在研究这本书。

请看下面:

function baseConverter(decNumber, base) {
   var remStack = new Stack(), //instantiate class, define variable, O(1)
   rem, // define var, O(1)
   baseString = '', //initialize, O(1)
   digits = '0123456789ABCDEF'; //initialize, O(1) 

   while(decNumber>0) { //loop, D times:
       rem = Math.floor(decNumber % base); //modulo/Math/assignment, O(1) 
       remStack.push(rem); //push to stack, O(1)
       decNumber = Math.floor(decNumber / base); //divide, Math, assignment, O(1)
   }


   while(!remStack.isEmpty()){ //loop, R times: 
       baseString += digits[remStack.pop()]; //pop/index/Math/addition assignment, O(1)
   }
   return baseString; // O(1)
}

我逐行简化每个操作,如下所示:

4 * O(1) + D * 3 * O(1) + R * O(1) =
3 * O(D) + 1 * O(R) =
O(D) + O(R) = O(D + R)

我查阅了自己的 Web 开发笔记并阅读了各种书籍。但我只能形成片段并从中推断出来。我想找到一个标准化的框架,或者至少在我的脑海中构建它,以便能够在 Big-O 中正确陈述 运行 时间。给我反馈,帮助我这样做。

第一个循环的运行时复杂度:

 while (decNumber > 0) {
       rem = Math.floor(decNumber % base);
       remStack.push(rem);
       decNumber = Math.floor(decNumber / base);
 }

此循环的迭代次数为 decNumber 可以除以 base。因此,迭代次数大致为log_base(decNumber).

在每次迭代期间,您执行数组推送操作。 For simplicity we assume it runs in constant time

第二个循环的运行频率与数组元素被推入 remStack 的频率相同,这等于第一个循环的迭代次数。

因此,总体运行时复杂度大致与 2 * log_base(decNumber) 成正比,即 O(log(decNumber))

只要 decNumber 上的模和除运算可以在典型硬件上以恒定时间执行(这对于有限精度 JavaScript 数字数据类型是正确的)就成立。