我有长度为3到25的数据列表,使用ascii(作为整数)。例如,x=[3,56,43,96,23]
。假设我应用一个排序,使得y=sorted(x)
。记住排序(比如存储一个字节)最有效的方法是什么
试着说得更清楚些。只有5个!=120个从x
到自身的双射。因此,我只需要2**7位(小于一个字节)的信息来记住任何一种排序方法。然而,如何有效地将排序映射到二进制表示尚不清楚
假设x
的长度为5,让我们试着使其更精确。写函数f(x)
和g(y,b)
的最佳方法是什么,其中f(x)
的输出是字节b
,这样如果g
被赋予x
的排序版本(即y
)和字节b
,那么g
将再次输出x
。像
x = [3,56,43,96,23]
y = sorted(x)
b = f(x)
print(x==g(y,b)) #Should print True.
以下是与Nick相同的解决方案,但我试图通过避免生成列表和继续使用生成器来节省内存:
输出:
更新
就内存和搜索时间而言,使用
itertools.permutation
显然效率低下。要解决这个问题,您可以直接使用this answer中描述的函数计算阶乘/逆阶乘表示:输出:
原始答案
您可以使用
itertools.permutations
来解决这个问题,找出len(x)
值的所有排列,并将索引返回到与元素排序顺序匹配的列表中。然后,您可以在g
函数中反转该过程,找到与索引匹配的排列,并基于该值重新排序y
:输出:
我不知道为什么其他人用排列来解决这个问题。这听起来像个问题。我还认为您指的是输出
x[pos]
,而不是输出x
三,
编辑:
从返回值中减去1,这是一个基于0的列表。习惯于卢阿
相关问题 更多 >
编程相关推荐