-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpermutation.py
173 lines (92 loc) · 1.81 KB
/
permutation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'''
PERMUTATIONS
------
Reordering of the integers
1,2,3,...,n
'''
from math import factorial
def lexSuccessor(n, p):
'''
return successor of p
in lex ordering
Algorithm 2.14 in book
'''
print 'do this'
def lexRank(n, p):
'''
Ranks p in lex ordering
Algorithm 2.15 in book
'''
r = 0
for j in range(1, n+1):
r += (p[j-1]-1)*factorial(n-j)
for i in range(j+1,n+1):
if p[i-1] > p[j-1]:
p[i-1] -= 1
return r
def lexUnrank(n, r):
'''
Unanks r in lex ordering
Algorithm 2.16 in book
'''
print 'do this'
def trotterJohnsonRank(n, p):
'''
ranks p in Trotter-Johnson ordering
Algorithm 2.17 in book
'''
r = 0
for j in range(2,n+1):
k = 1
i = 1
while p[i-1] != j:
if p[i-1] < j:
k += 1
i += 1
if r%2 == 0:
r = j*r + j - k
else:
r = j*r + k - 1
return r
def trotterJohnsonUnrank(n, r):
'''
Unranks r in Trotter-Johnson ordering
Algorithm 2.18 in book
'''
print 'do this'
def permParity(n, p):
'''
Returns the parity of p (even [0] or odd [1]
number of inversions to get list in ascending order)
Does NOT count inversions. Algorithm below does, but has slower run time complexity
Algorithm 2.19 in book
'''
a = [0] * n
c = 0
for j in range(1,n+1):
if a[j-1] == 0:
c += 1
a[j-1] = 1
i = j
while p[i-1] != j:
i = p[i-1]
a[i-1] = 1
return (n-c)%2
def countInversions(n, p):
'''
Returns number of inversions to get p in ascending order
Can be used to get parity, but is slower than the above algorithm
'''
c = 0
for i in range(0,n):
for j in range(i+1,n):
if p[j] < p[i]:
c += 1
return c
def trotterJohnsonSuccessor(n, p):
'''
returns successor of p in
Trotter-Johnson ordering
Algorithm 2.20 in book
'''
print 'do this'