Avatar billede chillum Nybegynder
26. oktober 2001 - 18:31 Der er 1 løsning

heaps, priority queue, nummer og navn

jeg har lavet priority queue på en heap, se vedlagte kode, denne skal bruges til at lave en kø med nummer(prioritet) og navn. Jeg har problemer med at implementere dette og kunne godt bruge et lille spark i den rigtige retning. Det jeg ikke kan finde ud af er at for priority queue til at arbejde på brugeren(nummer og navn) således at de hænger sammen.

import java.math.*;

public class Heap
{
    private int [] Element;
 
    private int HeapSize;
   
    public void Heap(int heapsize)
    {
        HeapSize = heapsize;
        Element = new int [heapsize +1];
    }
   
   
    private void MakeHeap()
    {
        int index;
       
        for (index = HeapSize/2; index >= 1; --index)
            Insert(Element[index], index, HeapSize);
    }
   
    private void MakeRandomHeap(int upperLimit)
    {
        int index;
       
        for (index = 1; index <= HeapSize; ++index)
            Element[index] = (int) (upperLimit* Math.random());
    }
   
    private void Insert (int newElement, int start, int maxheap)
    {
        int marker = 2 * start;
       
        while (marker <= maxheap)
        {
            if (marker < maxheap  && Element[marker] < Element[marker + 1])
                marker++;
            if (newElement >= Element[marker])
                break;
            else {
                Element[start] = Element[marker];
                start = marker;
                marker = 2 * start;
            }
        }
        Element[start] = newElement;
    }
 
    public void Sort()
    {
        int tempItem;
        int maxheap = HeapSize;
       
        while (maxheap > 0)
        {
            tempItem = Element[maxheap];
            Element[maxheap] = Element[1];
            Insert(tempItem, 1, --maxheap);
           
        }
    }
   
    public int getElement(int index)
    {
        return Element[index];
    }
   
    public int getHeapSize()
    {
        return HeapSize;
    }
   
   
    public void udskriv()
    {
        int taeller;
       
        for (taeller = 1; taeller <= HeapSize; taeller++)
            System.out.println(\"plads nummer \"+taeller+\" : \"+Element[taeller]);
    }
   
    public static void main(String[] args)
    {
        Heap hp = new Heap();
        hp.Heap(10);
        hp.MakeHeap();
        hp.MakeRandomHeap(10);

        hp.udskriv();
                     
        System.out.println(\"her kommer sort\");
        hp.Sort();
        hp.udskriv();
        System.out.println(\"test\");
    }
}
       

Avatar billede logical Nybegynder
28. oktober 2001 - 16:49 #1
Du bruger i din heap kun den int, som angiver prioritet:

private int[] Element;

Og senere sammenligner du bare de enkelte elementer i din headsorts:

..Element[marker] < Element[marker + 1]

Hvis du nu laver en privat indre klasse, som indeholder to oplysninger, prioritet og data, så er du kommet lidt videre:

private class HeapElements {
  public final int priority;
  public final Object data;
  public HeapElement(int priority, Object data) {
    this.priority=priority;
    this.data = data;
  }
}

Så bruger du et array af HeapElements istedet:
private HeapElements[] Element;

Og din insert retter du til også at tage data, og laver en instans af HeapElements istedet:
Element[start] = lnew HeapElements(newElement, newData);

Så skal sammenligningerne bare skrives om, så de kigger på priority:

Element[marker].priority < Element[marker + 1].priority

Fortsæt denne tankerække, og så burde det være der.

Du kan evt. lave din heap specifik til at tage anden form for objekt end Object, som f.eks. String, men Object er så dejlig generel.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester