简短版本:
我有n
的LinkedList
随机Integer
s按顺序排列。
如果我在该列表上使用Collections.binarySearch
,则适用于我尝试过的任何n
。
但是,当我用AbstractList
包装LinkedList
时,对于n>10000
,二进制搜索开始非常奇怪。
它没有运行适当的二进制搜索,而只是在整个列表上进行迭代。
长版:
我有一个"file"
,其中包含升序顺序的随机数,其中每行都容纳一个数字。
我想二进制搜索"file"
并找到给定数字的索引(或"line number"
(。
一个微不足道的解决方案是读取整个文件并将每个数字放在LinkedList
中,然后在该LinkedList
上使用Collections.binarySearch
。
现在,可以说我的信息说从"file"
阅读一行是一个昂贵的操作。
我尝试做的事情,以最大程度地减少我必须阅读"file"
的时间,就是"模拟"该LinkedList
,并使用AbstractList
,每次我在该AbstractList
中使用get(int index)
时,我都会从"file"
读取index
。
当我的AbstractList
大小为<1000
时,这似乎很好,当我尝试更大的列表时,二进制搜索似乎停止工作,并且只是在所有AbstractList
上迭代(从第一个节点到最后一个节点(。/p>
我似乎已经将问题缩小到了使用二进制搜索的大型抽象列表。我不确定为什么会发生这种情况,并且会喜欢一些帮助。
我包括了"长版本"。如果有人可以建议另一种解决方案。
谢谢!
javadoc进行救援:
[
binarySearch
]在"随机访问"列表的日志时间(n(时间(提供近固定时间的位置访问(中运行。如果指定的列表未实现RandomAccess
接口并且很大,则此方法将进行基于迭代的二进制搜索,该搜索执行O(n(链接遍历和O(log n(元素比较。
LinkedList
和AbstractList
不要实现RandomAccess
。