Python洗牌算法重写
Python有自带的洗牌算法函数shuffle().
自己也通过学习也琢磨了一下它的实现,然后给出一个时间复杂度O(n),空间复杂度O(4)的例子:
1 import random 2 3 def shuffle1(lst) : 4 l = len(lst) 5 if l <= 1 : return lst 6 7 i = 0 8 while l > 1 : 9 j = int(random.random() * l) 10 t = lst[i] 11 lst[i] = lst[i+j] 12 lst[i+j] = t 13 i = i + 1 14 l = l - 1 15 16 return lst
执行结果:
1 b = [0,1,2,3,4,5,6,7,8,9] 2 print shuffle1(b) 3 4 [9, 5, 7, 1, 8, 2, 3, 6, 0, 4] 5 [2, 4, 7, 3, 8, 5, 6, 9, 0, 1] 6 [3, 0, 8, 7, 1, 6, 5, 4, 9, 2] 7 [5, 8, 2, 9, 7, 1, 4, 0, 3, 6] 8 [7, 8, 0, 3, 9, 6, 1, 2, 4, 5] 9 [2, 4, 8, 7, 3, 6, 1, 0, 9, 5] 10 [2, 5, 9, 8, 4, 3, 0, 6, 1, 7] 11 [6, 0, 1, 9, 2, 3, 4, 7, 5, 8] 12 [5, 4, 0, 8, 6, 7, 9, 2, 3, 1] 13 [3, 9, 2, 8, 5, 7, 6, 1, 0, 4]
后面再琢磨能不能降低一下时间复杂度。
比如洗4副牌,可以开4个线程同时洗,通过并行提高性能。
也可以一个线程洗,每次以4张或者更大数目切牌,也能达到较好的效果。