【问题标题】:Questions about Time complexity O(1), O(n), O(log n), O(n log n)关于时间复杂度 O(1), O(n), O(log n), O(n log n) 的问题
【发布时间】:2020-11-17 05:41:27
【问题描述】:

我目前正在研究 arraylist 的时间复杂度,尤其是关于访问和搜索。我对哪个是哪个有点困惑。

  1. 所以我知道访问的时间复杂度(当您知道索引时)是 O(1)。

但是 2 和 3 正确吗?

  1. 当arraylist被排序并且你不知道索引是O(n)时在arraylist上搜索...?

  2. 时间复杂度当你需要从未排序的arraylist中查找数据并且你不知道它的索引是O(n)时...?

2 和 3 的答案应该相同吗?还是排序/未排序的数组列表会改变时间复杂度?

【问题讨论】:

  • #2 和 #3 听起来是一回事:在未排序的数组列表中搜索数据。
  • 抱歉打错了。所以(2)应该从排序的arraylist(索引未知)中搜索,(3)应该从未排序的arraylist(索引未知)中搜索

标签: java arraylist time-complexity


【解决方案1】:

当通过数组列表进行线性搜索时,您正在寻找某个元素。由于您不知道数据所在的索引,因此您必须遍历每个元素,直到找到您要查找的项目。

在最坏的情况下,你必须一直走到最后一个元素。 Big Oh 作为算法的上限。在最坏的情况下,我们必须遍历所有 n 个元素,所以算法是 O(n)。

如果对数组列表进行了排序,则可以使用 O(log n) 的二进制搜索

【讨论】:

  • 非常感谢您的快速回复!我得到使用二进制搜索的排序数组列表的时间复杂度为 O(lon n)。但是如果你只是从排序的arraylist中搜索而不是二进制搜索,它应该是O(n)吗?
  • 是的,因为您仍然可以搜索最后一个元素
【解决方案2】:

对于 #2,这取决于您进行搜索的方式。如果您进行顺序搜索,例如使用indexOf(Object o),那么无论数据是否排序,性能都是O(n)

使用二分查找算法排序列表或数组可以在O(log n)中完成>.

可以使用Collections.binarySearch()List 进行二分搜索。正如 javadoc 所说:

此方法在 log(n) 时间内运行,用于“随机访问”列表(提供接近恒定时间的位置访问)。如果指定的列表没有实现RandomAccess接口并且很大,这个方法会做一个基于迭代器的二分查找,执行O(n)链接遍历和O(log n) 元素比较。

可以使用Arrays.binarySearch() 对数组进行二分搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2011-12-12
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多