Ορθότητα αλγορίθμου

Mathletic
Δημοσιεύσεις: 275
Εγγραφή: Πέμ Μαρ 21, 2013 11:25 pm

Ορθότητα αλγορίθμου

#1

Μη αναγνωσμένη δημοσίευση από Mathletic » Παρ Ιαν 16, 2015 1:31 am

Γειά :logo:

Διαβάζω την ορθότητα του αλγορίθμου BuildHeap, η οποία μπορεί να αποδειχθεί μέσω της αναλλοίωτης συνθήκης:

Στην αρχή κάθε επανάληψης του βρόχου for στις γραμμές 1-2, κάθε κόμβος i+1, i+2, \dots , n είναι ρίζα ενός σωρού μεγίστου.

Ο αλγόριθμος είναι ο εξής:

Κώδικας: Επιλογή όλων

HeapSort(A){
  Buildheap(A);
  for (i=size(A); i>1; --i){
       swap(A[i],A[1]);
       heap_size(A)=heap_size(A)-1;
       Heapify(A,1);
  }
}

Κώδικας: Επιλογή όλων

BuildHeap(A){
1.  for (i=floor((size(A))/2); i>=0; i--){
2.       Heapify(A,i);
   }
}

Κώδικας: Επιλογή όλων

Heapify(A,i){
  l=left(i);
  r=right(i);
  largest=i;
  if (l<=size(A) && A[l]>A[i]) largest=l;
  if (r<=size(A) && A[r]>A[largest]) largest=r;
  if (largest!=i){
      swap(A[i],A[largest]);
      Heapify(A, largest);
  }
}
Θα πρέπει να δείξουμε ότι η συνθήκη αυτή ισχύει πριν από την πρώτη επανάληψη του βρόχου, ότι διατηρείται σε κάθε επανάληψη, και ότι μας δίνει μια χρήσιμη ιδιότητα που μας βοηθά να αποδείξουμε την ορθότητα του αλγορίθμου όταν περατωθεί ο βρόχος.

Αρχικός έλεγχος: Πριν από την πρώτη επανάληψη του βρόχου, έχουμε i=\lfloor n/2 \rfloor. Όλοι οι κόμβοι \lfloor n/2 \rfloor +1,\lfloor n/2 \rfloor +2, \dots , n είναι καταληκτικοί, και επομένως καθένας από αυτούς είναι η ρίζα ενός τετριμμένου σωρού μεγίστου.

Έλεγχος διατήρησης: Για να δείξουμε ότι η αναλλοίωτη συνθήκη διατηρείται σε κάθε επανάληψη, παρατηρούμε ότι οι θυγατρικοί του κόμβου i έχουν μεγαλύτερους αριθμούς θέσης από τον i. Επομένως, βάσει της αναλλοίωτης συνθήκης, και οι δύο αυτοί είναι ρίζες σωρών μεγίστου. Αυτή ακριβώς είναι και η συνθήκη που απαιτείται προκειμένου η κλήση Heapify(A,i) να καταστήσει τον κόμβο i ρίζα ενός σωρού μεγίστου. Επιπλέον, η κλήση Heapify διατηρεί την ιδιότητα ότι οι κόμβοι i+1, i+2, \dots , n είναι όλοι ρίζες σωρών μεγίστου. Η ελάττωση του i κατά μονάδα στην ανανέωση του βρόχου for εξασφαλίζει εκ νέου την ισχύ της αναλλοίωτης συνθήκης για την επόμενη επανάληψη.

Επιβεβαίωση αποτελέσματος: Στον τερματισμό του βρόχου, έχουμε i=0. Βάσει της αναλλοίωτης συνθήκης, καθένας από τους κόμβους 1, 2, \dots , n είναι ρίζα ενός σωρού μεγίστου. Εν προκειμένω, και ο κόμβος 1.


Μπορείτε να μου εξηγήσετε τον έλεγχο διατήρησης;

"Επομένως, βάσει της αναλλοίωτης συνθήκης, και οι δύο αυτοί είναι ρίζες σωρών μεγίστου."

Υποθέτουμε ότι ισχύει η αναλλοίωτη συνθήκη για j>i και θέλουμε να δείξουμε ότι ισχύει και για i;


Απάντηση

Επιστροφή σε “Μαθηματική Λογική & Θεμέλια Μαθηματικών”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης