【问题标题】:Difference between all sub-combinations of array, the most efficient way数组的所有子组合之间的差异,最有效的方法
【发布时间】:2021-01-25 18:02:44
【问题描述】:

我们有一个数组列表说 [1, 2, 3, 4],我想要所有组合之间的差异,即。 对于 [1, 2, 3, 4] -> 1, 1, 2, 1, 2, 3 即(2-1)、(3-2)、(3-1)、(4-3)、(4-2)和(4-1)

我已经编写了高复杂度的低效代码。我需要一个 C++ 或 Python 复杂度较低的高效解决方案。

【问题讨论】:

    标签: python c++ algorithm performance time-complexity


    【解决方案1】:

    您可以使用 itertools.combinations 来简化您的代码,该代码完全符合您的要求。

    diffs = [y - x for x, y in itertools.combinations(list, 2)]

    可能有一些非常复杂、聪明的算法可以在 O(n log n) 内完成此操作,但任何“正常”算法都必须查看每一对元素,并且有 n (n + 1 ) / 2 个这样的对。

    ============== 为线性解决方案编辑====

    好的。只需确认您是专门要求差异,而不是解决方案中差异的绝对值。如果您正在寻找他们的总和,而不仅仅是列表,您可以做一些数学运算。

    查看列表[a, b, c, d]。你要 (b - a) + (c - a) + (d - a) + (c - b) + (d - b) + (d-c) 简化为-3*a - b + c + 3*d

    很容易概括并看到对于 n 个元素的列表,乘数是 -(n-1), -(n - 3), .... n-3, n-1 所以你有

    n = len(list)
    sum(value * multiplier for value, multiplier in zip(list, range(-n+1, n, 2))```
    

    【讨论】:

    • 能否简化最后一行,举个例子。说[1,2,3,4]。我应该写什么?
    【解决方案2】:

    结果大小为n*(n-1)/2,其中n是列表大小,因此两个for循环解决方案是最佳的一个

    for i in range(len(A)):
        for j in range(i+1, len(A)):
            diffs.append(A[j] - A[i])
    

    【讨论】:

    • 是的,我目前正在使用这个,这个不能更好吗?
    • 没有。正如我所说,我们需要形成所描述大小的结果(如问题中所述)
    • 我想问另一个关于算法和几何的问题,但 stackoverflow 不允许我问。我可以在这里问你这个问题吗?请。
    • 不,网站规则只允许主题中的一个问题。我想你必须等待一段时间作为新用户(小声誉)提出新问题。
    • 不,我的意思是,在 cmets 中向您提问,您是否可以?我只需要概述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多