- Introducción al blogger: Un programa preparatorio para estudiar duro~
- Página de inicio del blogger: @is Yaoyaozi
- La columna a la que pertenezco: Aventuras en la Isla de Java [El Camino del Pequeño Blanco al Gran Hermano]
prefacio
Porque Yao Yaozi se está preparando para la Copa Blue Bridge y la competencia de selección ACM en la escuela, y recientemente está aprendiendo sobre algoritmos. Aprendí con la ayuda del sitio web AcWing. Este artículo es una nota sobre mi contenido de aprendizaje. Algunas de las explicaciones de los principios son amigos que pueden ver viñetas o comentarios durante mi proceso de aprendizaje. Creo que es muy bueno .
Este artículo trata sobre las estructuras de datos, principalmente el uso de matrices para simular varias estructuras de datos, principalmente para mejorar la eficiencia de los algoritmos.
Para algunos lugares que son relativamente oscuros y calvos, estoy acostumbrado a hacer dibujos para entender, por lo que verá mis diagramas cuidadosamente elaborados basados en plantillas o temas de algoritmos. ¡Espero que pueda ayudar a los estudiantes que están aprendiendo algoritmos juntos!
Debido a que Yaoyaozi todavía es un novato en este momento, puede haber partes donde no entiendo bien, o donde puedo entender mejor. ¡Por favor, señale más! ❤
¡Aviso! El método de explicación de cada estructura de datos a continuación adopta una plantilla de código + descripción y explicación de texto + diagrama
Tabla de contenido
1. Lista enlazada individualmente (lista de adyacencia)
Función: se utiliza principalmente para la lista de adyacencia , el gráfico de almacenamiento y el árbol.
plantilla de código
// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点,后一个
int head, e[N], ne[N], idx;
//NULL相当于-1,所以head = -1相当于head=NULL
// 初始化
void init()
{
head = -1;
idx = 0;
}
// 在链表头插入一个数a
void insert(int a)
{
e[idx] = a, ne[idx] = head, head = idx ++ ;
}
//将x插入到下标是k的点之后
void insert(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k]
ne[k] = idx;
idx ++;
}
// 将头结点删除,需要保证头结点存在
void remove()
{
head = ne[head];
}
- La matriz de nodos de almacenamiento
e[N]
y la siguiente matriz de punteros que almacenan el nodone[N]
se asocian a través de subíndices - idx solo registra la posición de la operación actual, y la lista vinculada generalmente implementada idx está fuera de servicio (los subíndices de matriz de los nodos frontal y posterior no necesitan ser continuos, y el siguiente idx debe encontrarse a través del ne actual [i] Esta es también la conexión entre los dos .
- Al comienzo de la cabecera
=-1
, este -1 es equivalente a la dirección físicaNULL
, lo que indica que la lista enlazada está vacía, es decir, la cabecera apunta a un nodo principal, y el método de interpolación de la cabecera se usa para hacer inteligentemente que este nodo vacío sea un nodo de cola . Por lo tanto , el campo puntero del último nodo de la lista enlazada individualmente realizado por la estructura de asociación esNULL
, la matriz realiza el último nodo de la lista enlazada individualmente, asumiendo que es i, luegone[i]=-1
; - Lo que se simula aquí es que no hay un nodo principal, y el puntero de la cabeza apunta directamente a la lista enlazada del nodo principal.
- Aunque la lista enlazada simulada por el arreglo no es bien entendida por la simulación de estructura/clase, la esencia es la misma, podemos compararla con un nodo Node.
- Entonces, de hecho, al dibujar una imagen, no hay necesidad de dividirla tan claramente. De hecho, antes de aprender a simular listas enlazadas con matrices, siempre pensé que las matrices y las listas enlazadas pertenecían a estructuras físicas . Solo ahora lo hice . ¡descubra que las listas enlazadas son en realidad una estructura lógica!
punto de comparación | Nodo simulado de estructura/clase | Nodo analógico de matriz |
---|---|---|
puntero del propio nodo | dirección física, nodo | Al subíndice de la matriz, representa su propio puntero |
Campo numérico | Solo defínalo en la estructura.node.val |
val[nodo], a través de la matriz para almacenar el campo de valor |
campo de puntero | definido en la estructura,node. next |
siguiente [nodo], almacenado a través de una matriz |
Operación de inserción gráfica (método de inserción de la cabeza)
2. Lista de enlaces dobles
Después de aprender acerca de las matrices para simular listas de enlace único, las listas de enlace doble son realmente fáciles de entender. De hecho, hay un campo puntero más.
- Lista enlazada simple: ne[i] almacena el siguiente puntero del nodo cuyo puntero es i
- lista de doble enlace
- l[i], el predecesor del nodo cuyo puntero es i (apuntando al nodo anterior)
- r[i], el backdriver del nodo cuyo puntero es i (apuntando al siguiente nodo)
//e[index],表示节点的值,l[index]表示节点的左指针,r[index]表示节点的右指针,idx表示当前用到哪个节点的”地址“
int e[N],l[N],r[N],idx;
//初始化
void init(){
//0是左端点,1是右端点
r[0] = 1,l[1] = 0;
idx = 2;
}
//在节点a的右边插入一个数x
void insert(int a,int x){
//1、让待插入节点占位
e[idx] = x;
//2、处理待插入点左右两侧
l[idx] = a,r[idx] = r[a];//注意,这里必须是r[a],因为a的下一个节点不一定和a顺序存储
//3、处理前一个节点和后一个节点
l[r[a]] = idx,r[a] = idx++;
}
Java Island Adventures [Road from Little White to Boss]
Pregunta diaria de LeetCode: Ataque a la gran fábrica