algorithm - Karmarkar-karp 差分算法如何工作?

标签 algorithm

谁能给我 karmarkar-karp 差分算法的伪代码,我不明白。如果有它的可视化/演示就更好了。

最佳答案

它也以降序排列数字开始。

这里是列表[8,7,6,5,4]的排序结果

在每一步,算法都会将两个最大的数字放在不同的子集中,同时推迟决定每个数字将进入哪个子集。
在上面的例子中,如果我们将 8 放在左子集中,将 7 放在右子集中,这相当于将它们的差值 1 放在左子集中,因为我们可以减去 7 来自两个子集而不影响最终差异。同样,放置 8 在右子集中放置 7,在左子集中放置 7 相当于将 1 放置在 右子集。 该算法删除两个最大的数字,计算它们 差异,然后像对待任何其他数字一样对待差异 分配,将其按排序顺序插入剩余的数字列表中。 该算法继续删除两个最大的数字,将它们替换为 他们在排序列表中的差异,直到只剩下一个数字,这 是最终子集差异的值。

例如,给定排序后的整数 (8,7,6,5,4),将 8 和 7 替换为它们的差值 1,将其插入剩余列表中,得到 在(6,5,4,1)中。接下来,将 6 和 5 替换为它们的差值 1,得到 (4,1,1)。4 和 1 被它们的差值 3 代替,得到 (3,1),并且 最后这两个数的差就是最终的子集差 2. KK启发式算法在这种情况下也未能找到最优分区,但比贪心启发式算法做得更好。

号码分区问题 Download PDF

关于algorithm - Karmarkar-karp 差分算法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3889783/

相关文章:

c++ - 如何使用 std::sort 以 'custom' 方式就地对数组进行排序

识别 "fuzzily-connected"子图的算法

algorithm - 1秒解决16皇后问题

c++ - 对阶乘和多项式的组合进行数值计算

Javascript:对长度为 N 的数组进行排序并获得前 m 的最佳方法

c++ - 基于学习内容的视频搜索的起点

algorithm - 数值优化和最小化

algorithm - 创建色轮的函数

algorithm - 近线性时间内均匀分布的随机拓扑排序

c++ - 如何确定图是否具有非唯一拓扑排序