fork(2) download
  1. import random
  2. import time
  3.  
  4. #http://c...content-available-to-author-only...e.com/recipes/577944-random-binary-list/
  5. randBinList = lambda n: [random.randint(0,1) for b in range(1,n+1)]
  6.  
  7. def f(A):
  8. a, b = 0, 0
  9. for i in xrange(len(A)):
  10. m = i & 1 ^ A[i]
  11. a, b = m + a, (not m) + b
  12. return min(a, b)
  13.  
  14. def minFlipMarkMeyer(a):
  15. return min(
  16. sum(n == i % 2 for i, n in enumerate(a)),
  17. sum(n == (i + 1) % 2 for i, n in enumerate(a))
  18. )
  19.  
  20. def minFlipTrincot1(a):
  21. flips = sum((n ^ i) & 1 for i, n in enumerate(a))
  22. return min(flips, len(a)-flips)
  23.  
  24. def minFlipTrincot2(a):
  25. return (len(a)-abs(sum(-1 if (n^i)&1 else 1 for i,n in enumerate(a)))) // 2
  26.  
  27. A = randBinList(10000000)
  28.  
  29. start = time.time()
  30. print f(A)
  31. end = time.time()
  32. print(end - start)
  33.  
  34. start = time.time()
  35. print "%s (minFlipMarkMeyer)" % minFlipMarkMeyer(A)
  36. end = time.time()
  37. print(end - start)
  38.  
  39. start = time.time()
  40. print "%s (minFlipTrincot1)" % minFlipTrincot1(A)
  41. end = time.time()
  42. print(end - start)
  43.  
  44. start = time.time()
  45. print "%s (minFlipTrincot2)" % minFlipTrincot2(A)
  46. end = time.time()
  47. print(end - start)
Success #stdin #stdout 1.08s 197952KB
stdin
Standard input is empty
stdout
4998933
0.0775279998779
4998933 (minFlipMarkMeyer)
0.383046865463
4998933 (minFlipTrincot1)
0.157243013382
4998933 (minFlipTrincot2)
0.249106884003