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...