恐怕我们手边有些虐待狂的老师,因为老实说我不理解这个问题,也从未在教科书中找到答案,也没有在互联网上搜索。
“ 2。如果列表已经排序,那么如何利用这些信息来改进线性搜索技术?在线性搜索算法中显示您的改进。”
据我所知,线性搜索只有一项工作,它正在按顺序检查每个元素。如何改进?我所知道的是线性搜索Big-O表示法是O(n),并且O(n)是最差情况的性能,因为该元素位于列表或数组的最后。我打算通过切换到二进制搜索来回答这个问题,但后来我发现二进制搜索将花费更长的时间,因为它需要n / 2次来定位,n / 4,n / 8并进行线性搜索。尽可能多的时间。
让我知道,如果我以错误的方式得到这个问题,或者我对此有所遗漏。感谢您的帮助。
答案 0 :(得分:3)
我发现二进制搜索将花费更长的时间,因为它需要n / 2次来定位,n / 4,n / 8并进行搜索,而线性搜索将花费相同的时间。
这取决于List::get(int)
是O(1)
操作还是O(N)
操作。这取决于列表类。
对于LinkedList
,它是O(N)
。从列表的开头开始,调用get(i)
必须链接i
次。
对于ArrayList
,它是O(1)
。调用get(i)
只是列表元素数组上的array[i]
操作。
在get
为O(1)
的假设下重做二进制搜索的计算,并且(如果您的分析是正确的,并且您对二进制搜索的理解是正确的),您应该得到O(logN)
使用二进制搜索按值查找。
(但是,是的,相对于线性搜索,链表上的二进制搜索不是一种优化。鉴于线性搜索为O(N^2)
,它会是O(N)
-一种反优化)。>
恐怕我们手上有些虐待狂的教员。
可能。另一种解释是,讲师试图鼓励您自己动手做事,从而提高分析思维能力。这包括找出错误,包括可能做出的错误假设。有时,学习基本错误的最佳方法是“艰难的方法”。