【问题标题】:faster algorithms for minimum maximum contiguous k partition最小最大连续 k 分区的更快算法
【发布时间】:2013-01-17 13:07:57
【问题描述】:

我正在阅读此http://www.cas.mcmaster.ca/~terlaky/4-6TD3/slides/DP/DP.pdf 并想知道是否存在对分区问题具有更好时间复杂度的解决方案。

来自链接:

"假设给定的非负数排列 S {s1,...,sn} 和一个整数 k。如何 S 到 k 或更少的范围, 以最小化所有范围内的最大总和?”

例如

S = 1,2,3,4,5,6,7,8,9

k=3

通过将 S 分成这 3 个范围,最大范围 (8,9) 之和为 17,这是可能的最小值。

1,2,3,4,5|6,7|8,9

链接中建议的算法在 O(kn^2) 中运行并使用 O(kn) 空间。有没有更高效的算法?

【问题讨论】:

  • 这是一个动态规划问题。它不是在指数时间内运行,而是将解决方案优化为仅在多项式时间内。这很好,所以我认为您不必寻找“更有效”的解决方案

标签: algorithm partitioning


【解决方案1】:

好吧,显然这是因为“离题”而被关闭!? 但它现在已经备份,所以无论如何,我发现解决方案是二进制搜索答案。抱歉,我忘记了其中一个限制条件是所有整数的总和不会超过 2^64。所以让C =所有整数的累积和。然后我们可以使用二分查找答案

bool isPossible(int x)

如果可以将 S 分成 k 个分区且最大分区总和小于 X,则返回 true 的函数。 isPossible(int x) 可以在 O(n) 中完成(通过从左到右添加所有内容,如果超过x 创建一个新分区)。所以总运行时间是O(n*log(s))。

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 2023-02-10
    • 2022-12-20
    • 2011-12-27
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多