Dies ist der Algorithmus:Wie kann ich beweisen, dass dieser binäre Suchalgorithmus korrekt ist, indem er die Logik verwendet?
// Precondition: n > 0
l = -1;
r = n;
while (l+1 != r) {
m = (l+r)/2;
// I && m == (l+r)/2
if (a[m] <= x) {
l = m;
} else {
r = m;
}
}
// Postcondition: -1 <= l < n
ich einige der Forschung getan haben und verengte die invariante bis if x is in a[0 .. n-1] then a[l] <= x < a[r]
.
Ich habe keine Ahnung, wie man von dort aber weiterkommt. Die Voraussetzung scheint zu groß zu sein, so dass ich Probleme habe, diese P -> I
zu zeigen.
Jede Hilfe wird sehr geschätzt. Dies sind die logischen Regeln, die verwendet werden können, um die Korrektheit des Algorithmus zu beweisen:
Post-Zustand des 'while' Schleife die Umkehrung seiner Fortsetzungsbedingung ist, so in Ihrem Fall ist es'! (L + 1! = R) ', dh' l + 1 == r'. – dasblinkenlight