精简版:

我有一个LinkedListn个随机Integer升序。
如果我在该列表上使用Collections.binarySearch,则对我尝试过的任何n都可以正常使用。
但是,当用LinkedList包裹AbstractList时,对于n>10000,二进制搜索开始表现得很奇怪。
而不是运行适当的二进制搜索,它只是遍历整个列表。



长版:

我有一个"file",其中包含按升序排列的随机数,其中每一行都包含一个数字。
我想对该"file"进行二进制搜索并找到给定数字的索引(或"line number")。

一个简单的解决方案是读取整个文件,并将每个数字放在LinkedList中,然后在该Collections.binarySearch上使用LinkedList

现在,可以说我得到的信息是,从"file"读取一行是一项昂贵的操作。

为了尽量减少阅读"file"的时间,我试图做的是“模拟”该LinkedList,并使用一个AbstractList,其中每次在该get(int index)中使用AbstractList时,从index读取"file"行。

当我的AbstractList大小为<1000时,这似乎工作得很好,当我尝试更大的列表时,二进制搜索似乎停止工作,并且仅遍历所有AbstractList(从第一个节点到最后一个节点) )。



我似乎已将问题缩小为使用带有Binary Search的大型AbstractList。
我不知道为什么会这样,并希望获得帮助。

我提供了“长版”,以防有人可以提出其他解决方案。

谢谢!

最佳答案

Javadoc to the rescue


  [binarySearch]以log(n)时间运行以获取“随机访问”列表(该列表提供了近恒定时间的位置访问)。如果指定的列表未实现RandomAccess接口并且很大,则此方法将执行基于迭代器的二进制搜索,该搜索执行O(n)链接遍历和O(log n)元素比较。


LinkedListAbstractList不实现RandomAccess

09-11 18:50