DamSi

Untitled

Dec 8th, 2015
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.23 KB | None | 0 0
  1. Приоритетна редица - Java Задача 2 (1 / 1)
  2. Дадена ви е max heap - структура што ги има дефинирано методите за додавање на нов елемент и
  3. за отстранување на максималниот елемент.
  4. Разгледајте го почетниот код за heap структурата и дополнете ја функцијата adjustUp
  5. која што ги менува позициите на елементот што се наоѓа на позиција i во heap дрвото (со моментална големина n) и
  6. на неговиот родител се додека постои нарушување на heap својството.
  7. Во првата линија ќе ви биде даден бројот на команди C,
  8. а во наредните C линии ќе ви бидат дадени командите што можат да го имаат следниот облик:
  9.  
  10. INSERT [број] - со која потребно е да го додадете новиот број во heap - дрвото
  11. REMOVE MAX - со која е потребно да го извадите максималниот елемент од heap - дрвото и да го испечатите на излез
  12. PRINT HEAP - со која е потребно да се испечати содржината на низата со елементи во heap - дрвото
  13.  
  14. Име на класата: PriorityQueueTest
  15.  
  16. import java.io.BufferedReader;
  17. import java.io.InputStreamReader;
  18. import java.util.Comparator;
  19. import java.util.StringTokenizer;
  20.  
  21. class Heap<E extends Comparable<E>> {
  22.    
  23.     private int N;
  24.     private E elements[];
  25.    
  26.     private Comparator<? super E> comparator;
  27.    
  28.     private int compare (E k1, E k2) {
  29.     return (comparator==null ? k1.compareTo(k2) : comparator.compare(k1, k2));
  30.     }
  31.    
  32.     int getParent(int i) {
  33.         return (i+1)/2-1;
  34.     }
  35.    
  36.     public E getAt(int i) {
  37.         return elements[i];
  38.     }
  39.    
  40.     int getLeft(int i) {
  41.         return (i+1)*2-1;
  42.     }
  43.    
  44.     int getRight(int i) {
  45.         return (i+1)*2;
  46.     }
  47.    
  48.     void setElement(int index, E elem) {
  49.         elements[index] = elem;
  50.     }
  51.    
  52.     void swap(int i, int j) {
  53.         E tmp = elements[i];
  54.         elements[i] = elements[j];
  55.         elements[j] = tmp;
  56.     }
  57.    
  58.     void adjust(int i, int n){
  59.        
  60.         while (i < n) {
  61.            
  62.             int left = getLeft(i);
  63.             int right = getRight(i);
  64.             int largest = i;
  65.            
  66.             if ((left < n)&&(elements[left].compareTo(elements[largest]) > 0))
  67.                 largest = left;
  68.             if ((right < n)&&(elements[right].compareTo(elements[largest]) > 0))
  69.                 largest = right;
  70.            
  71.             if (largest == i)
  72.                 break;
  73.            
  74.             swap(i, largest);
  75.             i = largest;
  76.            
  77.         }
  78.    
  79.     }
  80.    
  81.     void buildHeap() {
  82.         int i;
  83.         for (i=elements.length/2-1;i>=0;i--)
  84.             adjust(i, elements.length);
  85.     }
  86.    
  87.     public void heapSort() {
  88.         int i;
  89.         buildHeap();
  90.         for (i=elements.length;i>1;i--) {
  91.             swap(0, i-1);
  92.             adjust(0, i-1);
  93.         }
  94.     }
  95.    
  96.     @SuppressWarnings("unchecked")
  97.     public Heap(int size) {
  98.         elements = (E[])new Comparable[size];
  99.         N = 0;
  100.     }
  101.    
  102.     public boolean insert(E elem) {
  103.         if (N == elements.length)
  104.             return false;   // there is not enough space in the array
  105.         elements[N] = elem;
  106.         N++;
  107.         adjustUp(N-1, N);
  108.         return true;
  109.     }
  110.    
  111.     public E removeMax() {
  112.         if (N == 0)
  113.             return null;
  114.         E tmp = elements[0];
  115.         elements[0] = elements[N-1];
  116.         N--;
  117.         adjust(0, N);
  118.         return tmp;
  119.     }
  120.    
  121.     void adjustUp(int i, int n){
  122.         while(i!=0){
  123.             if(this.getAt(i).compareTo(this.getAt(this.getParent(i)))>0)
  124.                 this.swap(i,this.getParent(i));
  125.                 i=this.getParent(i);
  126.         }  
  127.     }
  128.    
  129.     public void printHeapArray() {
  130.         int i;
  131.         for (i=0;i<N;i++)
  132.             System.out.print(elements[i].toString()+" ");
  133.         System.out.println();
  134.     }
  135.    
  136. }
  137.  
  138. public class PriorityQueueTest {
  139.    
  140.     public static void main(String[] args) throws Exception {
  141.         int i;
  142.        
  143.         Heap<Integer> h = new Heap<Integer>(1000000);
  144.        
  145.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  146.         int N = Integer.parseInt(br.readLine());
  147.        
  148.         for (i=0;i<N;i++) {
  149.             StringTokenizer st = new StringTokenizer(br.readLine());
  150.             String comm = st.nextToken();
  151.             if (comm.equals("INSERT")) {
  152.                 int num = Integer.parseInt(st.nextToken());
  153.                 h.insert(new Integer(num));
  154.             } else if (comm.equals("REMOVE")) {
  155.                 System.out.println(h.removeMax());
  156.             } else if (comm.equals("PRINT")) {
  157.                 h.printHeapArray();
  158.             }
  159.         }
  160.        
  161.         br.close();
  162.        
  163.     }
  164.    
  165. }
Advertisement
Add Comment
Please, Sign In to add comment