代码之家  ›  专栏  ›  技术社区  ›  LuminousNutria

如何在big-o中确定添加到完整arraylist时的程序复杂性?

  •  0
  • LuminousNutria  · 技术社区  · 5 年前

    我正在为我的计算机科学课准备一个实践考试。但是,我不确定下面的问题。

    考虑四种不同的方法来重新调整基于数组的列表数据结构的大小。 在每种情况下,当我们想在数组的末尾添加()一个项,但它已满时,我们 创建一个新数组,然后将元素从旧数组复制到新数组中。对于每一个 下面关于新数组的大小的选择,给出了结果的复杂性 在列表的末尾,用大O字眼来说:

    (i)将数组大小增加1项。

    (ii)将数组大小增加100个项目。

    (iii)阵列大小的两倍。

    (iv)阵列大小的三倍。

    既然你也这么叫 System.arraycopy() 不管方法到达时间如何,每个方法的复杂度不是都一样吗?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Stephen C    5 年前

    既然不管怎样都调用同一个System.ArrayCopy()方法到达时间,那么每个方法的复杂度不是都一样吗?

    是的,没有。

    是的-当你真的复制时,复制的成本在任何情况下都是相似的。

    (如果包括分配和初始化数组的成本,它们就不完全相同。分配和初始化 2 * N 元素 N + 1 元素。但您只需将n个元素复制到数组中。)

    不-不同的策略会导致数组副本发生不同的次数。如果对一系列操作进行完整的复杂性分析,您会发现选项3和选项4的复杂性与选项1和选项2不同。

    (值得注意的是,2将比1快,尽管它们具有相同的复杂性。)

    典型的分析包括 全部的 这样的费用:

    List<Object> list = new ArrayList<>();
    for (int i = 0; i < N; i++) {
        list.add(new Object());
    }
    

    (提示:这个分析可以在你推荐的“数据结构和算法”教科书或你的课堂讲稿中作为一个例子。如果是的话,那就是你应该复习的内容(在做练习考试之前!)如果不是的话,谷歌的“复杂度摊销数组列表”和你会发现的例子。)