Разрешение столкновений строк с использованием двойного хеширования?

У меня есть входной файл, имеющий около 10 тыс. строк. Мне нужно посчитать нет. коллизий, использующих открытую адресацию, двойное хеширование. Однако код переходит в бесконечный цикл, т. е. он не может найти ни одного пустого места для заполнения вообще! (для ввода больше 1000).

В соответствии с заданными мне вопросами, мы должны использовать это.Первый хэш: суммирование ASCII Второй хэш: деление, т.е. мод sizeof(Prime)

Я думаю, это как-то связано с моей хэш-функцией.

Я создал массив структуры для хранения строк, используя следующее.

struct table{
    char word[50];
};

а затем создал массив следующим образом:

struct table*array=(struct table*)malloc(10000*sizeof(struct table));

Ниже приведены 2 хеш-функции, которые я использовал:

int hash1(char* name) //This function calculates the ascii value
{
    int index=0;int i=0;
    for(;name[i]!='\0';i++)
    {
        index+=name[i];
    }
    return index;

}

int hash2(int index) //Calculates offset (mod with a large prime,Why do we do this?)
{
    int offset=index%1021;
    return offset;
}

Ниже моя функция вставки.

insert(char* name)
{
    int offset=0,index=0;
    index=hash1(name);//calculate the index from string
    index=index % 10000;//to keep index between 0-10k range
    while((array[index].word[0]!='\0')) // checking if space in array empty
    {
        collision+=1;    //global counter
        offset=hash2(index); //offset
        index=index+offset;
        index=index%10000;
    }
    strcpy(array[index].word,name);
    return array;

}

Как я могу улучшить мою хэш-функцию так, чтобы она посещала все 10k местоположения в массиве.?(или измените его целиком).

В соответствии с заданными мне вопросами, мы должны использовать это. Первый хэш: суммирование ASCII Второй хэш: деление, т.е. мод sizeof(Prime)

0 ответов

Другие вопросы по тегам