| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
|
I threw together a test for the basic swaptimize algorithm and it passes some test cases, so that's nice: def permutation(swaps, N=None):
if N is None:
N = max(swaps)
perm = list(range(N))
for s in swaps:
perm[0], perm[s-1] = perm[s-1], perm[0]
return perm
def swaptimize(*old_swaps):
assert old_swaps
if len(old_swaps) == 1:
return tuple(old_swaps)
perm = permutation(old_swaps)
swaps = []
for i, x in enumerate(perm):
# March forward, searching for an un-traversed cycle.
if x is None or x == i:
continue
# Traverse this cycle.
j = i
while True:
if j != 0:
swaps.append(j + 1)
if perm[j] is None:
# Back to the start of the cycle.
assert j == i
break
next_j = perm[j]
perm[j] = None
j = next_j
swaps = tuple(reversed(swaps))
assert permutation(old_swaps, len(perm)) == permutation(swaps, len(perm))
assert len(swaps) <= len(old_swaps)
return swaps
assert swaptimize(1) == (1,) # This should be ()?
assert swaptimize(2) == (2,)
assert swaptimize(3) == (3,)
assert swaptimize(10) == (10,)
assert swaptimize(2, 2, 5, 5) == ()
assert swaptimize(10, 20, 20, 10) == ()
assert swaptimize(2, 3, 4, 3) == (3, 4, 3, 2)
from random import randint
for i in range(100_000):
for n in range(1, 20):
swaptimize(*[randint(2, 20) for _ in range(n)]) |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
...as discussed in faster-cpython/ideas#228:
https://bugs.python.org/issue46528