Dies kann O(logN)
mithilfe einer leicht modifizierten binären Suche erfolgen.
Die interessante Eigenschaft eines sortierten + gedrehten Arrays ist, dass beim Teilen in zwei Hälften immer mindestens eine der beiden Hälften sortiert wird.
Let input array arr = [4,5,6,7,8,9,1,2,3]
number of elements = 9
mid index = (0+8)/2 = 4
[4,5,6,7,8,9,1,2,3]
^
left mid right
Wie es scheint, wird das rechte Subarray nicht sortiert, während das linke Subarray sortiert wird.
Wenn die Mitte der Drehpunkt ist, werden sowohl die linken als auch die rechten Unterarrays sortiert.
[6,7,8,9,1,2,3,4,5]
^
In jedem Fall muss jedoch eine Hälfte (Sub-Array) sortiert werden .
Wir können leicht erkennen, welche Hälfte sortiert ist, indem wir das Start- und Endelement jeder Hälfte vergleichen.
Sobald wir herausgefunden haben, welche Hälfte sortiert ist, können wir sehen, ob der Schlüssel in dieser Hälfte vorhanden ist - einfacher Vergleich mit den Extremen.
Wenn der Schlüssel in dieser Hälfte vorhanden ist, rufen wir die Funktion in dieser Hälfte rekursiv auf,
andernfalls rufen wir unsere Suche in der anderen Hälfte rekursiv auf.
Wir verwerfen bei jedem Aufruf die Hälfte des Arrays, wodurch dieser Algorithmus erstellt wird O(logN)
.
Pseudocode:
function search( arr[], key, low, high)
mid = (low + high) / 2
if(low > high)
return -1
if(arr[mid] == key)
return mid
if(arr[low] <= arr[mid])
if (arr[low] <= key && arr[mid] >= key)
return search(arr,key,low,mid-1)
else
return search(arr,key,mid+1,high)
end-if
else
if(arr[mid] <= key && arr[high] >= key)
return search(arr,key,mid+1,high)
else
return search(arr,key,low,mid-1)
end-if
end-if
end-function
Der Schlüssel hier ist, dass immer ein Sub-Array sortiert wird, mit dem wir eine Hälfte des Arrays verwerfen können.
homework
Tag hinzu. Das würde die Leute ermutigen, Sie sanft in die richtige Richtung zu bewegen, anstatt übertragbare Antworten zu veröffentlichen.