Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Προγραμματισμός Java

Πώς μπορώ να εφαρμόσω ένα σωρό βασισμένο σε συστοιχία στη Java;

Η εφαρμογή ενός σωρού που βασίζεται σε συστοιχία στη Java περιλαμβάνει τη χρήση ενός πίνακα για να αντιπροσωπεύει τη δομή του σωρού. Θα χρησιμοποιήσουμε ένα min-heap ως παράδειγμα (το μικρότερο στοιχείο στη ρίζα), αλλά οι αρχές είναι οι ίδιες για ένα max-heap.

Ακολουθεί μια εφαρμογή Java ενός Min-HEAP, συμπεριλαμβανομένων μεθόδων εισαγωγής, εξαγωγής του ελάχιστου στοιχείου και λειτουργίας:

`` `java

δημόσια τάξη minheap {

ιδιωτικό int [] Heap;

ιδιωτικό μέγεθος int.

ιδιωτική ικανότητα int ·

δημόσιο minHeap (χωρητικότητα int) {

this.capacity =χωρητικότητα;

this.heap =νέο int [χωρητικότητα + 1]; // Ο δείκτης 0 δεν χρησιμοποιείται

this.size =0;

}

δημόσια boolean isEmpty () {

Μέγεθος επιστροφής ==0;

}

δημόσια boolean isfull () {

Μέγεθος επιστροφής ==χωρητικότητα;

}

ιδιωτικός γονέας int (int i) {

επιστροφή I / 2;

}

Ιδιωτικό int αριστερά (int i) {

επιστροφή 2 * i;

}

ιδιωτικό int right (int i) {

επιστροφή 2 * i + 1;

}

ιδιωτική swap (int i, int j) {

int temp =σωρός [i];

Heap [i] =Heap [J];

Heap [j] =temp;

}

δημόσιο κενό ένθετο (int κλειδί) {

αν (isfull ()) {

Ρίξτε νέα παράνομη κατάσταση ("HEAP είναι γεμάτο").

}

μέγεθος ++;

σωρός [μέγεθος] =κλειδί;

int i =μέγεθος;

ενώ (i> 1 &&heap [γονέας (i)]> heap [i]) {// min-heap ιδιοκτησία

ανταλλαγή (i, γονέας (i));

i =γονέας (i);

}

}

δημόσιο int extractmin () {

αν (isEmpty ()) {

ρίξτε νέα παράνομη κατάσταση ("HEAP είναι άδειο")?

}

int root =σωρός [1];

σωρός [1] =σωρός [μέγεθος];

μέγεθος--;

Heapify (1);

ρίζα επιστροφής?

}

ιδιωτικό κενό heapify (int i) {

int μικρότερο =i;

int l =αριστερά (i);

int r =δεξιά (i);

αν (l <=μέγεθος &&heap [l] μικρότερο =l;

}

αν (r <=μέγεθος &&heap [r] μικρότερο =r;

}

αν (μικρότερο! =i) {

ανταλλαγή (i, μικρότερο);

Heapify (μικρότερο);

}

}

δημόσιο κενό printheap () {

για (int i =1; i <=μέγεθος; i ++) {

System.out.print (Heap [i] + "");

}

System.out.println ();

}

δημόσιο στατικό κενό κύριο (String [] args) {

Minheap minheap =new minheap (10);

minheap.insert (3);

minheap.insert (2);

minheap.insert (15);

minheap.insert (5);

minheap.insert (4);

minheap.insert (45);

System.out.println ("MinHeap Array:");

minHeap.PrinTheap ();

System.out.println ("Εξαγόμενο min:" + minHeap.ExtractMin ());

System.out.println ("Μετά την εξαγωγή Min:");

minHeap.PrinTheap ();

}

}

`` `

Αυτός ο κωδικός περιλαμβάνει:

* Κατασκευαστής: Αρχικοποιεί τη συστοιχία σωρού με δεδομένη χωρητικότητα. Σημειώστε ότι ο δείκτης 0 δεν χρησιμοποιείται.

* `isEmpty ()` και `isfull ()`: Ελέγξτε την κατάσταση του σωρού.

* `parent ()`, `left ()`, `δεξιά ()`: Ο βοηθός λειτουργεί για να πάρει τους δείκτες των γονικών και παιδικών κόμβων.

* swap () `: Ανταλλαγή δύο στοιχείων στον πίνακα.

* `insert ()`: Εισάγει ένα νέο στοιχείο στο σωρό, διατηρώντας την ιδιοκτησία Min-Heap.

* `extractmin ()`: Αφαιρεί και επιστρέφει το ελάχιστο στοιχείο (ρίζα), διατηρώντας την ιδιότητα min-heap χρησιμοποιώντας `heapify ()`.

* `heapify ()`: Επαναφέρει την ιδιοκτησία Min-HEAP μετά την αφαίρεση ή την εισαγωγή ενός στοιχείου. Συγκρίνει αναδρομικά ένα στοιχείο με τα παιδιά και τις ανταλλαγές του, εάν είναι απαραίτητο.

* `printheap ()`: Μια λειτουργία βοηθού για επίδειξη.

Θυμηθείτε να χειριστείτε πιθανές εξαιρέσεις, όπως η προσπάθεια να εξαγάγετε από ένα κενό σωρό ή να εισαγάγετε σε ένα πλήρες. Αυτό το παράδειγμα χρησιμοποιεί ακέραιες τιμές. Μπορείτε εύκολα να το προσαρμόσετε σε άλλους τύπους δεδομένων χρησιμοποιώντας μια παράμετρο γενικού τύπου. Για μεγαλύτερους σωρούς, σκεφτείτε να χρησιμοποιήσετε μια πιο εξελιγμένη στρατηγική αλλαγής μεγέθους για να αποφύγετε τον περιορισμό της σταθερής ικανότητας.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα