Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. package no.uib.ii.inf102.f18.mandatory1;
  2.  
  3. import java.util.NoSuchElementException;
  4.  
  5. public class IndexMinPQ<Key extends Comparable<Key>> implements IIndexPQ<Key> {
  6. private int n; //number of elements in PQ
  7. private int maxN; //maximum number of elements in PQ
  8. private int[] pq; //binary heap using 1-based indexing
  9. private int[] qp; //inverse: qp[pg[i]] ? pq[qp[i]] = i
  10. private Key[] keys; //items with priorities
  11.  
  12. @SuppressWarnings("unchecked")
  13. public IndexMinPQ(int maxN) {
  14. keys = (Key[]) new Comparable[maxN + 1];
  15. pq = new int[maxN + 1];
  16. qp = new int[maxN + 1];
  17. for (int i = 0; i < maxN; i++) qp[i] = -1;
  18. /*
  19. if (maxN < 0) throw new IllegalArgumentException();
  20. this.maxN = maxN;
  21. n = 0;
  22. keys = (Key[]) new Comparable[maxN + 1]; // make this of length maxN??
  23. pq = new int[maxN + 1];
  24. qp = new int[maxN + 1]; // make this of length maxN??
  25. for (int i = 0; i <= maxN; i++)
  26. qp[i] = -1;
  27. */
  28. }
  29.  
  30. @Override
  31. public void add(int index, Key key) {
  32. //if (index < 0 || index >= maxN) throw new IllegalArgumentException();
  33. //if (!contains(index)) throw new NoSuchElementException("index is not in the priority queue");
  34. n++;
  35. qp[index] = n;
  36. pq[n] = index;
  37. keys[index] = key;
  38. swim(n);
  39. }
  40.  
  41. @Override
  42. public void changeKey(int index, Key key) {
  43. //if (index < 0 || index >= maxN) throw new IllegalArgumentException();
  44. //if (!contains(index)) throw new NoSuchElementException("index is not in the priority queue");
  45. keys[index] = key;
  46. swim(qp[index]);
  47. sink(qp[index]);
  48. }
  49.  
  50. @Override
  51. public boolean contains(int index) {
  52. return qp[index] != -1;
  53. }
  54.  
  55. @Override
  56. public void delete(int index) {
  57. //if (index < 0 || index >= maxN) throw new IllegalArgumentException();
  58. //if (!contains(index)) throw new NoSuchElementException("index is not in the priority queue");
  59. int i = qp[index];
  60. exch(i, n--);
  61. swim(i);
  62. sink(i);
  63. keys[index] = null;
  64. qp[index] = -1;
  65. }
  66.  
  67. @Override
  68. public Key getKey(int index) {
  69. return keys[index];
  70. }
  71.  
  72. @Override
  73. public Key peekKey() {
  74. if (n == 0) return null;
  75. return keys[pq[n]];
  76. }
  77.  
  78. @Override
  79. public int peek() {
  80. if (n == 0) return -1;
  81. return qp[1];
  82. }
  83.  
  84. @Override
  85. public int poll() {
  86. if (n == 0) return -1;
  87. int min = pq[1];
  88. exch(1, n--);
  89. sink(1);
  90. assert min == pq[n+1];
  91. qp[min] = -1;
  92. keys[min] = null;
  93. pq[n+1] = -1;
  94. return min;
  95. }
  96.  
  97. @Override
  98. public int size() {
  99. return n;
  100. }
  101.  
  102. @Override
  103. public boolean isEmpty() {
  104. return n == 0;
  105. }
  106.  
  107. private void exch(int i, int j) {
  108. int swap = pq[i];
  109. pq[i] = pq[j];
  110. pq[j] = swap;
  111. qp[pq[i]] = i;
  112. qp[pq[j]] = j;
  113. }
  114.  
  115. private void swim(int k) {
  116. while (k > 1 && greater(k/2, k)) {
  117. exch(k, k/2);
  118. k = k/2;
  119. }
  120. }
  121.  
  122. private void sink(int k) {
  123. while (2*k <= n) {
  124. int j = 2*k;
  125. if (j < n && greater(j, j+1)) j++;
  126. if (!greater(k, j)) break;
  127. exch(k, j);
  128. k = j;
  129. }
  130. }
  131.  
  132. private boolean greater(int j, int i) {
  133. return keys[pq[i]].compareTo(keys[pq[j]]) > 0;
  134. }
  135.  
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement