我们可以在链表上执行二进制搜索吗?

时间:2014-05-24 11:19:16

标签: search binary linked-list

有一个知名站点声称我们不能在链表上进行二进制搜索,但我知道我们可以在链表上执行合并排序(它使用分区和征服就像二进制搜索一样),所以我们必须是能够在链表上执行二进制搜索吗?

1 个答案:

答案 0 :(得分:1)

纯粹在摘要中,linked list不支持直接索引。获取第三个元素的唯一方法是从第一个元素开始,在第二个元素的下一个链接之后,然后跟随它到第三个元素的下一个链接。

如果实现允许索引(例如,java.util.LinkedList),则可以在需要元素时通过调用get(index)来实现二进制搜索。如果底层数据结构是没有辅助查找结构的简单链接列表,那么这将执行得非常糟糕。例如,以下是OpenJDK java.util.LinkedList.get method的代码。

package java.util;

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;

    public E get(int index) {
        return node(index).item;
    }

    Node<E> node(int index) {
        if (index < (size >> 2)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }
}

当调用list.get(5)来获取超过11个元素的列表中的第六个元素时,它会在返回第六个元素之前迭代前五个元素。通用接口提供对序列的索引访问,但不保证其性能。