所有javascript数组和对象方法的大O [关闭]

问题描述 投票:-2回答:2

嘿guyz目前我正在研究Big O的概念,我想清楚我的几个问题,我很清楚Big O及其概念,但我仍然无法在google上找到与这些问题相关的任何正确答案 1.什么是所有javascript数组方法的大O(特别是indexof,包括) 2.什么是所有javascript对象方法的大O(特别是键,值) 3.大o(1)据说是恒定时间,但是以ms为单位的确切时间

javascript arrays big-o javascript-objects
2个回答
1
投票
  1. 什么是所有javascript数组方法的大O(特别是indexof,包括)

在无序列表中查找值是一个经典的O(n)任务:因为您不知道元素的位置,您只需要逐个开始检查它们。虽然从技术上讲可以为数组创建“反向”,值 - >键映射,但环境通常不会这样做。例如,V8引擎也不例外,请参阅https://github.com/v8/v8/blob/master/src/elements.ccIndexOfValueSlowPath等方法

for (uint32_t k = start_from; k < length; ++k) {

或者IndexOfValueImpl

for (uint32_t k = start_from; k < length; ++k) {

以及它们的几个实例。 它们来自Runtime_ArrayIndexOf,特别是在899线。如果这个方法不适用,那么稍后会有一些回退,再次使用一个简单的for循环(之前设置了index,已经用于调用上面提到的方法):

for (; index < len; ++index) {

  1. 什么是所有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);
  }

  1. 大o(1)据说是恒定时间,但是以ms为单位的确切时间

哪有这回事。


0
投票

大o(1)据说是恒定时间,但是以ms为单位的确切时间

大O符号(以及小o,BTW)并不代表任何特定值,它代表了所需资源的增长,这取决于输入数据的大小。它回答了这个问题:“如果我对数据执行两倍大的算法,它会花费多长时间,或两倍长,或者会变得更加或更少 - 或多或少?”。

一纳秒,十亿年,以及任何其他特定值都是O(1)。

关于典型阵列操作的计算成本,任何需要(可能在最坏情况下)查看整个阵列的事物将至少为O(阵列长度)。使用像reducemap等函数方法,回调函数的复杂性也很重要 - 回调可能是O(1),但也可以是O(数组的长度),或O(某个另一个数组的长度)。

© www.soinside.com 2019 - 2024. All rights reserved.