Guest User

Untitled

a guest
May 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. import java.util.Arrays;
  2.  
  3. public class MaxPointHeap {
  4.  
  5. private int capacity = 10;
  6. int size = 0;
  7.  
  8. private Point[] items = new Point[capacity];
  9.  
  10. public Point[] getHeapElement() {
  11. return Arrays.copyOf(items, size);
  12. }
  13.  
  14. private int getLeftChildIndex(int parentIndex) {
  15. return 2 * parentIndex + 1;
  16. }
  17.  
  18. private int getRightChildIndex(int parentIndex) {
  19. return 2 * parentIndex + 2;
  20. }
  21.  
  22. private int getParentIndex(int childIndex) {
  23. return (childIndex - 1) / 2;
  24. }
  25.  
  26. private boolean hasLeftChild(int index) {
  27. return getLeftChildIndex(index) < size;
  28. }
  29.  
  30. private boolean hasRightChild(int index) {
  31. return getRightChildIndex(index) < size;
  32. }
  33.  
  34. private boolean hasParent(int index) {
  35. return getParentIndex(index) < size;
  36. }
  37.  
  38. private Point leftChild(int index) {
  39. return items[getLeftChildIndex(index)];
  40. }
  41.  
  42. private Point rightChild(int index) {
  43. return items[getRightChildIndex(index)];
  44. }
  45.  
  46. private Point parent(int index) {
  47. return items[getParentIndex(index)];
  48. }
  49.  
  50. private void swap(int indexOne, int indexTwo) {
  51. Point temp = items[indexOne];
  52. items[indexOne] = items[indexTwo];
  53. items[indexTwo] = temp;
  54. }
  55.  
  56. private void ensureExtraCapacity() {
  57. if (size == capacity) {
  58. items = Arrays.copyOf(items, capacity * 2);
  59. capacity *= 2;
  60. }
  61. }
  62.  
  63. public Point peek() {
  64. if (size == 0)
  65. throw new IllegalStateException();
  66. return items[0];
  67. }
  68.  
  69. public void delete(Point point) {
  70. if (size == 0)
  71. throw new IllegalStateException();
  72. items[0] = point;
  73. heapifyDown();
  74. }
  75.  
  76. public void add(Point item) {
  77. ensureExtraCapacity();
  78. items[size] = item;
  79. size++;
  80. heapifyUp();
  81. }
  82.  
  83. public void heapifyUp() {
  84. int index = size - 1;
  85. while (hasParent(index) && parent(index).getDistance() < items[index].getDistance()) {
  86. swap(getParentIndex(index), index);
  87. index = getParentIndex(index);
  88. }
  89. }
  90.  
  91. public void heapifyDown() {
  92. int index = 0;
  93. while (hasLeftChild(index)) {
  94. int smallerChildIndex = getLeftChildIndex(index);
  95. if (hasRightChild(index) && rightChild(index).getDistance() > leftChild(index).getDistance())
  96. smallerChildIndex = getRightChildIndex(index);
  97. if (items[index].getDistance() > items[smallerChildIndex].getDistance())
  98. break;
  99. else
  100. swap(index, smallerChildIndex);
  101. index = smallerChildIndex;
  102. }
  103. }
  104.  
  105. public static void main(String[] args) {
  106. Point[] points = new Point[9];
  107. points[0] = new Point(3, 3);
  108. points[1] = new Point(2, 2);
  109. points[2] = new Point(4, 4);
  110. points[3] = new Point(1, 1);
  111. points[4] = new Point(12, 1);
  112. points[5] = new Point(0, 0);
  113. points[6] = new Point(2, 3);
  114. points[7] = new Point(-5, 2);
  115. points[8] = new Point(-1, -1);
  116. int k = 4;
  117. MaxPointHeap pointHeap = new MaxPointHeap();
  118.  
  119. for (int i = 0; i < k; i++) {
  120. pointHeap.add(points[i]);
  121. }
  122. for (int i = k; i < points.length; i++) {
  123. if (points[i].getDistance() < pointHeap.peek().getDistance()) {
  124. pointHeap.delete(points[i]);
  125. }
  126. }
  127. for (int i = 0; i < pointHeap.getHeapElement().length; i++) {
  128. Point p = pointHeap.getHeapElement()[i];
  129. System.out.println("(" + p.getX() + ", " + p.getY() + ")");
  130. }
  131. }
  132.  
  133. }
  134.  
  135. class Point {
  136. private int x;
  137. private int y;
  138.  
  139. public Point(int x, int y) {
  140. this.x = x;
  141. this.y = y;
  142. }
  143.  
  144. // In this case, to optimize we dont need to calculate square root.
  145. public long getDistance() {
  146. return x * x + y * y;
  147. }
  148.  
  149. public int getX() {
  150. return x;
  151. }
  152.  
  153. public int getY() {
  154. return y;
  155. }
  156.  
  157. }
Add Comment
Please, Sign In to add comment