Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 算法-在唯一对中分组列表_Python_Algorithm_Combinatorics_Minmax_Code Complexity - Fatal编程技术网

Python 算法-在唯一对中分组列表

Python 算法-在唯一对中分组列表,python,algorithm,combinatorics,minmax,code-complexity,Python,Algorithm,Combinatorics,Minmax,Code Complexity,我收到的作业让我有困难,我很确定问题的文本有缺陷。我把它翻译成: 考虑一个包含{1,2,…,m},m

我收到的作业让我有困难,我很确定问题的文本有缺陷。我把它翻译成:


考虑一个包含{1,2,…,m},m
For example, x = [1,5,9,3] can be paired in three ways:
(1,5),(9,3) => Sums: 6, 12 => Maximum 12
(1,9),(5,3) => Sums: 10, 8 => Maximum 10
(1,3),(5,9) => Sums: 4, 14 => Maximum 14
                              ----------
                              Minimum 10
Solution to be returned: (1,9),(5,3)

让我感到奇怪的是:

  • 表内容定义它表示有
    1..2n的元素,来自{1..m},m
    。但是如果
    m
    ,则没有足够的元素来填充列表而不复制某些元素,这是不允许的。那么我假设
    m>=2n
    。另外,这个例子有
    n=2
    ,但是使用了大于1的元素,所以我假设这就是它们的意思

  • O(n)复杂性?那么有没有一种方法可以将它们组合在一个循环中?我想不出什么


我的计算:

For n = 4:
Number of ways to combine: 6
Valid ways: 3

For n = 6
Number of ways to combine: 910
Valid ways: 15

For n = 8
Number of ways to combine: >30 000
Valid ways: ?
所以很明显,我不能使用暴力,然后再弄清楚它是否有效。我用来计算所有可能方法的公式是

C(C(n,2),n/2)

问题:

For n = 4:
Number of ways to combine: 6
Valid ways: 3

For n = 6
Number of ways to combine: 910
Valid ways: 15

For n = 8
Number of ways to combine: >30 000
Valid ways: ?

这个问题是否写错了,无法解决?如果是,应增加或取消哪些条件以使其可行?如果您打算推荐一些python代码,请记住我不能使用任何类型的预构建函数。谢谢

假设列表已排序:

def answer(L):
    return list(zip(L[:len(L)//2], L[len(L)//2:][::-1]))
或者,如果您想更手动地执行此操作:

def answer(L):
    answer = []
    for i in range(len(L)//2):
        answer.append((L[i], L[len(L)-i-1)]))
    return answer
输出:

In [3]: answer([1,3,5,9])
Out[3]: [(1, 9), (3, 5)]

append()
是一个预构建的函数。你不能用它吗?这又有什么关系呢?如果有人愿意解决你的作业,你能不能在没有“预建函数”的情况下重写它?@salvadodali嗯,这些都是允许的。我指的是那些做复杂计算的函数,它们取代了我需要做的事情。例如,我不能使用为我生成组合的东西。它并不是说没有重复项,只是列表中的每个元素都以一对出现。@PeterWood如果每个元素都以一对出现,你怎么会有重复项呢?不,没有悖论。你可以复制。你能自然地描述一下算法的手动版本吗?这样我就可以理解你的思维过程了?@Jadarma:你想要结果中所有组合的最小和最大值。当您组合两个中值元素(最小元素和最大元素)时,就会发生这种情况,以此类推。因此,如果列表已排序,则只需从任意一端开始组合元素,直到到达中间位置。然后返回组合任务列表,它确实有效!但这是将列表视为已排序的,如果没有排序,会发生什么?O(n)中没有排序算法。在这种情况下,它将如何解决?@Jadarma:我正在考虑,但它将是toughI。不过,我认为这是预期的解决方案。因为问题的某些方面仍然存在缺陷,例如示例本身正在打破的n