【问题标题】:Shouldn't the average search time for a linked list be O(N/2)?链表的平均搜索时间不应该是 O(N/2) 吗?
【发布时间】:2013-12-27 00:16:55
【问题描述】:

我一直看到 the search time 列出的链表被列为 O(N),但如果列表中有 100 个元素,那么在找到匹配项之前,您不是平均只与其中的 50 个元素进行比较吗?

那么 O(N/2) 是四舍五入到 O(N) 还是我认为链表查找的平均 N/2 是错误的?

谢谢!

【问题讨论】:

  • 大 O 表示法中没有常数。
  • 这大大简化了事情,谢谢:)
  • 您还必须考虑找到没有匹配项所需的时间。这需要比较每个项目。
  • 这是您在设计时会考虑的,对吧?您不希望将链接列表用于搜索经常返回 false 的内容。

标签: algorithm data-structures linked-list big-o


【解决方案1】:

问题是,顺序实际上只是在谈论时间如何随着 n 的增加而增加。

所以O(N) 表示你有线性增长。如果你加倍N,那么所花费的时间也会加倍。 N/2N 都具有相同的增长行为,因此就订单而言,它们是相同的。

另一方面,log(N)N^2 等函数具有非线性增长,例如N^2 意味着如果将N 加倍,则所用时间会增加4 倍。

这都是关于比率的。如果一件事情平均需要 1 分钟,那么 2 件事情平均需要 2 分钟还是 4 分钟? O(N) 需要 2 分钟,O(N^2) 需要 4 分钟。如果原始需要 1 秒,那么 O(N) 将需要 2 秒,O(N^2) 需要 4 秒。

耗时1分钟的算法和耗时1秒的算法都是O(N)!

【讨论】:

  • 谢谢,我似乎确实记得在我脑后的某个地方,关于 O 表示法是关于上限和增长率的。因此,在谈论运行时间与大 O 表示法运行时间时,区分它们很重要。谢谢!
  • 吹毛求疵,O(N) 中的 f(N) 并不意味着线性增长。这意味着对于某些 k,它最终以 kN 为界。 log(N)是O(N),N+log(N)也是,N+cos(N)也是,都没有线性增长,
  • 我同意 N+cos(N) 是因为实际上它是宏观事物中的线性增长(cos(N) 始终具有从 0 到 1 的值,因此可以删除)。另一方面,N+log(N) 虽然肯定是 O(N+Log(N)),而不是 O(N)?
【解决方案2】:

其他答案提出了答案所需的要点,但我想补充一个细节:如果没有明确说明,复杂性陈述通常讨论最坏情况下的行为,而不是平均值,这仅仅是因为分析最坏情况的行为通常比平均行为容易得多。因此,如果我说,没有任何附加条件,在链表中搜索是 O(N),那么我承认我很草率,但我会谈论在链表中搜索的最坏情况,采用线性步骤在 N.

【讨论】:

    【解决方案3】:

    O 表示something。为了在链表中找到某些东西,需要遍历的平均元素数是 N/2。 N/2 = O(N)。

    请注意,说 在链表中搜索平均需要 n/2 次操作 是错误的,因为 操作 没有定义。我可以争辩说,对于每个节点,您需要读取它的值,将其与您正在搜索的内容进行比较,然后读取指向下一个节点的指针,因此该算法平均执行 3N/2 次操作。使用 O 表示法可以让我们避免这些无关紧要的细节。

    【讨论】:

    • @advocate,如果你想传达这样一个事实,即平均只有一半的列表会被阅读,O 符号对你没有帮助。
    猜你喜欢
    • 2014-05-07
    • 2019-12-13
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多