Я предполагаю, что вы имеете в виду, как найти k
-й самый маленький (или самый большой) элемент в списке пропуска. Я думаю, это довольно стандартное предположение, в противном случае вы должны уточнить, что вы имеете в виду.
Я отвечу на GIF в Википедии в этом ответе: https://en.wikipedia.org/wiki/Skip_list
![enter image description here](https://i.stack.imgur.com/RShSM.png)
Допустим, вы хотите найти k = 5
наименьший элемент.
Вы начинаете с самого высокого уровня (4 на рисунке). Сколько элементов вы бы пропустили от 30
до NIL
? 6
(мы также считаем 30
). Это слишком много.
Пройдите уровень ниже. Сколько пропущено от 30
до 50
? 2
: 30
и 40
.
Таким образом, мы сократили проблему до поиска k = 5 - 2 = 3
наименьшего элемента, начиная с 50
на уровне 3
.
Сколько пропустили от 50
до NIL
? 4
, это слишком много.
Пройдите уровень ниже. Сколько пропущено от 50
до 70
? 2
. Теперь найдите 3 - 2 = 1
наименьший элемент, начиная с 70
на уровне 2
.
Сколько пропустили с 70
до NIL
? 2
, слишком много.
От 70
до 90
на уровне 1
? 1
(само по себе). Таким образом, ответ 70
.
Таким образом, вам нужно хранить количество пропущенных узлов для каждого узла на каждом уровне и использовать эту дополнительную информацию для получения эффективного решения. Похоже, именно это fDistance[i]
делает в вашем коде.