【发布时间】:2017-07-14 03:50:45
【问题描述】:
所以最近我遇到了这个编程问题,我似乎无法降低复杂性(我当前的代码在 O(n^2) 中运行)。
基本上,我有四个不同的整数列表(我正在使用 python btw),包括正数和负数,比如列表 A、B、C、D。现在,这些列表中的每一个都有 1000 个整数,并且这些整数范围从 -25000 到 25000(含)。现在,假设我们从这些列表中的每一个中选择一个整数,比如 a、b、c、d。我想要找到这些 a、b、c、d 的最快方法,使得 a+b=-(c+d)。
目前,我的方法依赖于迭代 a、b 和 c、d 的每个可能的组合,然后尝试查找集合 (a+b) 中的元素是否存在于集合 -(c+d )。这当然是不切实际的,因为它在 O(n^2) 时间内运行,考虑到大列表大小 (1000) 更是如此。
因此我想知道是否有人能想到一种更有效的方法(最好是 O(n log n) 或更小),如果可能的话,用 python 编码。
抱歉,如果它相当混乱。如果您有任何问题,请告诉我,我会尽力提供更多澄清。
编辑:
这个问题是一个更大问题的一部分。更大的问题是,如果我们有 4 个数字序列,每个序列最多有 1000 个整数,比如 A、B、C、D,找到一个 a、b、c、d 使得 a+b+c+d=0。
我问了上面的问题,因为 a+b+c+d=0 意味着 a+b=-(c+d),我认为这会导致解决问题的最快方法。如果有人能想到更快的方法,请与我分享。
提前致谢! :)
【问题讨论】:
-
您是否正在寻找适用于该条件的所有组合?
-
是的,就是这样。可以保证至少会有 1 个这样的组合。
-
在最坏的情况下,当 C = -A 且 D = -B 时,您将有 Θ(n^2) 解,因此您的算法至少需要 n^2 步才能产生输出。
-
嗯,如果是这样的话,那么这个解决更大问题的算法可能是错误的......我会去提供更多的上下文。
-
您可以尝试的一件事是对列表进行排序并使用该标准搜索其他两个数组中的元素。这可能会帮助您获得 O(nlogn) 解决方案。
标签: python arrays algorithm big-o