Java 改进线性搜索技术?
恐怕我们手上有一点虐待狂教练,因为我真的不明白这个问题,也从来没有在课本上找到答案,也没有在网上搜索过 “2.如果列表已按顺序排序,您如何利用这些信息改进线性搜索技术?展示您对线性搜索算法的改进。” 据我所知,线性搜索只有一个任务,即按顺序检查每个元素。如何改进?我知道的是线性搜索Big-O表示法是O(n),并且O(n)是最差的情况性能,因为元素被放置在列表或数组的最后一位。我本来想通过切换到二进制搜索来回答这个问题,但后来我发现二进制搜索需要更长的时间,因为它需要n/2倍的时间来定位,n/4,n/8,然后继续,线性搜索也需要同样多的时间 如果我答错了这个问题,或者我遗漏了一些东西,请告诉我。谢谢你的帮助 我发现二进制搜索会花费更长的时间,因为它需要n/2倍的时间来定位,n/4,n/8,然后继续,线性搜索也会花费同样多的时间 这取决于Java 改进线性搜索技术?,java,Java,恐怕我们手上有一点虐待狂教练,因为我真的不明白这个问题,也从来没有在课本上找到答案,也没有在网上搜索过 “2.如果列表已按顺序排序,您如何利用这些信息改进线性搜索技术?展示您对线性搜索算法的改进。” 据我所知,线性搜索只有一个任务,即按顺序检查每个元素。如何改进?我知道的是线性搜索Big-O表示法是O(n),并且O(n)是最差的情况性能,因为元素被放置在列表或数组的最后一位。我本来想通过切换到二进制搜索来回答这个问题,但后来我发现二进制搜索需要更长的时间,因为它需要n/2倍的时间来定位,n/4,
List::get(int)
是O(1)
操作还是O(N)
操作。这取决于list类
- 对于
而言,它是链接列表
。调用O(N)
必须遵循从列表开头开始的链接get(i)
次数i
- 对于
而言,它是ArrayList
。调用O(1)
只是对列表元素数组的get(i)
操作array[i]
get
是O(1)
,并且(如果您的分析正确,并且您对二进制搜索的理解正确),您应该得到O(logN)
,以便使用二进制搜索按值查找
(是的,链表上的二进制搜索不是相对于线性搜索的优化。它将是O(N^2)
——一种反优化,因为线性搜索是O(N)
)
恐怕我们手上有点虐待狂教练
可能吧。另一种解释是,讲师试图通过让你自己解决问题来鼓励你提高分析思维能力。这包括找出你的错误,包括可能错误的假设。有时,从根本错误中吸取教训的最佳方法是“艰难的方法”。如果是链表,则可以选择不同的起点,然后定位中间元素确实需要O(n/2)。对于
ArrayList
来说,我只是做了O(1),正如我前面所说,对于排序列表,二进制搜索速度会越慢越好。您必须指定正在搜索的数据结构和所有其他因素,否则尝试优化是没有意义的。数学问题:列表是数字的,它是否受整数范围的限制?也就是说,如果已知您要排序的值仅为数字(例如,没有字典字符串或小数),则可以采用一种聪明的数学方法来优化该方法。