Introducción
Acceda rápidamente a los nodos manteniendo múltiples punteros a otros nodos en cada nodo
Velocidad de búsqueda: O promedio (log N), peor O (N)
Soporta operaciones secuenciales
Utilice la lista de omisión como una de las implementaciones subyacentes de las claves de colección ordenadas
naturaleza
- Cada capa es una lista vinculada ordenada, y la lista vinculada en la parte inferior (L1) contiene todos los elementos
- Si un elemento aparece en la lista vinculada en el nivel n, también aparece en el nivel n + 1
- La búsqueda primero busca desde el nivel superior. Cuando el elemento actual es más grande que el objetivo, se busca en el siguiente nivel (es decir, buscando datos más densos)
- En general, mira de arriba a la izquierda a abajo a la derecha
lograr
nivel: el número de niveles del nodo con el mayor número de niveles en la tabla
longitud: número de nodos
Nodo de lista de omisión
typedef struct zskiplistNode
{
struct zskiplistNode * backward;//后退指针
double score;//分值
robj * obj;//成员对象
struct zskiplistLevel //层
{
struct zskiplistNode * forward; //前进指针
unsigned int span;//跨度
}
}
Piso
La matriz de niveles puede contener varios elementos, y cada elemento contiene un puntero a otros nodos para acelerar el acceso a otros nodos.
Sienta la ley de potencia, genere aleatoriamente un valor de [1,32] como el tamaño de la matriz de niveles, es decir, la altura de la capa
Puntero hacia adelante
Cada capa tiene un puntero hacia adelante que apunta al final de la tabla (nivel [i] .hacia adelante)
lapso
Registra la distancia entre dos nodos
El intervalo de todos los punteros hacia adelante a NULL es 0
El tramo se utiliza realmente para calcular la clasificación: en el proceso de encontrar un nodo, se acumula el tramo de todas las capas visitadas en el camino, y el resultado obtenido es la clasificación del nodo objetivo en la tabla de salto (es decir, el nodo es el primero nodo)
Puntero trasero
Primero puede acceder al nodo de cola de la tabla a través del puntero de cola de la tabla de salto, y luego acceder al penúltimo nodo a través del puntero de atrás ... hasta que encuentre el puntero de atrás que apunta a NULL
Puntos y membresía
- Puntuación: todos los nodos de la tabla de salto se ordenan de pequeños a grandes
- Objeto miembro: puntero al objeto de cadena SDS
- El objeto miembro en la lista de salto debe ser único, pero la puntuación puede ser la misma
- Los nodos con la misma puntuación se ordenan en orden lexicográfico de variables miembro
Lista de omisión
typedef struct zskiplist
{
struct zskiplistNode * header,*tial;
unsigned long length;//表中节点的数量
int level;//表中层数最大的节点的层数
} zskiplist;
Permite a O (1) acceder a los nodos de cabecera y final de la tabla, acceder a la longitud de la tabla de salto y obtener el número de capas del nodo con la mayor cantidad de capas en la tabla.
t level; // El número de capas del nodo con el mayor número de capas en la tabla
) zskiplist;
使得能O(1)访问表头表尾节点,访问跳跃表长度,获取表中层数最大的节点的层数