部分和查找/部分和集分配

Posted

技术标签:

【中文标题】部分和查找/部分和集分配【英文标题】:Partial sum lookup / partial sum set assignment 【发布时间】:2011-02-18 05:36:03 【问题描述】:

我有以下问题要解决。作为输入,我有 2 个十进制数组。两者的元素之和相等。实际问题是通过部分和将一个数组中的值分配给第二个数组 - 如果一个数组中的某个元素是第二个数组中任意数量元素的总和 - 它们应该相互分配。

样品1:

阵列 1:25.0、25.0、50.0、50.0 数组2:50.0、100.0

预期结果:50.0 是 25.0 和 25.0 之和,100.0 是 50.0 和 50.0 之和 (0->0,1; 1->2,3)

样本2:

阵列 1:20.0、70.0、80.0、130.0 数组2:100.0、200.0

预期结果: 100 = 20+80, 200 = 70+130 (0->0,2; 1->1,3)

想法是返回分配的数组元素索引并尽可能少地返回。

【问题讨论】:

你知道这个问题是NP完全的吗(例如:通过子集和)? 【参考方案1】:

这称为subset sum problem。

不幸的是,这是 NP 完全的,这意味着您必须检查所有可能的组合。

但是,如果您的问题只有少量的部分和(例如您的示例),那么请蛮力解决。


Moron 是正确的,并非所有 NP 完全问题都需要检查所有可能的组合。 不过我相信subset sum is one that does。

【讨论】:

"不幸的是,这是 NP-complete,意味着你必须检查所有可能的组合" .False. 您只是通过包含该链接来使您的案例变得更弱!据此,您只需检查 sqrt(M) 的顺序,其中 M 是总组合。 (2^(N/2) 与 2^N)。

以上是关于部分和查找/部分和集分配的主要内容,如果未能解决你的问题,请参考以下文章

硬盘分区问题:未分配的部分(黑色)和可用空间(绿色)有啥区别?怎样让未分配的部分变成可用空间?

内存分配算法

C 和 C++:释放已分配指针的一部分

在 .text 部分分配可写内存

动态存储管理

Golang内部构件,第6部分:自举和内存分配器初始化