Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这个基本转换器的大O是什么?_Javascript_Algorithm_Stack_Big O - Fatal编程技术网

Javascript 什么';这个基本转换器的大O是什么?

Javascript 什么';这个基本转换器的大O是什么?,javascript,algorithm,stack,big-o,Javascript,Algorithm,Stack,Big O,我的答案是O(D+R)。对吗 我想找出这段代码的大O。我正在做一门关于数据结构和算法的独立课程 这段代码摘自PacktPub的L Groiner女士的《JavaScript中的数据结构和算法》一书,我现在正在学习这本书 请参阅下文: function baseConverter(decNumber, base) { var remStack = new Stack(), //instantiate class, define variable, O(1) rem, // define

我的答案是O(D+R)。对吗

我想找出这段代码的大O。我正在做一门关于数据结构和算法的独立课程

这段代码摘自PacktPub的L Groiner女士的《JavaScript中的数据结构和算法》一书,我现在正在学习这本书

请参阅下文:

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\u base(decNumber)

在每次迭代过程中,执行一个数组推送操作

当数组元素被推到
remStack
上时,第二个循环运行的频率与第一个循环的迭代次数相同

因此,总体运行时复杂性大致与
2*log_base(decNumber)
成正比,后者等于
O(log(decNumber))


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

您的函数采用参数
decNumber
base
。在你的分析中,n等于什么?(不,你的答案不正确。更精确地知道n等于什么有助于找出错误。)在它达到0之前,你能将
decNumber
除以
base
多少次?根据
decNumber
base
计算出大O。这是第一个循环将迭代的次数。第二个循环的迭代次数与第一个循环相同,这有一个公式。提示:它比O(baseNumber)好。
decNumber
有多少位数?你知道一个数字的位数的公式吗?这就是两个循环将迭代的次数。