У меня есть идея для вас. Мы используем «курсор», чтобы найти элемент в списке пропусков. Курсор также поддерживает след, который был взят, чтобы добраться до предмета. Мы используем этот след для удаления и вставки - он избегает повторного поиска для выполнения этих операций и встраивает номер версии списка, который был замечен при выполнении обхода. Мне интересно, если вы могли бы использовать курсор, чтобы быстрее найти предыдущий элемент.
Вам нужно подняться на уровень курсора, а затем искать предмет, который чуть меньше вашего предмета. В качестве альтернативы, если поиск достиг нижнего уровня связанного списка, просто сохраните предыдущий ptr при прохождении. Самый низкий уровень, вероятно, используется 50% времени, чтобы найти ваш предмет, поэтому производительность будет приличной.
Хм ... если подумать об этом сейчас, кажется, что курсор в 50% случаев будет иметь предыдущее значение, 25% времени потребуется для повторного поиска с 1 уровня, 12.% на 2 уровня и т. Д. Так что в редких случаях вам приходится почти полностью повторять поиск.
Я думаю, что преимущество в этом заключается в том, что вам не нужно выяснять, как "заблокировать бесплатно", чтобы поддерживать двойной связанный список пропусков, и в большинстве случаев вы значительно снижаете стоимость поиска предыдущего элемента.