Forum
Tipps
News
Menu-Icon

Java Aufgabe mit Minimum Heap

Ich habe eine Aufgabe bekommen und ich muss einen Minimum-Heap programmieren, was mir nur teils gelungen ist. Es geht vor allem um die put-Methode(ein Element in den heap einfügen), die je nach Eingabe nicht immer alle Buchstaben im Minimum Heap sortiert wie es sein sollte. Die get- Methode habe ich noch nicht, aber wenn ich die Put.Methode mal ganz habe, sollte es leicht gehen...

Hier der Code:

public class PriorityQueue {
   private Comparable[] heap;
   private int now;
   
   
   public PriorityQueue(int nMax){
      heap= new Comparable[nMax];
      now=0;
   }
   
   public boolean isEmpty(){
      if (this.now==0)
         return true;
      else return false;
   }
   
   public boolean isFull(){
      if (this.now==this.heap.length)
         return true;
      else return false;
   }
   
   public int size(){
      return this.now;
   }
   
   public void put(Comparable x){
      if (this.isFull()) throw new RuntimeException("PriorityQueue is full");
      
      int a=this.now;
      this.heap[a]=x;
      boolean isCompared=false;
         while (isCompared==false){
            int parent=(a-1)/2;
            if (isEmpty()){
               isCompared=true;
            }else if (this.heap[parent].compareTo(this.heap[a])<=0){
               isCompared=true;
            }else{
               this.heap[a]=this.heap[parent];
               a=parent;
               if(a == 0)isCompared=true;
            }
         }
      this.heap[a]=x;
      this.now+=1;
   }
   
   public Comparable get(){
      if (this.isEmpty()) throw new NoSuchElementException("PriorityQueue is empty");
      return null;
   }
   
   public Comparable top(){
      if (this.isEmpty()) throw new NoSuchElementException("PriorityQueue is empty");
      return this.heap[0];
   }
   
   public String toString(){
      if (this.isEmpty()) return "[]";
      
      String s = "[";
      for(int i=0;i<this.now;i++){
         s += this.heap.toString();
         if (i!=this.now-1){
            s += ", ";
         }
      }
      return s + "]";
   }
}


und hier noch der Test-Driver:

public class TestDriver extends Applet{

   public void init() {
      String text = "palmtree";
      int nMax = text.length();
      PriorityQueue queue = new PriorityQueue(nMax);
      try {
      for (int i=0;i<nMax;i++) {
         String s = String.valueOf(text.charAt(i));
         queue.put(s);
         System.out.println("put "+s+" queue="+queue);
      }
      /*for (int i=0;i<nMax;i++)
         System.out.println("get "+queue.get()+" queue="+queue);
      */}
      catch (Exception e) {e.printStackTrace();}
      }
}

Das get() habe ich in der Testklasse noch ausgeklammmert,weil ich die noch nicht programmiert habe. Also, danke, wenn sich jemand die Zeit nimmt! :o


Antworten zu Java Aufgabe mit Minimum Heap:

http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic16/pic2a.gif

So sieht ein Minimum-Heap mit Zahlen aus.... bei meiner Aufgabe sind es einfach Buchstaben...

Das Problem is, dass du bei

           }else{
               this.heap[a]=this.heap[parent];
               a=parent;
               if(a == 0)isCompared=true;
            }

zwar das Element, das an Position Parent im Baun steht herunterschiebst, jedoch nicht das einzufügende Element an die nun frei gewordene Stelle schreibst.

Dadurch wird beim nächsten Schleifendurchlauf der unveränderte (und schon korrekt sortierte) obere Teil des Baums verglichen und abgebrochen.

Danke vielmal, ich habe die Übung abgegeben und dank deinem Tipp fertigstellen können


« Exel TabelleSchiffe versenken, raster 10x10 »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Grundstrich
Der Begriff des Grundstrichs im Bereich der Typografie, bezeichnet den senkrechten Strich der Buchstaben. Bei Schriftarten mit variabler Strichstärke, wie zum Beispi...

Haarstrich
Der Begriff Haarstrich stammt aus dem Bereich der Typographie. Bei Schriften, wie zum Beispiel der Antiquaschrift mit unterschiedlichen Strichstärken, wird zwischen ...

Eingabefelder
Als Eingabefelder werden in einem Programm oder in Online-Formularen die Stellen bezeichnet, an denen Informationen eingetippt werden können. Die Beschriftung neben ...