【发布时间】:2014-09-21 17:52:11
【问题描述】:
我正在尝试计算此代码的 Big-Oh,它用于对链表执行二进制搜索:
public int search( List<T> list, T target ) {
int low = 0;
int high = list.size() - 1;
int middle;
while ( low <= high ) { // frequency << log( n )
middle = ( low + high ) / 2;
int cmp = target.compareTo( list.get( middle ) ); // time << n
if ( cmp < 0 ) high = middle - 1;
else if ( cmp > 0 ) low = middle + 1;
else return middle;
} // time << n log( n )
return -1;
} // time << n log( n )
我得到 O(n log(n)) 作为答案。这是计算这种类型列表的这种搜索方法的正确方法吗?
【问题讨论】:
-
二分查找是 log n,而不是 n log n。查看此重复:stackoverflow.com/a/8185382/150818
-
@SaketJha:不,您假设按索引访问列表操作是 O(1),这不适用于链表。
-
@SaketJha,如果你正确阅读了这个问题,它会在链表上显示二进制搜索。那不是 O(log n)
-
基本上,在链表上使用二分搜索是个坏主意……最好进行线性扫描,即 O(n)。
-
我知道这不是最好的事情,但这是我们分析不同算法的任务。根据我的理解,LinkedList 的 get() 是 O(n),所以我认为 n*log(n) 是正确的答案。
标签: java algorithm linked-list big-o binary-search