我正在尝试计算此代码的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))作为答案。这是为这种类型的列表计算此搜索方法的正确方法吗?
答案 0 :(得分:-1)
来自while()的第三行,
list.get( middle )
对于LinkedList是昂贵的,它的O(n / 2)平均情况== O(n)但是对于arrayList它是O(1)所以尽管算法缩小到O(log n)中的元素,访问每个循环中的数组元素会使O(n)变为O(n log n)。
我猜测你是否将ArrayList传递给函数,它会给你更好的性能。试一试。很好,您使用List通用接口实现了该功能,您应该能够传递ArrayList。
并确保您在访问/索引,读取,写入,搜索,克隆操作等方面研究arraylist和linkedlist之间的区别。