【问题标题】:Time complexity of contains(Object o), in an ArrayList of Objects对象 ArrayList 中 contains(Object o) 的时间复杂度
【发布时间】:2011-04-24 16:27:02
【问题描述】:

正如标题所说,我想知道ArrayListcontains() 方法的时间复杂度是多少。

【问题讨论】:

    标签: java arraylist time-complexity


    【解决方案1】:
    O(n)
    

    sizeisEmptygetsetiteratorlistIterator 操作在恒定时间内运行。 add 操作在摊销常数时间中运行,即添加 n 个元素需要 O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。

    http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html

    【讨论】:

      【解决方案2】:

      ArrayList 是 O(n)

      【讨论】:

        【解决方案3】:

        如果您查看ArrayList 的源代码并检查其contains 方法,它如下所示:

        public boolean contains(Object o) {
            return indexOf(o) >= 0;
        }
        

        contains 将检查委托给indexOf 方法。所以,如果我们检查indexOf 的实现,它如下:

        public int indexOf(Object o) {
            if (o == null) {
                for (int i = 0; i < size; i++)
                    if (elementData[i]==null)
                        return i;
            } else {
                for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i]))
                        return i;
            }
            return -1;
        }
        

        从代码中可以看出,为了找到给定元素的索引,在最坏的情况下,必须遍历整个数组。随着数组大小的增加,元素的搜索时间也会增加。因此contains方法的时间复杂度为O(n),其中n是列表中元素的个数。

        【讨论】:

          【解决方案4】:

          它的O(n)contains(Object o) 是在 indexOf() 上实现的,它采用 O(n)。所以contains(Object o) 的复杂性是防御性的O(n)

          如果您需要,这里还有一些其他的:

          add() - O(1)
          add(index, element) – O(n)
          get() – O(1)
          set() – O(1)
          remove() –  (n)
          indexOf()` – O(n)
          

          【讨论】:

          • 感谢您的回答,两个小cmets:1)我不确定您是否需要指定“防御性”,这已经通过使用O 表示法暗示; 2) 从技术上讲,add 并不是真正的O(1),在最坏的情况下它是线性的,但它以 摊销 恒定时间运行(参见@davin 的答案)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-09-26
          • 1970-01-01
          相关资源
          最近更新 更多