【发布时间】:2020-10-08 14:00:41
【问题描述】:
我有下一个任务。
给定整数 n (1 <= n <= 1000000) 和 k (1 <= k <= n)。
需要找到整数1, 2, 3, ..., n的任何排列p,使得排列中每两个连续整数之间的绝对差为>= k,即对于所有i的排列p需要abs(p[i] - p[i + 1]) >= k .
如果给定的n 和k 不存在这样的排列,则输出Impossible。
原始在线任务是波斯语,这就是我不提供链接的原因。
我已经实现了下一个代码。但是解决上述任务非常慢。如何提高它的速度?
from itertools import permutations
n,k=input('').split(' ')
n=int(n);k=int(k)
def check(n,k):
n=list(n)
N=n[:]
result=[]
b=n.pop(0)
while n:
if abs(b-n[0]) >= k:
result.append(True)
b=n.pop(0)
if len(result)+1 == len(N) and all(result):
return True
else:
return False
def solver(n,k):
return (i
for i in (permutations(range(1,n+1)))
if check(i,k)
)
try:
aaa=next(solver(n,k))
for i in aaa:
print(i,end=' ')
except :
print("Impossible")
【问题讨论】:
-
我不得不从代码中删除大量空白以保持可读性。请检查这是否在逻辑上仍然与您的代码匹配。
-
您能否说明您的速度目标是什么?该代码中存在 巨大 性能错误,例如破坏性地迭代列表,复制整个列表以保留其长度,并检查整个列表,即使它已经被拒绝。到目前为止,您是否尝试过任何优化?你真的想优化排列,还是只是求解器?
-
其实,这是一道数学题。在这个程序中,有一个从 1 到 n 的数字列表,我必须对这个列表进行排序,使每行中的每两个数字至少有 (k) 个差异。例如,如果我有这样的列表 [1,2,3,4,5] =》这个程序必须给我这样的列表 [1,3,5,2,4] 。您可以看到 1 和 3 有 2 个单位的差异。 (abs(1-3)=2) and abs(3-5)=2 and abs(5-2)=3 (至少k=2) and abs(2-4)=2。因为这个问题在数学上对我来说很难,所以我选择排列。
-
@mohamadmahdi 我想我已经解决了你在my answer 中处理大
n的任务。阅读整个答案文本。 -
@mohamadmahdi 数学问题总是通过耗尽其数学属性来最快地解决。我的问题是您是否关心当前的方法没有穷尽这些属性来简化方法,或者是否还有一种完全不同的方法也在范围内。
标签: python performance permutation