Szukanie interpolacyjne

0

Nie wiem czemu algorytm mi nie dzial (zapetla sie). Jakby ktos znalaz blad to bylbym wdzieczny. Algorytm:

/SZUKANIE INTERPOLACYJNE****************/
int szukinter(unsigned long int *tablica,unsigned long int szukana, int maxsize, float *time,int *rezultat)
{
int l,p,k;
float alfa; //wspolczynik interpolacji
int lobiegow; //liczba wyszukiwan
int petla; //liczba obiegow petli - pomiar czasu
float start_time, end_time; //zmienne do pormiaru czasu (poczatkowy i koncowy)

start_time=clock();
for (petla=1000000;petla>0 ;petla--)

{
lobiegow=0;
l=0;
p=maxsize-1;
do
{
lobiegow++;
if (tablica[l]==tablica[p])
if (tablica[p]!=szukana)break; //dzielenie przez 0!

		alfa=(float)(szukana-tablica[l])/(float)(tablica[p]-tablica[l]);
		if (alfa>0&&alfatablica[k]) l=k+1;
			else p=k-1;
		}
	
}
while (tablica[k]!=szukana && alfa>0 && alfa
0

Szczerze mówiąc nie spotkałem sie z tym algorytmem i nie wiem jak działa , ale chyba znalazłem coś co powoduje błąd , Otóż <font color="red">załużmy</span> , że mamy <font color="red">taka</span> <font color="red">tablice</span> wejściową :
1,2,3,4,40
i szukamy 4

na początku alfa = 1/13
k=1+1/133=1i3/13=1 ( bo k jest int )
następnie szukana (4) > tablica[1] (2) , więc : l=2
następny obieg pętli :
alfa=(4-3)/(40-3)=1/37
k=1+1/37
2=1 ( bo k jest int )
szukana (4) > tablica[1] (2) , więc l=2

i tu sie zapętlamy , bo żadna ze zmiennych , z której liczymy alfa <font color="red">sie</span> nie zmieniła . Wydaje mi <font color="red">sie</span> , że program może działać zupełnie inaczej dla innych danych wejściowych . Gdybyś mi powiedział jak algorytm działa ( link do artykułu , lub krótki ( albo lepiej długi ;) ) opis działania ) i powiedział jakie są dane wejściowe , to bym poszukał błędu , ale póki <font color="red">nie</span> wiem jak to ma działać , to nic nie zdziałam.

0

Wielkie dzięki.

Ogolnie ten algorytm ma byc uspranieniem wyszukiwania binarnego, polegajacym na przyblizeniu kolejnego strzalu do wartosci spodziewanej (wspolczynik alfa)

Glownymi danymi wejsciowymi sa tablica (niemalejaca), maxsize(nr ostatniej komorki) oraz szukana. Reszta zmienych sluzy tylko do badania wydajnosci algorytmu

Mam nadzieje, ze tyle opisu wystarczy.

Pozdrawiam i dziekuje

0

chialbym zwrocic jeszcze uwage, ze w teoim przykladzie jest blad, bo:
k=1
l=2
k=2+alfa...
l=2+1=3
itd.

Pozdrawiam i dziekuje

0

chialbym zwrocic jeszcze uwage, ze w teoim przykladzie jest blad, bo:
k=1
l=2
<font color="red">k=2+alfa...
l=2+1=3
itd.</span>

a nie zgodze sie , linijki czerwone sa już źle liczone , czemu piszesz , że k=2+alfa... ??
przecież w twoim kodzie ta linijka wygląda tak :
alfa=(float)(szukana-tablica[l])/(float)(tablica[p]-tablica[l]);
if (alfa>0&&alfatablica[k]) l=k+1;
else p=k-1;
do k przypisujemy 1 + alfa*(p-l) a nie tak jak ty napisałeś : l + alfa...
mam racje ??

0

Przepraszam,
ale w moim kodzie jest blad powinno byc
k=l+alfa*(p-l)

0

Już , powinno być dobrze , dokonałem małych zmian , daj znac czy dobrze chodzi , testowałem dla różnych ciągów i było ok :
[code]#include
#include
#include
#include

int szukinter(unsigned long int *tablica,unsigned long int szukana, int maxsize, float *time,int *rezultat)
{
int l,p,k=0;
float alfa; //wspolczynik interpolacji
int lobiegow; //liczba wyszukiwan
float start_time, end_time; //zmienne do pormiaru czasu (poczatkowy i koncowy)

start_time=clock(); 
lobiegow=0; 
l=0; 
p=maxsize-1; 
do 
{ 
	lobiegow++; 
	if (tablica[l]==tablica[p]) 
	{
		k=l;
		break;
	}
	alfa=(float)(szukana-tablica[l])/(float)(tablica[p]-tablica[l]); 
	if (alfa>=0 && alfatablica[k]) 
			l=k+1; 
		else 
			p=k-1; 
	}
}while(tablica[k]!=szukana && l=0 && alfa
0

Wielki dzieki i pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1