枚举纸牌排列的最佳方法是什么?
What's the best way to enumerate permutations of deck of cards?
我正在寻找一个函数来为特定的洗牌分配一个值。
函数必须是双射的。这副牌有 52 张牌,所以有 52 张!不同的洗牌,因此域是 52 张牌的所有排列的集合,而密码域是从 1 到 52 的整数!。
快速高效地执行此操作的最佳算法是什么?
将排列编码为伪代码中的值:
A = list of cards
value = 0
for i in range(52):
cards_left = 52-i
let pos = index of card i in A
delete A[pos]
value = value * cards_left + pos
最后,A会是一个空列表,value有一个代表排列的数字。
解码:
A = []
value is an input
for i in reversed(range(52)):
cards_left = 52-i
pos = value % cards_left
value = value / cards_left
Insert card i at index pos in A
最后,A 应该包含原始排列。
示例 Python 代码:
B=[3,2,0,1,4]
def encode(A):
value = 0
n = len(A)
A = A[:] # Take a copy to avoid modifying original input array
for i in range(n):
cards_left = n-i
pos = A.index(i)
del A[pos]
value = value * cards_left + pos
return value
def decode(value,n):
A=[]
for i in range(n-1,-1,-1):
cards_left = n-i
value,pos = divmod(value, cards_left)
A.insert(pos,i)
return A
v=encode(B)
print v
print decode(v,len(B))
我正在寻找一个函数来为特定的洗牌分配一个值。
函数必须是双射的。这副牌有 52 张牌,所以有 52 张!不同的洗牌,因此域是 52 张牌的所有排列的集合,而密码域是从 1 到 52 的整数!。
快速高效地执行此操作的最佳算法是什么?
将排列编码为伪代码中的值:
A = list of cards
value = 0
for i in range(52):
cards_left = 52-i
let pos = index of card i in A
delete A[pos]
value = value * cards_left + pos
最后,A会是一个空列表,value有一个代表排列的数字。
解码:
A = []
value is an input
for i in reversed(range(52)):
cards_left = 52-i
pos = value % cards_left
value = value / cards_left
Insert card i at index pos in A
最后,A 应该包含原始排列。
示例 Python 代码:
B=[3,2,0,1,4]
def encode(A):
value = 0
n = len(A)
A = A[:] # Take a copy to avoid modifying original input array
for i in range(n):
cards_left = n-i
pos = A.index(i)
del A[pos]
value = value * cards_left + pos
return value
def decode(value,n):
A=[]
for i in range(n-1,-1,-1):
cards_left = n-i
value,pos = divmod(value, cards_left)
A.insert(pos,i)
return A
v=encode(B)
print v
print decode(v,len(B))