[英]Questions about Time complexity O(1), O(n), O(log n), O(n log n)
我目前正在研究 arraylist 的时间复杂度,特别是关于访问和搜索。 我对哪个是哪个有点困惑。
但是2和3是正确的吗??
当 arraylist 被排序并且你不知道索引是 O(n) 时在 arraylist 上搜索......?
时间复杂度 当您需要从未排序的数组列表中查找数据并且您不知道它的索引是 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.