繁体   English   中英

关于时间复杂度 O(1), O(n), O(log n), O(n log n) 的问题

[英]Questions about Time complexity O(1), O(n), O(log n), O(n log n)

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

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

但是2和3是正确的吗??

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

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

2 和 3 的答案应该一样吗? 或排序/未排序的arraylist 会改变时间复杂度吗?

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

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

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

对于#2,这取决于您如何进行搜索。 如果您进行顺序搜索,例如使用indexOf(Object o) ,则性能为O(n) ,无论数据是否已排序。

可以使用二分搜索算法O(log n) 中搜索已排序的列表或数组。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM