Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.82 KB | None | 0 0
  1. #!/usr/bin/env python
  2.  
  3. import random
  4. import copy
  5. from collections import defaultdict
  6. import heapq
  7.  
  8. def partition_bk(l,r, arr, pidx):
  9. start = l
  10. end = r-1
  11. pidx_val = arr[pidx]
  12. if (l>=r): return r
  13.  
  14. #print("----> l = {}, r = {}, start = {}, end = {}".format(l,r,start, end))
  15. arr[pidx], arr[r] = arr[r], arr[pidx]
  16. while True:
  17. while (arr[start] <= pidx_val):
  18. start += 1
  19. if (start > end): break
  20.  
  21. while (arr[end] > pidx_val):
  22. end -= 1
  23. if (start > end): break
  24.  
  25. if (start > end): break
  26. arr[start], arr[end] = arr[end], arr[start]
  27. if start<end:
  28. start += 1
  29. #print("r = ", r, " start = ", start, ", end = ", end )
  30. arr[r], arr[start] = arr[start], arr[r]
  31. return start
  32.  
  33. def partition(l,r, arr, pidx):
  34. start = l
  35. pidx_val = arr[pidx]
  36.  
  37. arr[pidx], arr[r] = arr[r], arr[pidx]
  38. for i in range(l,r):
  39. if (arr[i] <= pidx_val):
  40. arr[i], arr[start] = arr[start], arr[i]
  41. start+=1
  42. arr[r], arr[start] = arr[start], arr[r]
  43. return start
  44.  
  45. def find_kth_largest(k, arr):
  46. l = 0
  47. r = len(arr) - 1
  48. #print("looking for k ",k, " in ", arr)
  49. first = True
  50. while l <= r:
  51. if first:
  52. pidx = 4
  53. first = False
  54. else:
  55. pidx = random.randint(l,r)
  56. #print("new pidx {}".format(pidx))
  57. pidx = partition(l, r, arr, pidx)
  58. #print("\nreturned pidx = ", pidx)
  59. #print(arr)
  60. #print()
  61. if pidx == k-1:
  62. return arr[pidx]
  63. elif pidx > k-1:
  64. r = pidx-1
  65. l = 0
  66. else:
  67. l = pidx+1
  68. r = len(arr)-1
  69. #print("new l = {l} , r = {r}".format(l=l, r=r))
  70. return -1
  71.  
  72. def find_kth_largest_sort(k,arr):
  73. return sorted(arr)[k-1]
  74.  
  75. def find_kth_largest_heap(k,arr):
  76. heapq.heapify(arr)
  77. for i in range(k-1):
  78. heapq.heappop(arr)
  79. return arr[0]
  80.  
  81.  
  82. def test_kth_largest_parition():
  83. n = 1000
  84. for i in range(n):
  85. size = random.randint(10,500)
  86. k = random.randint(1,size)
  87. print("size = {}, k = {}".format(size,k))
  88. a = [ random.randint(1,50) for i in range(size)]
  89. #a = [24, 27, 15, 27, 3, 17, 14, 28, 3, 4]
  90. b = sorted(a)
  91. expected = b[k-1]
  92. print(a)
  93. print(b)
  94. print("expected={e}".format(e=expected))
  95. result = find_kth_largest_heap(k,a)
  96. print("result={r}".format(r=result))
  97. if (result != expected):
  98. print("error result is not ", expected)
  99. print(a)
  100. return
  101.  
  102. print("solution is correct.")
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109. #result = bst.find_largest_smaller_key(17)
  110.  
  111. #print("Largest smaller number is %d " % (result))
  112.  
  113. test_kth_largest_parition()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement