2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Квадратичное рехеширование
Сообщение18.05.2013, 05:43 
написал программу (составляет хеш-таблицу) и в случаи коллизии использовал линейное рехеширование, вот код:
Используется синтаксис C
l = possitioning(name);
                while(A->T[l].memory)
                {
                        l++;
                        if(l == possitioning(name))
                                return false;
                        if(l > 10)
                                l = 0;
                }
 

а как сделать квадратичное таким образом, чтоб не зацикливалось и просматривались все позиции.
Проще говоря мне нужно заменить
Используется синтаксис C
l++
на что то другое. И если я не ошибаюсь, то что-то другое - это будет формула вида:
$f(c) + a_1 \cdot i + a_2 \cdot i ^ 2$где я просто не могу подобрать коэффициенты:)

P.S. Таблица содержит 10 элементов максимум

 
 
 
 Re: Квадратичное рехеширование
Сообщение23.05.2013, 23:53 

(Оффтоп)

StopCry в сообщении #725293 писал(а):
P.S. Таблица содержит 10 элементов максимум
Это кошмар. А почему 10?

По теме не скажу, а вот вместо вычисления смещения заново можно прибавлять, кроме текущего увеличения на константу, последовательно увеличивающиеся числа $n,2n,3n,\ldots$, т. к. $(n+1)^2 - n^2 = 2n + 1$. Время почти то же и не в нём дело; если таблица большая была бы, то квадрат мог бы не влезть в разрядность, а соответствующая разность его с предыдущим — да. Кроме того, такая разность вообще всегда влезет, потому что она каждый раз берётся по модулю размера таблицы, и можно хранить не эту разность $kn + a$, а $(kn + a) \bmod \text{размер таблицы}$.

(Не знаю только, стоит ли такая, хоть и немудрёная, игра свеч — как часто используют избавление от коллизий именно прибавлением квадратов.) Извините за оффтоп. :-)

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group