Если вы заметите последовательность квадратичных чисел: 1, 4, 9, 16, 25, ...
, вы заметите, что разница между последовательными элементами составляет 3, 5, 7, 9
, то есть нечетные числа.Поэтому вы можете использовать переменную i
, которая действует как счетчик / индекс, и использовать ее для увеличения вашей позиции для следующей итерации следующим образом:
position = (position + (2 * i + 1)) % self.table_size
, где position
- это индекс, который только что использовалсядля текущей итерации.
expected | i | new_position
1 | 0 | 0 + (2 * 0 + 1) = 1
4 | 1 | 1 + (2 * 1 + 1) = 4
9 | 2 | 4 + (2 * 2 + 1) = 9
16 | 3 | 9 + (2 * 3 + 1) = 16
25 | 4 | 16 + (2 * 4 + 1) = 25
Однако вам нужно будет изменить число приращений i
.Обычный выбор - просто использовать длину таблицы, но вы должны знать, что при квадратичном зондировании можно не найти действительный индекс в таблице, даже если он существует, просто итерируя значения table_length, а иногда он может даже не найти его, даже если выпродолжай зондировать вечно.Следовательно, вам нужно быть осторожным, чтобы установить правильный предел количества попыток проверки для одной операции
В качестве альтернативы, вы можете отслеживать первый вычисленный / хешированный индекс и всегда вычислять position
как:
current_position = original_position + i**2