Advertisement
habur331

Untitled

Apr 15th, 2022
795
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.util.Scanner;
  2.  
  3. public class Program {
  4.     public static void main(String[] args) {
  5.         Test.test2();
  6.   /*      BinaryHeap<Integer, String> heap = new BinaryHeap<Integer, String>();
  7.         try (Scanner in = new Scanner(System.in)) {
  8.             Integer number = Integer.parseInt(in.next());
  9.  
  10.             for (int i = 0; i < number; i++) {
  11.                 String command = in.next();
  12.                 if (command.equals("ADD")) {
  13.                     String value = in.next();
  14.                     Integer key = Integer.parseInt(String.valueOf(in.nextInt()));
  15.                     heap.insert(key, value);
  16.                 } else if (command.equals("PRINT_MIN")) {
  17.                     System.out.println(heap.extractMin());
  18.                 }
  19.             }
  20.         }*/
  21.  
  22.     }
  23. }
  24.  
  25. class Test {
  26.     public static void test1(int n) {
  27.         BinaryHeap<Integer, Integer> heap = new BinaryHeap<Integer, Integer>();
  28.         for (int i = 0; i < n; i++) {
  29.             int k = (i + 53) % 3;
  30.             System.out.println(k);
  31.             heap.insert(new Integer(k), new Integer(k));
  32.         }
  33.         int a = 9;
  34.     }
  35.  
  36.     public static void test2()
  37.     {
  38.         BinaryHeap<Integer, Integer> heap = new BinaryHeap<Integer, Integer>();
  39.         int k = 13;
  40.         heap.insert(new Integer(k), new Integer(k));
  41.       /*  k = 21;
  42.         heap.insert(new Integer(k), new Integer(k));
  43.         k = 13;
  44.         heap.insert(new Integer(k), new Integer(k +2));
  45.         k = 3;
  46.         heap.insert(new Integer(k), new Integer(k));
  47.         heap.extractMin();
  48.         k = 28;
  49.         heap.insert(new Integer(k), new Integer(k));
  50.         k = 4;
  51.         heap.insert(new Integer(k), new Integer(k));
  52.         k = 3;
  53.         heap.insert(new Integer(k), new Integer(k));
  54.         heap.extractMin();*/
  55.         System.out.println(heap.extractMin());
  56.         k = 21;
  57.         heap.insert(new Integer(k), new Integer(k));
  58.         System.out.println(heap.extractMin());
  59.     }
  60. }
  61.  
  62. interface IPriorityQueue<K, V> {
  63.     void insert(K newKey, V newValue);
  64.  
  65.     V findMin();
  66.  
  67.     V extractMin();
  68.  
  69.     void decreaseKey(K oldKey, V value, K newKey);
  70.  
  71.     void delete(K key, V value);
  72.  
  73.     void union(Object anotherQueue);
  74. }
  75.  
  76. class BinaryHeap<K extends Comparable<K>, V extends Comparable<V>> implements IPriorityQueue<K, V> {
  77.     int tailIndex;
  78.     Pair<K, V>[] arrayHeap;
  79.  
  80.     public BinaryHeap() {
  81.         tailIndex = 0;
  82.         arrayHeap = new Pair[1000000];
  83.         // (Pair<K, V>[])new Object[1000000];
  84.     }
  85.  
  86.     private void bubbleDown(int index) {
  87.         if (2 * index + 1 < tailIndex)
  88.             if (arrayHeap[index].getKey().compareTo(arrayHeap[2 * index + 1].getKey()) > 0) {
  89.                 swap(2 * index + 1, index);
  90.                 bubbleDown(2 * index + 1);
  91.             } else if (2 * index + 2 < tailIndex)
  92.                 if (arrayHeap[index].getKey().compareTo(arrayHeap[2 * index + 2].getKey()) > 0) {
  93.                     swap(2 * index + 2, index);
  94.                     bubbleDown(2 * index + 2);
  95.                 }
  96.     }
  97.  
  98.     private void swap(int iA, int iB) {
  99.         Pair<K, V> temp = arrayHeap[iA];
  100.         arrayHeap[iA] = arrayHeap[iB];
  101.         arrayHeap[iB] = temp;
  102.     }
  103.  
  104.     private void bubbleUp(int index) {
  105.         // если объект меньше родителя
  106.         if (arrayHeap[(index - 1) / 2].compareTo(arrayHeap[index]) > 0) {
  107.             swap((index - 1) / 2, index);
  108.             bubbleUp((index - 1) / 2);
  109.         }
  110.     }
  111.  
  112.     @Override
  113.     public void insert(K newKey, V newValue) {
  114.         arrayHeap[tailIndex] = new Pair<K, V>(newKey, newValue);
  115.         // добавляю элемент в конец, но затем мне нужно его поднять
  116.         bubbleUp(tailIndex);
  117.         tailIndex++;
  118.     }
  119.  
  120.     @Override
  121.     public V findMin() {
  122.         return arrayHeap[0].getValue();
  123.     }
  124.  
  125.     @Override
  126.     public V extractMin() {
  127.         if (tailIndex != -1) {
  128.             V returnValue = arrayHeap[0].getValue();
  129.             delete(0);
  130.             return returnValue;
  131.         }
  132.         else return null;
  133.     }
  134.  
  135.     private void delete(int index) {
  136.         // ставлю на его место крайний элемент, а чтобы не учитывать последний элемент, я сдвигаю tail поинтер - затем мне нужно вызвать blowUp и blowDown, чтобы привести всё в порядок
  137.         arrayHeap[index] = arrayHeap[tailIndex - 1];
  138.         tailIndex--;
  139.         //проверка Up and Bubble Down
  140.         // если объект меньше родителя по ключу
  141.         if (arrayHeap[(index - 1) / 2].compareTo(arrayHeap[index]) < 0)
  142.             bubbleUp(index);
  143.             // если объект больше детей по ключу
  144.         else bubbleDown(index);
  145.     }
  146.  
  147.     @Override
  148.     public void delete(K key, V value) {
  149.         int index = getIndexByKey(key);
  150.         if (index != -1 && arrayHeap[index].getValue().equals(value))
  151.             delete(index);
  152.     }
  153.  
  154.     private int getIndexByKey(K key) {
  155.         for (int i = 0; i < tailIndex; i++) {
  156.             if (arrayHeap[i].getKey().equals(key))
  157.                 return i;
  158.         }
  159.         return -1;
  160.     }
  161.  
  162.     @Override
  163.     public void decreaseKey(K oldKey, V value, K newKey) {
  164.         int index = getIndexByKey(oldKey);
  165.         if (index != -1 && arrayHeap[index].getValue().equals(value)) {
  166.             delete(index);
  167.             insert(newKey, value);
  168.         }
  169.     }
  170.  
  171.     @Override
  172.     public void union(Object anotherQueue) {
  173.  
  174.     }
  175. }
  176.  
  177. class Pair<K extends Comparable<K>, V extends Comparable<V>> implements Comparable<Pair<K, V>> {
  178.     private K key;
  179.  
  180.     public K getKey() {
  181.         return key;
  182.     }
  183.  
  184.     private V value;
  185.  
  186.     public V getValue() {
  187.         return value;
  188.     }
  189.  
  190.     public Pair(K key, V value) {
  191.         this.key = key;
  192.         this.value = value;
  193.     }
  194.  
  195.     @Override
  196.     public String toString() {
  197.         return key + "=" + value;
  198.     }
  199.  
  200.  
  201.     @Override
  202.     public int compareTo(Pair<K, V> o) {
  203.         if (o.key.compareTo(this.key) == 0)
  204.             return this.value.compareTo(o.value);
  205.           //  return o.value.compareTo(this.value);
  206.         else return this.key.compareTo(o.key);
  207.     }
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement