ich einen Auftrag von meinem CS Professor haben:Algorithmus zu finden, wenn es irgendein i so dass array [i] gleich i
finden, in O (log n) Zeit, wenn in einer vorsortierten gegebenen Array von verschiedenen ganzen Zahlen gibt es einen Index i, so dass Array [i] = i. Beweisen Sie, dass die Zeit O (logn) ist.
Aktualisierung: Ganzzahl kann negativ, 0 oder positiv sein.
In Ordnung, also habe ich ein wenig damit gekämpft. Meine Idee ist dies:
Mit der binären Suche können wir nur sicher sein, dass es keinen solchen Wert links vom mittleren Element gibt, wenn array [mid] < = startindex, wobei mid der Index des mittleren Elements ist, und startindex ist der Anfang des Arrays.
Entsprechende Regel für die rechte Hälfte eines Arrays ist das Array [Mitte]> = Startindex + Numer, wobei Variablen wie oben und Numerisch die Anzahl der Elemente rechts von Mitte ist.
Das sieht nicht nach O (logn) aus, da ich im schlimmsten Fall die ganze Sache durchlaufen muss, oder? Kann mir hier jemand in die richtige Richtung zeigen oder mir sagen, dass das funktioniert?
Irgendwelche Ideen, wie ich das formell beweisen könnte? Ich frage nicht nach einer definitiven Antwort, sondern nach etwas Hilfe, um mich verständlich zu machen.
In C:
int _solve_prob_int(int depth, int start, int count, int input[])
{
if(count == 0)
return 0;
int mid = start + ((count - 1)/2);
if(input[mid] == mid)
return 1;
if(input[mid] <= start && input[mid] >= start + count)
return 0;
int n_sub_elleft = (int)(count - 1)/2;
int n_sub_elright = (int)(count)/2;
if(input[mid] <= start)
return _solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
if(input[mid] >= start + count)
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input);
return _solve_prob_int(depth + 1, mid - n_sub_elleft, n_sub_elleft, input) ||
_solve_prob_int(depth + 1, mid + 1, n_sub_elright, input);
}
Ein Testfall:
Sorted args: 1 2 3 4 5 6 7 8 9 10 11 12 :
Start: 0, count: 12, mid: 5 value: 6
Start: 0, count: 5, mid: 2 value: 3
Start: 0, count: 2, mid: 0 value: 1
Start: 1, count: 1, mid: 1 value: 2
Start: 3, count: 2, mid: 3 value: 4
Start: 4, count: 1, mid: 4 value: 5
Start: 6, count: 6, mid: 8 value: 9
Start: 6, count: 2, mid: 6 value: 7
Start: 7, count: 1, mid: 7 value: 8
Start: 9, count: 3, mid: 10 value: 11
Start: 9, count: 1, mid: 9 value: 10
Start: 11, count: 1, mid: 11 value: 12
Die oben ist mein Programm mit einigen Ausgang laufen nach wie es gesucht. Bei einer Liste von 1 - 12 dreht es sich um den Index 5 und stellt fest, dass bei den Indizes 0 bis 4 ein Wert zwischen 0 und 4 liegen kann. Es bestimmt auch, dass es einen Wert zwischen 6-11 bei den Indizes 6-11 geben könnte. So fahre ich fort, sie beide zu suchen. Ist das falsch?
Sind die Zahlen im Eingabefeld garantiert eindeutig? –
@Adam ja, sie sind verschieden. – Max