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

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

Πώς μπορώ να εφαρμόσω ένα ArrayHeap στην Java για αποτελεσματική αποθήκευση και ανάκτηση δεδομένων;

Η εφαρμογή ενός σωρού που βασίζεται σε συστοιχία (Min-HEAP σε αυτό το παράδειγμα) στη Java περιλαμβάνει τη χρήση ενός μόνο πίνακα για να αντιπροσωπεύει τη δομή του σωρού. Δείτε πώς μπορείτε να το κάνετε, συμπεριλαμβανομένων μεθόδων εισαγωγής, διαγραφής (εξαγωγή του ελάχιστου στοιχείου) και PEEK (να πάρει το ελάχιστο στοιχείο χωρίς να το αφαιρέσετε):

`` `java

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

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

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

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

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

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

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

this.size =0;

}

// Λειτουργία βοηθητικού για να λάβετε τον γονικό δείκτη

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

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

}

// Λειτουργία βοηθητικού για να λάβετε το αριστερό δείκτη παιδιού

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

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

}

// Λειτουργία βοηθού για να λάβετε το σωστό δείκτη παιδιού

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

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

}

// Λειτουργία βοηθητικού για να επικεντρωθεί μετά την εισαγωγή

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

ενώ (i> 1 &&σωρός [γονέας (i)]> Heap [i]) {

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

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

}

}

// Λειτουργία βοηθητικού για να επικεντρωθεί μετά τη διαγραφή

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

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

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

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

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

}

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

}

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

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

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

}

}

// Λειτουργία βοηθού για ανταλλαγή δύο στοιχείων

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

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

Heap [i] =Heap [J];

Heap [j] =temp;

}

// Εισαγάγετε ένα νέο στοιχείο στο σωρό

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

αν (μέγεθος ==χωρητικότητα) {

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

}

μέγεθος ++;

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

heapifyup (μέγεθος);

}

// Εξαγάγετε (και αφαιρέστε) το ελάχιστο στοιχείο

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

αν (μέγεθος ==0) {

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

}

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

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

μέγεθος--;

heapifydown (1);

Επιστροφή Min;

}

// Λάβετε το ελάχιστο στοιχείο χωρίς να το αφαιρέσετε

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

αν (μέγεθος ==0) {

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

}

επιστροφή σωρού [1];

}

// Ελέγξτε αν ο σωρός είναι άδειος

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

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

}

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

ArrayHeap Heap =νέο ArrayHeap (10);

Heap.insert (10);

Heap.insert (5);

Heap.insert (15);

Heap.insert (3);

Heap.insert (8);

System.out.println ("Ελάχιστο στοιχείο:" + heap.peekmin ()); // έξοδος:3

System.out.println ("Εξαγόμενο ελάχιστο στοιχείο:" + Heap.ExtractMin ()); // έξοδος:3

System.out.println ("Νέο ελάχιστο στοιχείο:" + heap.peekmin ()); // έξοδος:5

}

}

`` `

Αυτή η εφαρμογή παρέχει βασικές λειτουργίες σωρού. Θυμηθείτε ότι αυτό είναι ένα *min-heap *? Για να το κάνετε ένα *max-heap *, θα πρέπει να αντιστρέψετε τη λογική σύγκρισης στο `heapifyup` και το` heapifydown '. Για μεγαλύτερους σωρούς, σκεφτείτε να χρησιμοποιήσετε μια πιο εξελιγμένη δομή δεδομένων ή βιβλιοθήκη εάν η απόδοση γίνει κρίσιμη. Θα μπορούσατε επίσης να επεκτείνετε αυτό για να χειριστείτε τα γενόσημα για περισσότερους ευέλικτους τύπους δεδομένων. Θυμηθείτε να χειριστείτε πιθανές εξαιρέσεις όπως «παράνομη κατάσταση) για άδειους ή πλήρους σωρούς.

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

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