2012-05-05 2 views

ответ

4

span в конкретном узле хранит количество узлов между текущим узлом и узлом-> вперед на текущем уровне. span используется для вычисления ранга элемента 1 в списке пропуска.

Например, рассмотрим следующий список пропуску: A Skip List

Рассмотрим узел головки. Пролет на всех уровнях будет равен 1.

Рассмотрим узел 1. На уровне 0 диапазон равен 1, так как вы будете span 1 элемент, если следовать указателю вперед. На уровне 1 диапазон равен 2, потому что вы будете span 2 элемента (узел 2 и узел 3), если вы будете следовать указателю вперед.

Посмотрите на function zslGetRank in t_zet.c. Вы можете видеть, как ранг вычисляется из значения диапазона на каждом уровне.

+0

ваш anwer отлично ~~~ большое спасибо ~~~ Но я считаю, что skiplist можно заменить красно-черным деревом или splay-tree, которые, возможно, имеют более высокую производительность. – kaitian521

+1

Нет, не может. Список пропусков предлагает одно интересное свойство, которое нет в деревьях RB или деревьях. Он может найти n-й элемент при стоимости log (n). Используется, например, ZRANGE. –

+0

Я думаю, что дерево splay также может найти n-й элемент при log (n) стоимости с дополнительным элементом в узле. но splay тратить больше времени, чтобы писать и читать основную память, которая не так удобна для redis, как я думаю. – kaitian521