estructura de datos
árbol negro rojo
Un AVL especial (árbol binario balanceado) del árbol rojo-negro. Cuando el árbol binario balanceado inserta y elimina nodos, se requiere una gran cantidad de operaciones de rotación para mantener las características, lo que reducirá el rendimiento. El árbol rojo-negro sacrifica las estrictas condiciones de equilibrio y mejora el rendimiento. Cuando el árbol rojo-negro se inserta en un árbol desequilibrado, se realizan un máximo de dos rotaciones, y cuando se elimina un árbol desequilibrado, se realizan un máximo de tres rotaciones.
Características:
-
Ya sea negro o rojo (ya sea negro o rojo)
-
El nodo raíz es negro.
-
Los nudos de las hojas son negros.
-
Si un nodo es rojo, sus dos nodos secundarios deben ser negros (todos los caminos desde la raíz hasta las hojas, no puede haber dos nodos rojos consecutivos)
-
Todas las rutas desde el nodo raíz hasta los nodos hoja contienen la misma cantidad de nodos negros (la misma altura negra)
Cómo se programan los procesos
Gestión de la fragmentación de la memoria (la memoria está relacionada con los árboles rojo-negro)
datos de la tarjeta de red
Árbol B y árbol B+
¿La diferencia entre ellos?
El árbol B también se denomina árbol de búsqueda equilibrado multidireccional y el número máximo de nodos secundarios que tiene se denomina orden. Generalmente representado por m, se cumplen las siguientes condiciones:
- Un nodo en el árbol tiene como máximo m subárboles y como máximo m-1 palabras clave.
- Si el nodo raíz no es un nodo terminal, debe tener al menos dos subárboles
- Todos los nodos no secundarios, excepto el nodo raíz, tienen al menos M/2 subárboles y como máximo M subárboles, y el rango de palabras clave es de M/2-1 a M-1.
- Las palabras clave de nodos suelen contener punteros a nodos secundarios.
- Los nodos de hoja aparecen en la misma capa sin información
- Todos los factores de equilibrio de los nodos son 0
El proceso de búsqueda del árbol B se divide en dos pasos: el primer paso es buscar el nodo, lo cual se realiza en el disco, luego la palabra clave del nodo se lee en la memoria y la búsqueda se realiza a través del Método de media búsqueda. Si no se puede encontrar la búsqueda, se realiza la búsqueda correspondiente. Se busca el nodo puntero. Si se encuentra un nodo hoja, significa que no existe.
árbol+b
- Un nodo en el árbol tiene como máximo M subárboles y M palabras clave.
- El rango del número de palabras clave (subárboles) es M/2-M, y las palabras clave también están en este rango.
- El nodo raíz todavía tiene al menos dos subárboles.
la diferencia:
- Los nodos no hoja del árbol B + solo sirven como índice. Cada elemento de índice del nodo no hoja solo contiene la palabra clave máxima del subárbol correspondiente y un puntero al subárbol, pero no incluye la dirección de almacenamiento de la palabra clave. . Por lo tanto, los nodos hoja contienen palabras clave, es decir, las palabras clave en los nodos que no son hoja también aparecerán en los nodos hoja; en el árbol B, las palabras clave contenidas en los nodos hoja y las palabras clave contenidas en otros nodos.
árbol de expansión mínimo
Kruskal: basado en el pensamiento codicioso, un paso de algoritmo específico,
Organice los bordes, es decir, los pesos, entre los vértices en orden ascendente en una matriz, y saque las variables de la matriz a su vez para formar un árbol. Si el borde eliminado forma un ciclo, descarte el borde. Si lo hace no forme un ciclo, agréguelo hasta que tenga n-1 aristas y el árbol de expansión esté completo.
Este algoritmo es adecuado para gráficos dispersos con relativamente pocas aristas.
Regla de Prim: también se basa en el pensamiento codicioso. La idea del algoritmo específico es la siguiente:
Seleccione aleatoriamente un punto, seleccione el punto más cercano al punto, agréguelo al conjunto, luego busque el punto más cercano al conjunto, agréguelo al conjunto y continúe buscando hasta que el número de puntos en el conjunto sea n, genere El El árbol está terminado.
Este algoritmo es adecuado para gráficos densos con muchas aristas.
Árbol de clasificación binaria y árbol binario equilibrado
Un árbol ordenado binario es una estructura de datos que es fácil de encontrar: el hijo izquierdo de cada nodo es más pequeño que el nodo y el hijo derecho es más grande que el nodo. Se puede obtener una disposición ordenada mediante un recorrido en orden. La velocidad de inserción, búsqueda y eliminación es Log2N.
Un árbol binario equilibrado significa que el valor absoluto de la diferencia de altura entre los hijos izquierdo y derecho de un nodo no puede exceder 1. Se crean árboles binarios equilibrados para mantener la estructura del árbol y mejorar la velocidad de búsqueda. Evite que el árbol de clasificación degenere en una lista vinculada.
Proceso de ajuste AVL:
Elimine el nodo. Si es un nodo hoja, elimínelo directamente. Si solo hay un subárbol, reemplácelo directamente con el subárbol. Si hay hijos tanto izquierdo como derecho, seleccione el nodo hoja del subárbol superior e intercámbielo con el nodo eliminado y elimínelo.
Todos primero juzgan el factor de equilibrio de arriba a abajo, encuentran el subárbol desequilibrado y luego seleccionan 3 nodos del nodo raíz para ajustarlos.
Varios métodos de ajuste para árboles de clasificación binaria:
LL zurdo, inserta un nodo en el subárbol derecho del hijo derecho, lo que genera un desequilibrio.
- El RR de rotación hacia la derecha inserta un nodo en el subárbol izquierdo del hijo izquierdo, lo que genera un desequilibrio.
- LR izquierdo y derecho insertan nodos en el subárbol derecho del hijo izquierdo, lo que genera un desequilibrio.
- RL derecha-izquierda inserta un nodo en el subárbol izquierdo del hijo derecho, lo que genera un desequilibrio.
8 algoritmos de clasificación principales
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-mMuhTmim-1661000957154)(%E7%BA%A2%E9%BB%91 %E6%A0%91.activos/imagen-20220722110258118.png)]
Tipo de inserción:
- clasificación por inserción directa
La complejidad del tiempo promedio es O (N2), la idea es insertar un elemento a ordenar en la secuencia previamente ordenada. Cuando los elementos mismos están ordenados, la complejidad temporal es al menos O (N)
- Clasificación de colinas:
De hecho, es una clasificación de inserción especial. Divide los elementos en múltiples grupos estableciendo el incremento. Cada grupo se ordena, y luego el incremento se divide a la mitad, y luego los grupos se ordenan. Cuando el incremento se reduce a 1, degenera Se convierte en tipo de inserción directa.
Tipo de intercambio:
-
Ordenamiento de burbuja
Como sugiere el nombre, los elementos se comparan en secuencia y retroceden continuamente. Cuando no se cumple la condición de burbujeo, se determina la posición final. La complejidad de tiempo promedio también es O (N2) y la complejidad de tiempo mínima es O (N). ).
-
Ordenación rápida
Este es un método de clasificación inestable con una complejidad de tiempo promedio de (NlogN) y se basa en la idea de divide y vencerás. Seleccione cualquier elemento como pivote y divida la lista ordenada en dos partes independientes mediante una clasificación. Cada clasificación determinará la posición final de un elemento, de modo que los elementos delante del elemento sean más pequeños que él y los elementos detrás de él. son más grandes que él. Ordene rápidamente la sublista de forma recursiva.
clasificación de selección
-
Orden de selección simple
Como sugiere el nombre, cada vez se selecciona el número más pequeño y se coloca en la posición correspondiente, de modo que la secuencia se vuelve ordenada gradualmente.
-
clasificación de montón
Pila de raíces pequeñas y pila de raíces grandes. Un montón raíz pequeño satisface el requisito de que todos los elementos secundarios sean más grandes que el nodo raíz, mientras que un montón raíz grande satisface lo contrario. Las propiedades incluyen el valor máximo o mínimo del elemento superior del montón. El montón almacenado en una matriz satisface que el subíndice del hijo izquierdo sea igual a 2n + 1 y el subíndice del nodo del hijo derecho sea 2n + 2.
Luego, el proceso de clasificación consiste en comparar cada nodo secundario con su nodo principal e intercambiarlo si es mayor que el nodo principal. Y realice operaciones de intercambio de forma recursiva hasta que sea menor que el nodo principal. Este proceso se llama caída.
El proceso de insertar elementos consiste en colocar los elementos al final y luego soltarlos.
Eliminar el elemento superior del montón significa intercambiar el elemento superior del montón con el último elemento y luego eliminar el último elemento después de eliminarlo.
fusionar ordenar
La idea de fusionar orden es fusionar listas ordenadas para obtener una lista ordenada más grande. Al fusionar, solo necesita comparar los primeros elementos en dos o más listas ordenadas y seleccionar el elemento más pequeño para colocar en la nueva lista ordenada. lista. La ordenación por combinación inicialmente trata cada elemento como una lista ordenada, luego los combina de dos en dos y finalmente los combina en una lista ordenada grande mediante operaciones recursivas. La llamada idea de dividir y conquistar es dividir recursivamente un gran problema en innumerables problemas pequeños para resolver.
ordenar cubos
Es una extensión de la clasificación por base: utiliza la idea de dividir y conquistar para colocar elementos en cubos en el rango correspondiente, luego clasificar los elementos en cada cubo y luego sacarlos.
Ordenación por base
Describe brevemente el proceso de búsqueda binaria.
La búsqueda binaria, también llamada media búsqueda, es adecuada para listas ordenadas. La idea es comparar primero con el elemento del medio. Si es menor que el elemento, se buscará en la primera mitad. Si es mayor que el elemento, será buscado en la segunda mitad. De esta manera, el alcance de la búsqueda se reduce continuamente y la complejidad promedio del tiempo de búsqueda es log2N.
¿Cuál es la diferencia entre pila y cola?
Una pila es una estructura lineal (una colección ordenada de elementos de datos) con un puntero encima. La característica es que los elementos se insertan en un extremo y se eliminan en el otro extremo, primero en entrar, último en salir.
Una cola es una estructura lineal con un puntero de cabecera y un puntero de cola. La característica es que los elementos se insertan en un extremo y se eliminan en el otro extremo, primero en entrar, primero en salir.
¿Qué estructura de datos se utiliza para encontrar el nombre más rápido por número de estudiante?
A través de la tabla hash, la complejidad temporal es O (1), porque el principio de almacenamiento de la tabla hash es utilizar el algoritmo hash para obtener un código hash, que es el valor del subíndice almacenado, y luego colocar el valor en la posición correspondiente. .almacenamiento. Una tabla hash es esencialmente una matriz.
Para ordenar una gran cantidad de datos, utilice
Al eliminar e insertar datos cuando se utiliza la media búsqueda, es necesario mover la posición. ¿Existe alguna forma más eficiente?
La media búsqueda en realidad construye un árbol de clasificación binario, por lo que podemos usar un árbol de clasificación binario para almacenar la secuencia, lo que será mucho más conveniente al agregar y eliminar.
Clasificación de los resultados de millones de examinados
La desventaja de utilizar la clasificación de depósitos es que consume mucho espacio adicional, pero la complejidad del tiempo es baja, O (N + M), n es el número de elementos, M es el número de depósitos y la complejidad del tiempo es O. (k * N). La complejidad temporal de la clasificación de bases también es esta
Si utiliza una computadora de alto rendimiento para observar la complejidad del tiempo promedio, la complejidad del tiempo de la clasificación de montón, clasificación de depósito y clasificación de fusión es aún menor.
¿Y si lo diseñas tú mismo?
Describe brevemente el algoritmo KMP.
Árbol binario completo: como sugiere el nombre, excepto que los nodos hoja no tienen nodos secundarios, cada nivel tiene dos nodos secundarios.
Para la clasificación rápida ordenada, degenerará en un árbol de una sola rama y la complejidad temporal es O (N2).
¿Qué es una estructura de datos y la relación entre estructuras de datos y algoritmos (desconocido)
Programa = estructura de datos + algoritmo.
La relación entre estructuras de datos y algoritmos es: la estructura de datos es la capa inferior, el algoritmo es la capa de alto nivel, la estructura de datos sirve al algoritmo y el algoritmo opera alrededor de la estructura de datos. El algoritmo selecciona la estructura de datos adecuada en escenarios de aplicación específicos. Por ejemplo, en escenarios donde hay muchas operaciones de inserción y eliminación de datos, la estructura de datos de listas vinculadas es adecuada. Cuando el número de lecturas de datos es grande, la estructura de datos de matrices es adecuado estructura.
Estructura de datos: los datos no existen de forma independiente, existe una relación entre los datos, esta relación se denomina estructura. La estructura de datos incluye tres aspectos: estructura lógica, estructura de almacenamiento y operación de datos. El diseño del algoritmo depende de la estructura lógica seleccionada y la implementación del algoritmo depende de la estructura de almacenamiento utilizada.
¿Cuáles son las aplicaciones de las estructuras de datos en redes informáticas y sistemas operativos?
- Sistema operativo: la programación de procesos se aplica a pilas y colas, la gestión de archivos se aplica a árboles, gráficos y clasificación, y el almacenamiento de información se aplica a listas y cadenas lineales.
- Red informática: Agrupación y reenvío utilizan colas y gráficos. El análisis de DNS se aplica a los árboles y se utilizan tablas lineales para representar información.
¿Cuáles son las similitudes y diferencias entre listas enlazadas y matrices?
Similitudes: ambos pueden representar estructuras lineales: la lista vinculada apunta al siguiente nodo a través del nodo anterior, mientras que la matriz se almacena secuencialmente en la memoria.
La diferencia: la dirección física de los datos almacenados en la matriz es continua, mientras que la ubicación física de los datos almacenados en la lista vinculada no es continua, sino que apunta al siguiente nodo a través del puntero de cada nodo. Las listas enlazadas son adecuadas para insertar y eliminar datos, y las matrices son adecuadas para buscar datos.
¿Qué es una estructura?
Una estructura de datos personalizada compuesta de estructuras de datos básicas.
¿Cuál es la diferencia entre un árbol binario y un árbol con sólo dos hijos?
Los subárboles de cada elemento del árbol binario están ordenados, es decir, se pueden distinguir por los subárboles izquierdo y derecho. No hay derecha ni izquierda entre los dos hijos del árbol.
Encuentra factorial recursivamente
int fact(int n){
if(n==1){
return 1;
}else{
return n*fact(n-1);
}
}
Realizar un recorrido jerárquico del árbol.
Puede usar una cola para atravesar, es decir, realizar un recorrido de búsqueda primero en amplitud, colocar el nodo raíz en la cola y luego sacarlo de la cola. Después de cada salida de la cola, los nodos secundarios deben colocarse en la cola por turno, hasta que todos los nodos se retiran de la cola y, una vez que no se colocan nodos en la cola, se completa el recorrido de nivel.
¿Qué método se utiliza para ordenar matrices numéricas?
- Si n es relativamente pequeño, utilice la ordenación por inserción directa o la ordenación por selección simple.
- Si la matriz está básicamente en orden, utilice la inserción directa o la clasificación por burbujas.
- Si n es relativamente grande, utilice la clasificación rápida, la clasificación en montón y la clasificación por combinación.
- Si n es grande, se utiliza la clasificación por base.
¿Qué es un árbol de Huffman? cual es el efecto
Árbol de Huffman: el árbol binario con la ruta ponderada más corta entre todos los árboles binarios compuesto por n nodos de hoja ponderados.
Codificación de Huffman: para un árbol de Huffman con n nodos de hoja, si a cada rama izquierda del árbol se le asigna 0 y a la rama derecha se le asigna 1, entonces la ruta desde la raíz hasta cada hoja constituye una cadena binaria que se denomina codificación de Huffman. es el código de prefijo óptimo (cada código no puede denominarse prefijo de otros códigos) y se utiliza a menudo para la compresión de datos.
Estructura de almacenamiento en montón
La estructura de almacenamiento físico es una matriz y la estructura de almacenamiento lógico es un árbol.
Conflictos hash y cómo resolverlos
El conflicto de hash se refiere a la situación en la que diferentes valores se asignan al mismo valor.
Los métodos de resolución de conflictos incluyen el método de cremallera y el método de dirección abierta.
- Dirección abierta:
- Sondeo lineal: coloque valores conflictivos en unidades de almacenamiento posteriores
- Detección de cuadrados: centre la unidad con valores conflictivos y busque unidades de almacenamiento adecuadas en números cuadrados en ambos lados.
- Rehashing: cree una segunda función hash para procesar
- Método de cremallera, que utiliza punteros para conectar valores en conflicto
La altura de un árbol binario completo: hay n nodos, la altura es log2 (n+1)
Encuentra el nodo intermedio en la lista enlazada individualmente
A través de los punteros rápido y lento, el puntero lento mueve un nodo a la vez y el puntero rápido mueve dos nodos a la vez. Cuando el puntero rápido llega al final, el puntero lento alcanza la posición media.
La diferencia entre el árbol de búsqueda binaria y la búsqueda binaria implementada por matriz
El árbol de búsqueda binaria es una búsqueda dinámica que puede facilitar la inserción y eliminación de datos, mientras que la búsqueda binaria es una búsqueda estática y no es conveniente para eliminar datos.
¿Camino más corto?
Dijkstra (basado en el pensamiento codicioso)
Requiere: visitado[], D[], ruta[], arcos[] [];
Se refiere a los nodos visitados respectivamente, y luego a los nodos restantes, la ruta más corta al nodo correspondiente, que se usa para registrar, y finalmente se usa una matriz bidimensional para representar la relación entre los nodos, que es la longitud de la ruta.
A través de rondas de comparaciones, cada vez se enumera la distancia a los nodos que se pueden alcanzar, y luego los nodos a los que se puede llegar con la distancia más corta se agregan al conjunto de Vist, y luego se enumeran las distancias a los nodos restantes en D , porque Cada vez que se agrega un nuevo nodo, la ruta se actualizará, pero cada vez se selecciona el nodo con la ruta más corta para unirse hasta que el conjunto de nodos restante esté vacío y la ruta siga siendo la ruta más corta.
algoritmo de freud
La idea es más simple, utiliza la idea de programación dinámica y la complejidad del tiempo es O (N3).
Actualice una distancia de grabación de matriz bidimensional a través de un bucle de tres niveles
La ecuación de transferencia es a[i] [j]=min(a[i] [j], a[i] [k]+a[k] [i]);
Árbol de expansión mínimo:
Prim, el método de adición de puntos, primero selecciona aleatoriamente un punto y lo coloca en el conjunto de nodos visitados, y luego selecciona el nodo más cercano al nodo, es decir, el nodo con el peso más pequeño, de los nodos restantes para unir. y así sucesivamente, hasta que se haya accedido a todos los nodos.
Algoritmo de Kruskal (método de suma de bordes): es el proceso de fusionar continuamente bosques profundos en árboles, ordenar los bordes en el gráfico de pequeño a grande, seleccionar el borde más pequeño y agregar su nodo correspondiente al conjunto de nodos visitados. Hasta que se agreguen todos los nodos al conjunto, pero en este proceso, es necesario determinar si los bordes agregados forman un ciclo, lo que requiere juicio, a través del método de búsqueda de unión, y si los nodos ya están en el mismo árbol, y sus antepasados Los nodos son consistentes e inicialmente el antepasado de cada nodo es él mismo.
algoritmo KMP
Este algoritmo es un algoritmo de coincidencia de cadenas que busca la cadena contenida en una cadena principal.
El método tradicional de solución de fuerza bruta es configurar un puntero para cada cadena, comenzar desde el principio y luego moverse y comparar continuamente uno por uno. Una vez que sean diferentes, los punteros de las dos cadenas volverán al encabezado y al principal. La cadena avanzará un paso. Este algoritmo es complejo en el tiempo. El grado es O (N * M),
KMP, la responsabilidad temporal del algoritmo es O (M * N). Utiliza principalmente los prefijos repetidos de las cadenas durante el proceso de coincidencia. Utiliza la información de falla para evitar comenzar la coincidencia nuevamente cada vez. La clave de la coincidencia es cree una matriz, y cada matriz registra la posición desde la cual comenzará la coincidencia después de que no logremos coincidir.
La solución a la siguiente matriz es la programación dinámica.
El método para encontrar el prefijo y sufijo común más largo y determinar el prefijo común de cadenas es compararlos en secuencia. Si son iguales
El código clave del sufijo más largo del k-ésimo elemento:
S representa una matriz de cadenas y luego representa una matriz de registros.
siguiente(k) = S[k]==S[0+siguiente[k-1] ] ? siguiente(k-1)+1: 0