比python中的嵌套循环更快的搜索方式

时间:2015-05-03 21:46:16

标签: python performance optimization nested-loops mathematical-optimization

我正在尝试为数组找到最低预期成本的最佳顺序。

输入是:

input = [[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]

这是一个包含四个选项的数组,第一个数字是成本,第二个数字是获得结果的概率,第一个([i][1])是分子,第二个是{{1 }}是分母。

目标是找到这些价值/概率对的最佳顺序,以最低的总成本提供结果。

[i][2]

运行:

def answer(input):

    from itertools import permutations

    length = len(input)
    best_total = 999
    for combination in permutations(input):
        # print combination
        total = 0.0
        for i in range(0, length):
            current_value = 1.0
            for j in range(0, i):
                current_value = current_value * (1.0 -  \
                (float(combination[j][1]) / float(combination[j][2])))
            total = total + (float(combination[i][0]) * current_value)
            if total > best_total:
                i = length
        # print total
        if total <= best_total:
            best_total = total
            best_combination = combination

    answer = map(input.index, best_combination)

    return answer

应该返回

print answer(input)

用于给定的输入。

这显然是一次详尽的搜索,只要有四个以上的选择就会很快变得很慢。我已经考虑过二叉搜索树,因为它们的输入非常相似,但我无法弄清楚如何实现它。

我已经为此工作了四天,似乎无法提出适用于任何输入的快速版本(假设成本和概率都是正确的)。

这不是作业或其他任何东西,只是我一直想弄清楚的谜题。

1 个答案:

答案 0 :(得分:1)

我将确定原始数组中每个案例的值,存储这些值,然后对列表进行排序。这是在python 3中,所以我不知道这是否会影响你。

确定原始数组中每个案例的值并存储它们:

inputA = [[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]
results = []
for idx,val in enumerate(inputA):
    results.append((val[0]*val[1]/val[2], idx))

对列表进行排序,提取位置:

l = lambda t:t[1]
print(list(map(l,sorted(results,reverse=True))))

对列表进行迭代为O(n),排序为O(nlogn)。地图/列表/打印再次对O(n)进行迭代,因此效果应为O(nlogn)