链表和二进制搜索的大O表示法

时间:2014-09-21 17:52:11

标签: java algorithm linked-list big-o binary-search

我正在尝试计算此代码的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))作为答案。这是为这种类型的列表计算此搜索方法的正确方法吗?

1 个答案:

答案 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之间的区别。