搜索排序的链表时,二进制或顺序/线性搜索是不是更有效?
Posted
技术标签:
【中文标题】搜索排序的链表时,二进制或顺序/线性搜索是不是更有效?【英文标题】:Is a binary or sequential/linear search more efficient when searching a sorted linked list?搜索排序的链表时,二进制或顺序/线性搜索是否更有效? 【发布时间】:2014-05-18 19:16:01 【问题描述】:我需要编写一个程序来搜索之前排序的链表,但我不确定哪种搜索效率更高。
【问题讨论】:
如果您想利用排序列表,更好的选择是使用 ArrayList。 【参考方案1】:链表的所有遍历都是按顺序进行的,因此线性搜索是您能做的最好的事情,平均情况与元素数量呈线性关系。如果要进行大量搜索并且您仍然需要一个链表(而不是像数组这样的随机访问结构),请考虑使用跳过列表,它可以让您向前跳过直到靠近所需的元素。
【讨论】:
【参考方案2】:线性搜索会更有效,原因如下。
为了到达大小为 n 的双向链表中的第 k 个位置,您最多必须迭代 n/2 个元素。
如果您要在此基础上应用二分搜索,那么您最终将不得不每次遍历 k 个元素,再加上执行二分搜索的工作。
O(n + log(n)) = O(n),相当于线性搜索的性能。
【讨论】:
【参考方案3】:如果您的比较便宜,则其他答案是正确的,线性搜索和二进制搜索大多是等效的(二进制搜索的预期节点遍历数略高,尽管 big-O 是相同的,O(n)
遍历)。
但这假设比较相对于遍历而言是可以忽略不计的成本。这并不总是一个好的假设。如果您的比较成本很高,那么二进制搜索仍然是值得的,因为在比较次数上二进制搜索仍然是 O(log n)
,而线性搜索是 O(n)
。例如,如果您的比较操作非常昂贵(例如,文件数据的 MD5 散列,并且出于某种原因您没有将其与文件名一起缓存),并且您有一个 1000 个元素的列表,线性搜索意味着平均而言,您正在计算 500 个文件的 MD5 哈希(在这种情况下,您可以根据您要搜索的 MD5 是否以 0-7
或 @ 987654325@,但即便如此,它是O(n)
比较除以常数因子)。二进制搜索意味着最多 10 个(或 11 个,不会被一个错误所困扰)文件读取和 MD5 计算。如果文件足够大,这就是运行大约 1 秒和大约 50 秒之间的差异。
【讨论】:
以上是关于搜索排序的链表时,二进制或顺序/线性搜索是不是更有效?的主要内容,如果未能解决你的问题,请参考以下文章