【问题标题】:Why the complexity of this algorithm is O(n log(n)))?为什么这个算法的复杂度是 O(n log(n)))?
【发布时间】:2021-11-11 06:24:47
【问题描述】:

我有一个带有正数的多集 S,我想将它划分为 K 个子集,以便最小化分区总和之间的差异。解决上述问题的一种简单启发式方法是贪心算法,它遍历按降序排序的数字集,将它们中的每一个分配给具有较小数字总和的子集。我的问题是为什么这个贪心算法的时间复杂度是 O(nlog(n))?

【问题讨论】:

  • O(n log n) 是对数字列表进行排序的成本。
  • 谢谢。这种排序看起来像合并排序吗?我在排序列表上有一个 for 循环,所以它是 log(n) 复杂度。但我不明白为什么找到最小的数字总和具有 O(logn) 复杂度。
  • 你使用什么排序算法并不重要。最好的采用 O(n log n)。找到最小的数字总和需要 O(log K),但你必须这样做 n 次,所以 O(n log K) 一起。查看@trincot 的回答

标签: algorithm time-complexity


【解决方案1】:

确定“哪个子集的数字总和较小” 将在当前子集的数量上花费对数时间。您需要实现某种优先级队列或堆,以便以如此高的时间复杂度有效地执行此操作。在最坏的情况下,您的集合数将为 O(?),因此在处理每个输入值时,您会得到以下搜索时间复杂度:

O(log(1) + log(2) + log(3) + ... + log?)

= O(log?!)

= O(?log?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 2021-06-22
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多