Implementacja metod zapobiegania kolizji

0

Witam

Mam mały problem.
Zaimplementowałem w C algorytm zapobiegania kolizji w dwóch metodach: szukania liniowego oraz mieszania podwójnego.

Kod oparłem na podstawie tego artykułu
http://www.iitis.gliwice.pl/~emanuel/materialy/algorytmy/funk_miesz.pdf

Z tym pierwszym nie miałem problemu, natomiast z drugim, czyli mieszaniem podwójnym męczę się od jakiegoś czasu.
Nie dla każdej próbki danych program się zapętla. Dla niektórych liczb program się zapętla. Spróbujcie z resztą sami.

#include <stdlib.h>
#include <stdio.h>



int clear(int *t, int n) {
	int i;
	for(i=0;i<n;i++) {
    	t[i] = -1;
	}
}

int check(int *t, int n) {
	int i;
	for(i=0;i<n;i++) {
    	if (t[i]==-1) {
			return(0);
		}
	}
	return(1);
}

int show(int *t, int n) {
	int i;
	for(i=0;i<n;i++) {
		printf("%d ", t[i]);
	}
	printf("\n");
}

int h1(int x,int n)  {
	return x % n;
}

int h2(int x,int n)  {
	return x % (n-4);
}

int h(int x, int i, int n) {
	return (h1(x,n)+i*h2(x,n)) % n;
}


int main(void) {
	int n=4;
	int k=0;
	int i=0;
	int j=0;
	int l=0;
	
	int t[n];
	int p[] = {35,30,132,10,15};
	clear(t,n);
	while(check(t,n)==0)
	{
		k = h(p[j],i,n);
		printf("i=%d k=%d p[j]=%d\n", i,k, p[j]);

		if(t[k]==-1) {
			t[k]=p[j];
			show(t,n);
			i=0;
			j++;
				l++;
		} else {
			i++;
			
			printf("Kolizja w: t[%d]\n", k);
	l++;
		}
	
	}
	printf("\nLiczba wszystkich operacji: %d", l);
	return 0;
}

Bardzo bym prosił o przetestowanie sobie programu i o pomoc w znalezieniu błedu o ile taki istnieje.
Do tablicy p[] radze powstawiać sobie różne dane i zobaczyć zasadę działania.

Pozdrawiam, k0b3

Rozumiem, że to jednak spory problem te kolizje...

0

Nie, po prostu zadałeś pytanie w złym dziale i dałeś zły temat.
Gdybyś napisał ze chodzi o tablice hashujące (hashtable/hashmap) w C++ i dał to do dzialu C/C++ byłoby pewnie więcej odwiedzających. Bo kolizje w tym dziale większość ludzi odruchowo uzna pewnie za jakieś zabawy z grafiką komputerową.
Zresztą komu by się chciało przeglądać kod w którym nie ma ani jednego komentarza?
W Cormenie calkiem nieźle są opisane tablice hashujące i są chyba nawet pseudokody.

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