2015-09-01 7 views
6

kam ich zu wissen, dass Interpolationssuche eine Modifikation von Binäre Suche ist wo in binärer Suche die Eingabe in zwei gleiche Hälften in jeder Iteration geteilt durchRechnen in der Interpolationssuche?

Berechnung
mid = (low + high)/2 

und in Interpolationssuche die Mitte ist berechnet als

mid = low + (key - arr[low]) * ((high - low)/(arr[high] - arr[low])) 

Jetzt muss ich diese Formel verstehen, von mid in Interpolationssuche berechnen.

Ref: https://en.wikipedia.org/wiki/Interpolation_search#Sample_implementation

+0

Angenommen, 'niedrig = 10', 'hoch = 20', 'arr [niedrig] == 100' und 'arr [hoch] == 200'. Berechnen Sie nun 'mid' für' key == 110', 'key == 150' und' key == 190'. – Henrik

+0

@ Henrik aber wie ist diese Formel abgeleitet? –

Antwort

5

Sie von Array arr als Funktion denken kann f, die auf Index wirkt und einen Wert zurückgeben, die monoton ist (weil Array sortiert ist). So haben Sie Ihre Ausgangsdaten f(low) = m und f(high) = M. Jetzt können Sie Ihre Funktion f mit einer geraden Linie interpolieren, was ziemlich sinnvoll ist, weil Ihre f monoton ist und Sie nur 2 Punkte haben. So sollte Ihre Interpolation Linie sein (lineare Funktion), die die Wurfpunkte (low, m) und (high, M) übergibt. Das ist es Gleichung

(y - f(low))/(f(high) - f(low)) = (x - low)/(high - low) 

So y hier ist das Element des Suchraumes und x ist von Domain (x Index des Array). Also, wenn Ihre Funktion f wäre das gleiche, wie es Interpolation ist, dann Index Ihrer key wäre:

x = low + (high - low)*(key - f(low))/(f(high) - f(low)) 

Also, vorausgesetzt, dass Ihre Funktion f nahe ist es Interpolation, sollten Sie nur den Wert überprüfen f bei x um zu sehen, ob es das Ziel ist. Andernfalls schrumpfen Sie nur Ihr Interpolationsintervall.

+0

wie Sie diese Formel erhalten - http://formulas.tutorvista.com/math/interpolation-formula.html – roottraveller

4

Eine Erweiterung auf @JustAnotherCurious Antwort

die Gleichung von ihm perposed auf Interpolation Formula (EQU einer Linie) beruhte

enter image description here

Nun denken f() als Funktion das nimmt einen Index und gibt seinen y Achsenwert,

zurück
y1 = f(low) 
y2 = f(high) 
x1 = low 
x2 = high 

(y - f(low)) = [(f(high) - f(low))/(high - low)] * (x - low); 

OR 

x = low + [(high - low) * (y - f(low))]/(f(high) - f(low)) 

here: y = key 
we are looking for position(value) of x. 
Verwandte Themen