精简版:
我有一个LinkedList
个n
个随机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)元素比较。LinkedList
和AbstractList
不实现RandomAccess
。