我对性能分析感到困惑 binarySearch 来自 集合
它说:
如果指定的列表未实现RandomAccess接口 并且很大,这个方法会做一个基于迭代器的二进制搜索 执行O(n)链接遍历和O(log n)元素比较。
我不知道如何解释这一点 O(n) + O(log n)。
我的意思是,这不仅仅是简单地遍历链表并进行比较吗?我们仍然只有 O(n)。
那么这句话对绩效意味着什么呢?如上所述,我无法理解与链表中的简单线性搜索的区别。
我在这里误解了什么?
我对性能分析感到困惑 binarySearch 来自 集合
它说:
如果指定的列表未实现RandomAccess接口 并且很大,这个方法会做一个基于迭代器的二进制搜索 执行O(n)链接遍历和O(log n)元素比较。
我不知道如何解释这一点 O(n) + O(log n)。
我的意思是,这不仅仅是简单地遍历链表并进行比较吗?我们仍然只有 O(n)。
那么这句话对绩效意味着什么呢?如上所述,我无法理解与链表中的简单线性搜索的区别。
我在这里误解了什么?
首先,你必须明白没有 RandomAccess 接口 binarySearch 不能简单地从列表中访问随机元素,而是必须使用迭代器。那介绍 O(n) 成本。当集合实现时 RandomAccess,每个元素访问的成本是 O(1) 就渐近复杂性而言,可以忽略不计。
因为 O(n) 大于 O(log n) 它总是优先于 O(log n) 并支配复杂性。在这种情况下 binarySearch 具有与简单线性搜索相同的复杂性。 那有什么好处呢?
线性搜索执行 O(n) 比较,而不是 O(log n) 同 binarySearch 没有随机访问。这在常数之前尤为重要 O(logn) 高。用简单的英语: 当单个比较与推进迭代器相比具有非常高的成本时。这可能是非常常见的情况,因此限制比较的数量是有益的。利润!
首先,你必须明白没有 RandomAccess 接口 binarySearch 不能简单地从列表中访问随机元素,而是必须使用迭代器。那介绍 O(n) 成本。当集合实现时 RandomAccess,每个元素访问的成本是 O(1) 就渐近复杂性而言,可以忽略不计。
因为 O(n) 大于 O(log n) 它总是优先于 O(log n) 并支配复杂性。在这种情况下 binarySearch 具有与简单线性搜索相同的复杂性。 那有什么好处呢?
线性搜索执行 O(n) 比较,而不是 O(log n) 同 binarySearch 没有随机访问。这在常数之前尤为重要 O(logn) 高。用简单的英语: 当单个比较与推进迭代器相比具有非常高的成本时。这可能是非常常见的情况,因此限制比较的数量是有益的。利润!
二进制搜索不适用于链接列表。该算法应该受益于 随机访问排序的集合 (像一个普通的数组),它可以快速地从一个元素跳转到另一个元素,在每次迭代时将剩余的搜索空间分成两部分(因此 O(log N) 时间复杂度)。
对于链表,有一个修改版本,它遍历所有元素(需要经过 2n 最糟糕的情况下的元素),但它不是比较每个元素,而是仅仅在指定的位置“探测”列表(因此数量较少) 对比 与线性搜索相比)。
由于与普通指针迭代相比,比较通常略微昂贵,因此总时间应该更低。这就是为什么 log N 部分分别强调。