【发布时间】:2017-04-20 22:20:02
【问题描述】:
短版:
我有一个LinkedList 和n 随机Integers,按升序排列。
如果我在该列表中使用Collections.binarySearch,它适用于我尝试过的任何n。
但是,当我用 AbstractList 包装 LinkedList 时,对于 n>10000,二进制搜索开始表现得非常奇怪。
它不是运行正确的二分搜索,而是遍历整个列表。
加长版:
我有一个"file",其中包含按升序排列的随机数,其中每一行包含一个数字。
我想对 "file" 进行二分搜索并找到给定数字的索引(或 "line number")。
对此的简单解决方案是读取整个文件并将每个数字放入LinkedList,然后在LinkedList 上使用Collections.binarySearch。
现在,假设我得到的信息是从 "file" 读取一行是一项昂贵的操作。
为了尽量减少阅读"file" 的时间,我尝试做的是“模拟”LinkedList,并在每次我使用get(int index) 时使用AbstractList 在那个@987654340 @ 我刚刚从"file" 中读到index 行。
当我的AbstractList 大小为<1000 时,这似乎工作得很好,当我尝试更大的列表时,二进制搜索似乎停止工作,并且只是迭代所有AbstractList(从第一个节点到最后)。
我似乎已将问题缩小到使用带有二进制搜索的大型 AbstractList。 我不确定为什么会发生这种情况,希望得到一些帮助。
我已经包含了“长版”,以防有人能够提出其他解决方案。
谢谢!
【问题讨论】:
-
为什么有理智的人会对
LinkedList进行二分搜索? -
我只使用了 LinkedList 来模拟我的“文件”。您可以将我描述中的 LinkedList 更改为数组。我在使用 AbstractList 而不是 LinkedList 时会出现问题。
-
使用更好的“文件”。
LinkedList具有O(n)get()- 这与完全遍历相同。因此,您的“二进制搜索”并不比逐行读取文件并查找项目好 - 实际上它更糟糕!这种方法比您的“模拟”有更深层次的问题。没有人。绝对没有人做二进制在磁盘上搜索。 -
@BoristheSpider ,数组列表上的二进制搜索非常快。测试花了很长时间,但我以随机顺序取出所有 1000 万个对象,平均每次获取 1.1300091 毫秒。对于 1Meg 对象,平均为 0.056 毫秒。
-
@oldercoder 我并不否认二分搜索很快。我的意思是对具有
O(n)get的集合进行二分搜索非常慢。
标签: java linked-list abstract binary-search