排列太慢的Python程序,加速程序的任何方法?

时间:2016-11-29 22:03:17

标签: python coding-efficiency

https://www.ksp.sk/ulohy/zadania/1238/问题链接(斯洛伐克语)

最简单的英文翻译:第一个名为signlist的变量是未定义数字“<”的输入和“>”符号。名为n的第2个是signlist + 1的长度,因为它是在这些符号之间的数字量(例如2> 1< 3,signlist有2个符号,n是3,数字是范围的列表1-n + 1排他性)。 我应该打印出符号的正确数字顺序(例如输入>>>的4 3 2 1。)
我的代码有效,但根据网站的说法很慢。 注释掉的是第一个基于列表复杂性的版本。

#combinations(ofwhat,howmanychars)

from itertools import permutations
signlist = [l for z in input() for l in z]
n = len(signlist)+1
ListOfCorrect = [i for i in permutations(range(1,n+1),n) if eval(("{}".join(str(y) for y in i)).format(*signlist))]
print(*ListOfCorrect[0],sep = " ")

#for i in permutations(range(1,n+1),n):
#    forstring1 = ("{}".join(str(y) for y in i)).format(*signlist)
#    if eval(forstring1):
#        print(" ".join(str(y) for y in i))
#        break

#x = list(permutations(range(1,n+1),n))

1 个答案:

答案 0 :(得分:0)

我怀疑你最可控制的减速来源正在建立这么大的名单。相反,单独进行排列。按顺序处理每个表达式(当 N 很大时,应节省时间);或者,生成所有表达式的列表,并使用全部缩减来点击它们。

对于大型列表而言,更好的方法是获取数字1-n列表和运算符列表。在每个级别,将列表拆分为该运营商的合法和非法未使用的号码。重申法律清单的每个要素。

例如,我们假设您已经使用[2,3,4,7,8]和当前字符串“5<>><>”进行了调用。您现在只需要接受数字 x ,以便 5< X 即可。你拿左边的部分,然后重复2,3和4中的每一部分。第一个看起来像:

public void fooMethod2() {
    /*myTreeView is also an insance variable*/
    myTreeView = new TreeView<String>();

    CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>();
    CheckBoxTreeItem<String> branch1 = new CheckBoxTreeItem<>("Branch 1");
    CheckBoxTreeItem<String> branch2 = new CheckBoxTreeItem<>("Branch 2");
    CheckBoxTreeItem<String> branch3 = new CheckBoxTreeItem<>("Branch 3");

    root.getChildren.add(branch1);
    root.getChildren.add(branch2);
    root.getChildren.add(branch3);

    myTreeView.setCellFactory(CheckBoxTreeCell.forTreeView());
    myTreeView.setRoot(root);
    myTreeView.setShowRoot(false);
    myTreeView.setEditable(true);
}

这会失败;下一个是

place_nums( [3, 4, 7, 8], "2>><>" )

看看它是如何工作的?平均而言,您将在每个级别重复使用一半元素,并在必须生成所有排列之前修剪死角。

这是否足以让你在递归算法上取得进展?