使用itertools.permutation时在此python中获取超时错误?请告诉我如何减少此程序执行所需的时间

使用itertools.permutation时在此python中获取超时错误?请告诉我如何减少此程序执行所需的时间,python,algorithm,Python,Algorithm,还有一个极大极小问题 给你非负整数。我们将某些长度排列()的分数定义为的最大值 找到具有最小可能分数的排列并打印其分数 注意:是异或(XOR)运算符 代码: 输出: 8 如何减少此代码所需的时间让I成为最大的自然数,这样一些但不是所有的输入数都设置了位I。最小分数将是a异或b的最小值,其中a设置了位i,而b未设置,a和b在输入列表中。很容易看出分数必须至少这么大(因为在任何排列中的某个点上,必须有一个位i设置的数字与一个位i设置的数字相邻),任何一种排列方式,首先将所有输入分组,设置位i,然后

还有一个极大极小问题 给你非负整数。我们将某些长度排列()的分数定义为的最大值

找到具有最小可能分数的排列并打印其分数

注意:是异或(XOR)运算符

代码:

输出:

8

如何减少此代码所需的时间

I
成为最大的自然数,这样一些但不是所有的输入数都设置了位
I
。最小分数将是
a异或b
的最小值,其中
a
设置了位
i
,而
b
未设置,
a
b
在输入列表中。很容易看出分数必须至少这么大(因为在任何排列中的某个点上,必须有一个位
i
设置的数字与一个位
i
设置的数字相邻),任何一种排列方式,首先将所有输入分组,设置位
i
,然后将不设置位
i
的输入分组,并将
a
b
从上到下在边界处放在一起,就可以精确地获得该分数(因为
a异或b
i
作为其最高位,而所有其他相邻数字的最高位都小于
i


即使不进一步思考,这也会将问题简化为一个O(n^2)问题,这应该足够好了,因为在codereview中这可能会更好
10
12 0 4 3 1 1 12 3 11 11
8
def minxor(aa):
    bits = unbits = 0
    for a in aa:
        bits |= a
        unbits |= ~a
    i = bits & unbits
    while i & (i-1):
        i &= i-1
    xs = [a for a in aa if a & i]
    ys = [a for a in aa if (a & i) == 0]
    return min(x ^ y for x in xs for y in ys)

print minxor([1, 2, 3, 4])
print minxor([1, 2, 3])
print minxor([7, 6, 5, 4])
print minxor([12, 0, 4, 3, 1, 1, 12, 3, 11, 11])
def bestpair(xs, ys, i):
    if i == 0:
        return 0
    x0 = [x for x in xs if (x&i)==0]
    x1 = [x for x in xs if x&i]
    y0 = [y for y in ys if (y&i)==0]
    y1 = [y for y in ys if y&i]
    choices = []
    if x0 and y0:
        choices.append(bestpair(x0, y0, i//2))
    if x1 and y1:
        choices.append(bestpair(x1, y1, i//2))
    if choices:
        return min(choices)
    return bestpair(xs, ys, i//2) + i

def minxor(aa):
    bits = unbits = 0
    for a in aa:
        bits |= a
        unbits |= ~a
    i = bits & unbits
    while i & (i-1):
        i &= i-1
    return bestpair([a for a in aa if a & i], [a for a in aa if (a & i)==0], i)

print minxor(range(100000))