微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 更适合说Amortized O(1)vs O(n)用于插入未排序的动态数组?

这属于stackoverflow.com/help/on-topic的“软件算法”,在这种情况下,是一个将项添加到动态未排序数组的软件算法

这是我们在课堂上关于不同数据结构上的操作运行时间的图表

我的问题是关于将值插入(或添加)到动态未排序数组中的运行时.
这是我们执行此操作的代码

public void insert(E value) {
    ensureCapacity(size + 1);
    elementData[size] = value;
    size++;
}
  private void ensureCapacity(int capacity) {
    if (capacity > elementData.length) {
        int newCapacity = elementData.length + 100;
        if (capacity > newCapacity) {
            newCapacity = capacity;
        }
        elementData = Arrays.copyOf(elementData,newCapacity);
    }
}

我理解这可以解释为O(n). ensureCapacity函数在技术上是由insert和运行时分析组成的操作的区别,https://academics.tjhsst.edu/compsci/CS2C/U2/bigoh.html,你会说两个分支的最坏情况是当原始数组的每个元素被复制到新的数组中时(n)操作.所以整个函数的最坏情况或大哦是O(n)

可以为摊销的O(1)时间(What is amortized analysis of algorithms?)进行争论,因为每次调整大小时,你必须在下一次调整大小之前等待一段特定的时间吗?

在那张图表中,O(1)也会有意义吗?

解决方法

没有.

“摊销的O(1)时间”意味着一个非常具体的事情 – 它意味着一次一个地插入n个项目的成本是O(n).仅仅说“需要很长时间的事情并不经常发生”是不够的 – 你实际上必须以数学方式分析算法.

这种特殊情况(将项目插入数组,或者如果已满,则调整大小)是众所周知的.事实证明,如果你通过一个常数因子调整数组的大小(例如,每当它加满时将其加倍),那么这个操作就是摊销O(1).如果你添加固定数量的元素(例如,每次加满时加100),那么它仍然是分摊O(n),因为单独添加n个元素需要O(n2)时间.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐