嘿guyz目前我正在研究Big O的概念,我想清楚我的几个问题,我很清楚Big O及其概念,但我仍然无法在google上找到与这些问题相关的任何正确答案 1.什么是所有javascript数组方法的大O(特别是indexof,包括) 2.什么是所有javascript对象方法的大O(特别是键,值) 3.大o(1)据说是恒定时间,但是以ms为单位的确切时间
- 什么是所有javascript数组方法的大O(特别是indexof,包括)
在无序列表中查找值是一个经典的O(n)任务:因为您不知道元素的位置,您只需要逐个开始检查它们。虽然从技术上讲可以为数组创建“反向”,值 - >键映射,但环境通常不会这样做。例如,V8引擎也不例外,请参阅https://github.com/v8/v8/blob/master/src/elements.cc,IndexOfValueSlowPath
等方法
for (uint32_t k = start_from; k < length; ++k) {
for (uint32_t k = start_from; k < length; ++k) {
以及它们的几个实例。
它们来自Runtime_ArrayIndexOf
,特别是在899线。如果这个方法不适用,那么稍后会有一些回退,再次使用一个简单的for循环(之前设置了index
,已经用于调用上面提到的方法):
for (; index < len; ++index) {
- 什么是所有javascript对象方法的大O(特别是键,值)
Object
位于相邻的(to array)运行时文件https://github.com/v8/v8/blob/master/src/runtime/runtime-object.cc中,但不要指望那里有魔法,它也会在for
中的各种https://github.com/v8/v8/blob/master/src/keys.cc循环中结束,就像一个简单的checking一样,如果一个数组是由有效键构成的(数字和字符串) )
static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { int len = array->length(); for (int i = 0; i < len; i++) { Object e = array->get(i); if (!(e->IsName() || e->IsNumber())) return false; } return true; }
或者从不同地方打来的另一个人从多个来源建立一个单一的collection:
void KeyAccumulator::AddKeys(Handle<FixedArray> array, AddKeyConversion convert) { int add_length = array->length(); for (int i = 0; i < add_length; i++) { Handle<Object> current(array->get(i), isolate_); AddKey(current, convert); }
- 大o(1)据说是恒定时间,但是以ms为单位的确切时间
哪有这回事。
大o(1)据说是恒定时间,但是以ms为单位的确切时间
大O符号(以及小o,BTW)并不代表任何特定值,它代表了所需资源的增长,这取决于输入数据的大小。它回答了这个问题:“如果我对数据执行两倍大的算法,它会花费多长时间,或两倍长,或者会变得更加或更少 - 或多或少?”。
一纳秒,十亿年,以及任何其他特定值都是O(1)。
关于典型阵列操作的计算成本,任何需要(可能在最坏情况下)查看整个阵列的事物将至少为O(阵列长度)。使用像reduce
,map
等函数方法,回调函数的复杂性也很重要 - 回调可能是O(1),但也可以是O(数组的长度),或O(某个另一个数组的长度)。