"Diseño e implementación de Redis" Capítulo 5_ Tabla de salto

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

  1. Cada capa es una lista vinculada ordenada, y la lista vinculada en la parte inferior (L1) contiene todos los elementos
  2. Si un elemento aparece en la lista vinculada en el nivel n, también aparece en el nivel n + 1
  3. 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)
  4. En general, mira de arriba a la izquierda a abajo a la derecha

lograr

IMG_20200818_102630

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

  1. Puntuación: todos los nodos de la tabla de salto se ordenan de pequeños a grandes
  2. Objeto miembro: puntero al objeto de cadena SDS
  3. El objeto miembro en la lista de salto debe ser único, pero la puntuación puede ser la misma
  4. 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)访问表头表尾节点,访问跳跃表长度,获取表中层数最大的节点的层数

Supongo que te gusta

Origin blog.csdn.net/weixin_42249196/article/details/108139848
Recomendado
Clasificación