1

我和其他人一样一直在努力解决这个问题,我很确定已经有足够多的帖子来解释这个问题。然而,就完全理解它而言,我想分享我的想法,并从这里所有与子集和问题相关的伟大人物那里获得更有效的解决方案。

我在互联网上搜索过它,实际上有很多来源,但我真的很愿意重新实现一个算法或找到我自己的算法以便完全理解。

我正在努力解决的关键问题是考虑到集合大小会很大的效率。(我没有限制,只是在概念上很大)。我试图实现想法的两个阶段是找到两个等于给定整数T的数字,找到三个数字并最终找到K个数字。我有一些想法;

对于两个整数部分,我基本上对数组O(nlogn)进行排序,并为数组中的每个元素搜索其负值。(即如果数组元素是3搜索-3)。也许哈希表包含可能会更好,提供O(1)索引元素?

对于三个或更多整数,我发现了一篇很棒的博客文章;http://www.skorks.com/2011/02/algorithms-a-dropbox-challenge-and-dynamic-programming/。然而,即使是作者自己也表示它不适用于大量数据。

所以我对23 以及更多的整数有什么想法可以应用于子集问题。我正在努力建立一种对大输入也有效的动态编程方法。

4

1 回答 1

1

实际上,您链接到的那篇博客文章看起来非常棒。毕竟,这是一个 NP 完全问题......

但我敢打赌,你可以进一步加快速度。我没有做过任何基准测试,但我猜他对矩阵的使用是他最大的时间消耗。首先,一些非常琐碎的输入会占用大量内存(例如:[-1000, 1000] 需要 2001 列!天哪!),然后你浪费了大量的周期扫描每一行寻找"T"s,这通常会非常稀疏。

所以改为:使用“集合”数据结构。这会将空间和迭代时间保持在最低限度,* 但也可以存储值:如果它在集合中,它就是"T"; 否则,它是一个"F".

希望有帮助!

*:当然,“最小”不一定=“小”。

于 2012-06-09T22:34:37.657 回答