我需要编写一个程序来搜索以前排序的链表,而且我不确定哪个搜索会更有效。
答案 0 :(得分:0)
链接列表的所有遍历都是有序的,因此线性搜索是您可以做的最好的,平均情况是元素数量的线性。如果要进行大量搜索并且您仍然需要链接列表(而不是诸如数组之类的随机访问结构),请考虑跳过列表,该列表允许您向前跳过,直到接近所需元素。
答案 1 :(得分:0)
线性搜索会更有效率,这就是原因。
为了到达大小为 n 的双向链表中的第k个位置,你必须迭代最多n / 2个元素。
如果您要在其上应用二进制搜索,那么您每次都必须关闭 k 元素,以及执行二进制搜索的工作。
O(n + log(n))= O(n),相当于线性搜索的性能。
答案 2 :(得分:0)
如果您的比较便宜,其他答案是正确的,线性和二进制搜索大部分是等价的(二进制搜索具有稍高的预期节点遍历数,尽管big-O是相同的,O(n)
遍历)
但是这假设比较相对于遍历的比较可以忽略不计。这并不总是一个好的假设。如果您的比较很昂贵,那么二分搜索仍然值得,因为二进制搜索在比较次数上仍为O(log n)
,而线性搜索为O(n)
。例如,如果您的比较操作非常昂贵(例如,文件数据的MD5哈希值,并且由于某种原因您没有使用文件名缓存它),并且您有1000个元素列表,则线性搜索意味着平均来说,你计算500个文件的MD5哈希值(在这种情况下,根据你要搜索的MD5是否以0-7
开头,你可以通过选择结束来减少它。或8-f
,但即便如此,它的O(n)
比较除以常数因子)。二进制搜索意味着最多10个(或11个,不能被一个一个错误打扰)文件读取和MD5计算。如果文件足够大,那就是需要大约1秒钟才能运行并花费大约50秒。