有一个知名站点声称我们不能在链表上进行二进制搜索,但我知道我们可以在链表上执行合并排序(它使用分区和征服就像二进制搜索一样),所以我们必须是能够在链表上执行二进制搜索吗?
答案 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个元素的列表中的第六个元素时,它会在返回第六个元素之前迭代前五个元素。通用接口提供对序列的索引访问,但不保证其性能。