Когда вы имеете дело с дублирующимися ключами, вы всегда сталкиваетесь с листом, содержащим данный ключ, который вы искали.
Поскольку лист группирует все ключи вместе, вам просто нужно пройтись по листу влево (позиция -1), чтобы найти первую запись с данным ключом. Если вы найдете первый ключ листа, вам нужно проверить предыдущие листы.
Поскольку нет никаких возможных предположений о листе, который вы нажмете для дублированного ключа, вам нужно пройтись по всем предыдущим листам, пока не найдете лист, первый ключ которого не является ключом, который вы ищете. Если последний ключ этого листа не является ключом, который вы ищете (<), чем следующий лист, в противном случае этот лист. </p>
Поиск по листам является линейным внутри листа, у которого есть лог n, чтобы найти первую ключевую запись.
Если вы можете отсортировать ключевые записи в листе по имеющимся у них данным, вы можете легко найти лист для поиска определенной записи (которая отлично подходит для операций размещения и удаления).
для высокой вероятности дубликатов лучше всего искать другую модель хранения, храня ключ -> данные. Особенно если данные меняются не часто.
[Update]
Существует вероятность забыть ключ:
Узел N [L1 | 3 | L2]
Лист L1 [1,2,3] -> L2 [3, 4, 5]
Вы удаляете 3 в L2, в результате чего вы.
Узел N [L1 | 3 | L2]
Лист L1 [1,2,3] -> L2 [4, 5]
Когда вы сейчас ищете, вы обнаружите, что 3 не в L2. Теперь вы можете заглянуть в предыдущий лист, чтобы найти 3.
Другой способ - обновить ключ до фактического первого ключа листа, в результате чего (возможно, будет получено распространение обновления):
Узел N [L1 | 4 | L2]
Лист L1 [1,2,3] -> L2 [4, 5]
Или вы заимствуете из левого листа элемент.
Узел N [L1 | 3 | L2]
Лист L1 [1,2] -> L2 [3, 4, 5]
Я склонен использовать первое решение, так как оно работает также для листьев в середине многолистных дубликатов.