La investigación de seguridad informática revisa el conocimiento débil de la estructura de datos

​Leí
un artículo de estructura de datos muy completo escrito por un blogger, y aquí me confundo y resumo el conocimiento que debe fortalecerse.

Enlace de referencia: https://blog.csdn.net/weixin_40113925/article/details/100938378

1. Crea una lista enlazada lineal

Creación de tablas por método de inserción de cabeza (orden inverso), creación de tablas por método de inserción de cola (secuencia)

2. Lista enlazada estática

Use una matriz unidimensional para implementar una lista enlazada lineal. La capacidad es segura. El puntero en la lista enlazada estática representa la posición del siguiente elemento en la matriz. Es una estructura de almacenamiento secuencial. La lista enlazada estática también se implementa modificando el campo del puntero al insertar y eliminar.

3. Apilamiento secuencial

La estructura de almacenamiento secuencial de la pila. Cuando top=-1, es una pila vacía y top=0 significa que solo hay un elemento en la pila. top se incrementa automáticamente cuando los elementos se colocan en la pila.

4. Pila de cadenas

La estructura de almacenamiento vinculada de la pila. El puntero superior de la pila es el puntero principal de la lista enlazada. No hay necesidad de juzgar que la pila está llena, pero es necesario juzgar que la pila está vacía.

5. Número de Cattelan

El número catalán es una secuencia de números que a menudo aparece en varios problemas de conteo en combinatoria.
La secuencia de empuje de una pila es 1, 2, 3,,,, n, ¿cuántas secuencias pop diferentes hay?
C(2n,n)/(n+1) piezas. (Número de Cattelan)
Determine si el orden de apilamiento es verdadero: después de cierto número, todos los números más pequeños que este número deben ordenarse en orden descendente.

6. Use la pila para realizar infijo a sufijo

Recorra cada número y símbolo de la expresión infija de izquierda a derecha. Si es un número, se generará directamente. Si es un símbolo, juzgue su prioridad con el símbolo superior de la pila. Si es un paréntesis derecho o tiene una prioridad más baja que el símbolo superior en la pila, entonces los elementos superiores se extraen de la pila y se muestran a su vez, hasta que el paréntesis izquierdo o la pila estén vacíos, el símbolo con prioridad baja se empuja a la pila Nota
: () no aparece en la expresión de sufijo
para ejemplos específicos. /qq_41686130/article/details/82858997

7. Cola secuencial

La estructura de almacenamiento secuencial de la cola. La cola está vacía cuando los punteros de cabeza y cola son iguales. En una cola no vacía, el puntero de la cabeza siempre apunta a la posición anterior a la cabeza de la cola y el puntero de la cola siempre apunta a la posición real del elemento al final de la cola.

8. Cola circular

Excepto por algunas aplicaciones simples, la cola secuencial realmente práctica es la cola circular. Por lo tanto, los punteros de cabeza y cola son iguales cuando el equipo está vacío y cuando el equipo está lleno. Por lo tanto, no podemos juzgar si la cola está "vacía" o "llena" a través de front=rear.

9. Cadenas vacías y en blanco

Una cadena de longitud 0 se denomina cadena vacía.
Una cadena que consta solo de uno o más espacios se denomina cadena en blanco.

10. Número de sucursales

Número de ramas = número total de nodos - 1 = nodo * grado

11. La diferencia entre un árbol binario y un árbol

El subárbol del nodo del árbol binario debe distinguirse del subárbol izquierdo o del subárbol derecho, aunque exista un solo subárbol, debe distinguirse indicando si es el subárbol izquierdo o el subárbol derecho. Esta es la principal diferencia entre un árbol binario y un árbol.
Un árbol binario no es una forma especial de árbol. El árbol binario y el árbol son dos estructuras diferentes.

12. Propiedades del nodo de árbol binario

Para cualquier árbol binario, si contiene n0 nodos hoja y n2 nodos con grado 2, debe haber una relación: n0=n2+1

13. Propiedades completas del árbol binario

La profundidad de un árbol binario completo con n nodos es ⎣log2 n⎦ + 1.
Si los nodos de un árbol binario completo con n nodos se numeran en secuencia, entonces para cualquier nodo i (1<=i <=n), sí :
si i=1, el nodo i no tiene padres y es la raíz del árbol binario;

Si i>1, el número de su padre es i/2 redondeado hacia abajo.

Si 2i>n, no hay hijo izquierdo; de lo contrario, su hijo izquierdo es el nodo 2i.

Si 2i+1>n, el nodo i no tiene hijo derecho; de lo contrario, su hijo derecho es el nodo 2i+1.

14. Lista enlazada binaria

Cada nodo almacena el subárbol izquierdo y el subárbol derecho.
En una lista enlazada binaria con n nodos, el número de campos de enlace no vacíos es n-1. Debe haber 2N dominios de cadena en una lista enlazada binaria con N nodos. Además del nodo raíz, los nodos N-1 restantes tienen un nodo principal. Por lo tanto, hay N-1 dominios de cadena no vacía en total, y los 2N-(N-1)=N+1 restantes son dominios de cadena vacía.

15. Recorrido relacionado con el árbol binario

Para un árbol binario, si las secuencias de orden previo y posterior son exactamente opuestas, la altura del árbol binario es igual al número de nodos, es decir, no hay nodos de doble rama.
Para una expresión, el recorrido de orden pre-in-post corresponde a su representación de prefijo (polaco), representación de infijo (representación normal) y representación de sufijo (representación de polaco inverso)

16. Árbol binario enhebrado

Se puede realizar algún tipo de procesamiento en todos los nodos del árbol binario durante el proceso de recorrido; la recuperación (búsqueda) de un nodo del árbol binario se puede realizar a través del recorrido; si el árbol binario se puede enhebrar, el algoritmo de recorrido se puede simplificado y la velocidad de recorrido se puede mejorar El propósito es Acelerar la búsqueda del predecesor o sucesor de un nodo. Linealizar estructuras no lineales.

17. Enhebrado

Para el enhebrado del árbol binario, se trata esencialmente de recorrer el árbol binario una vez, pero en el proceso de atravesar, verifique si los campos de los punteros izquierdo y derecho del nodo actual están vacíos y, si están vacíos, cámbielos para apuntar a la pista del nodo predecesor o del nodo sucesor.
Un árbol binario con información de nodo predecesor y sucesor (nudo) se denomina árbol binario de subprocesos. Cada nodo en el árbol binario de pistas de n nodos tiene 2 campos de punteros (que apuntan al hijo izquierdo y al hijo derecho), y hay 2n campos de punteros en total; un árbol con n nodos tiene n-1 aristas, entonces el dominio de puntero nulo = 2n - (n-1) = n + 1, es decir, el número de pistas es n+1. La etiqueta del campo de puntero es 0, que almacena el puntero secundario, y 1, que almacena el puntero del nodo predecesor/sucesor.

18. Estructura de almacenamiento de árboles.

Representación principal: almacenamiento de memoria continuo, y se adjunta un indicador a cada nodo para indicar la posición del principal.
Representación secundaria: múltiples listas vinculadas, cada nodo tiene múltiples campos de puntero que apuntan a múltiples subárboles.
Notación hijo-hermano: conversión de árbol a árbol binario. Cada nodo tiene dos campos de puntero que apuntan al primer nodo secundario y al siguiente nodo hermano, respectivamente. La relación entre el árbol y el árbol binario convertido: hijo izquierdo hermano derecho.
El orden previo del árbol binario convertido corresponde al primer recorrido raíz del árbol, y el orden del árbol binario convertido corresponde al recorrido posterior a la raíz del árbol binario.
Convertir bosque en árbol binario
inserte la descripción de la imagen aquí

19. árbol de Huffman

El árbol binario con la menor longitud de ruta ponderada es un árbol de Huffman.
Codificación de prefijo: en un conjunto de caracteres, la codificación de cualquier carácter no es un prefijo de otra codificación de caracteres.
La codificación de Huffman es una codificación de prefijos.
Un árbol de Huffman con n nodos de hoja tiene un total de 2n-1 nodos. Hay n-1 nodos con grado 2. Se puede almacenar en una matriz unidimensional con un tamaño de 2n-1, y el número de nodos en el árbol de Huffman debe ser un número impar.

20 Gráfico completo Gráfico conectado

Gráfico completo: un gráfico no dirigido con n vértices y n(n-1)/2 aristas debe ser un gráfico conexo.
Gráfico completo dirigido: un gráfico dirigido con n vértices y n (n-1) aristas, donde cada dos vértices están conectados por dos aristas opuestas.
Gráfico conectado: Se dice que un gráfico G no dirigido es un gráfico conectado si dos puntos cualesquiera en G están conectados.
Gráfico fuertemente conectado: si dos vértices cualesquiera de un gráfico dirigido G están conectados, entonces se dice que G está fuertemente conectado. Todos los vértices son alcanzables entre sí.

21 Gráfico de recorrido

La búsqueda primero en profundidad usa pilas, y la búsqueda primero en amplitud usa colas.
Para encontrar una ruta simple desde el vértice i al vértice s, use primero la profundidad
Para encontrar una ruta con la longitud más corta entre dos vértices, use primero la anchura
Cuando los pesos en todos los lados son iguales, se puede usar el algoritmo BFS para resolver la fuente única más corta Problema de ruta.

22. Árbol de expansión mínimo

Árbol de expansión mínimo: el árbol con la suma más pequeña de pesos de borde (costos) en el árbol de expansión. El problema del árbol de expansión mínimo consiste en construir un árbol de expansión de costo mínimo para una red conectada.
Algoritmo prim: método de suma de puntos.
Algoritmo de Kruskal: Adición de bordes

23. Algoritmo codicioso

El algoritmo de Prim, el algoritmo de Kruskal y el algoritmo de Dijkstra son todos algoritmos codiciosos.
El algoritmo de Dijkstra resuelve el problema de la ruta más corta de fuente única en un gráfico dirigido ponderado, y el algoritmo requiere que los pesos de todos los bordes no sean negativos. La complejidad del tiempo es O(N*N)

24. Tabla de búsqueda estática

Solo implementa búsqueda, pero no implementa inserción y eliminación
Búsqueda secuencial: compara las palabras clave registradas y los valores dados uno por uno desde un extremo de la tabla. Adecuado para listas secuenciales desordenadas o listas enlazadas lineales

Búsqueda binaria/búsqueda binaria: se utiliza para listas ordenadas secuencialmente. El tiempo medio de búsqueda es de aprox. Se almacena secuencialmente y los nodos se ordenan por clave. Cada búsqueda (baja+alta)/2, redondeada hacia abajo (no hacia arriba)

(Búsqueda de tabla de árbol estático: construya el número de búsqueda de acuerdo con la probabilidad de que se busque el elemento)

Búsqueda de bloques: Divida la tabla en varios bloques, los bloques están desordenados y los bloques están ordenados, es decir, el valor máximo en el bloque anterior es menor que el valor mínimo en el bloque posterior. Y hay una tabla de índice ordenada, cada elemento almacena el valor máximo de cada bloque y un puntero al primer elemento del bloque. La búsqueda binaria se usa para la búsqueda entre bloques, la búsqueda secuencial se usa dentro de un bloque y la eficiencia es entre secuencial y binaria;

Comparación:
Tiempo: la búsqueda secuencial es la peor, la binaria es la mejor y el bloque está en el medio.
Espacio: el bloque es el más grande y es necesario aumentar el espacio para los datos de índice.
Al particionar, es posible que los bloques de datos no se físicamente continuo. Por lo tanto, se puede lograr que la inserción y eliminación de datos involucre únicamente al bloque correspondiente, además, se incrementa el mantenimiento del índice.

25. Factor de equilibrio

La profundidad del subárbol izquierdo del nodo - la profundidad del subárbol derecho El
factor de equilibrio de cada nodo del árbol binario equilibrado es 1, -1, 0.
Buscando en el árbol binario equilibrado, la complejidad temporal es solo O(logn )

26. árbol rojo-negro

Los nodos son rojos o negros.
las raíces son negras, las hojas son negras

27. Tabla hash

Función hash: Una relación de correspondencia establecida entre la clave de un registro y la ubicación de almacenamiento del registro. Es un mapeo del espacio clave al espacio de ubicación de almacenamiento.
Tabla hash: aplique una función hash, determine la información de posición registrada en la tabla por la clave del registro y coloque el registro en la tabla de acuerdo con esta información, la tabla formada de esta manera se llama tabla hash.
La búsqueda hash es adecuada para el caso en que el conjunto de valores posibles de la clave sea mucho mayor que el conjunto de claves real. Más adecuado para la búsqueda, no adecuado para la actualización frecuente
de tablas Hash y otras búsquedas complejas depende de la eficacia del algoritmo de valor Hash. En el mejor de los casos, la complejidad de búsqueda de la tabla hash es O(1). Solo la complejidad de hash_table libre de colisiones es O (1). Generalmente, es O©, y c es la longitud de búsqueda promedio cuando la clave hash entra en conflicto. La inserción, la eliminación y la búsqueda son todas O(1). La longitud de búsqueda promedio no aumenta con el aumento del número de nodos en la tabla, sino que aumenta con el aumento del factor de carga
Debido a la aparición de conflictos, el proceso de búsqueda de la tabla hash sigue siendo un proceso de comparación de un valor dado con una palabra clave.

De acuerdo con el principio de los cajones, los conflictos no se pueden evitar por completo, por lo que se debe considerar una buena función hash y un método de manejo de conflictos.

Funciones hash de uso común
Método de direccionamiento directo: solo adecuado para: el tamaño del conjunto de direcciones == el tamaño del conjunto de palabras clave
Método de análisis digital: analice las palabras clave, tome varios bits de las palabras clave o su combinación como una dirección hash. Solo adecuado para: la frecuencia de aparición de varios números en cada dígito de todas las palabras clave se puede estimar de antemano.

El método de tomar el medio del cuadrado: use los dígitos del medio del valor cuadrado de la palabra clave como la dirección de almacenamiento.

Método de plegado: divida la palabra clave en varias partes con la misma cantidad de dígitos y luego tome la suma de superposición de estas partes (redondeada hacia arriba) como la dirección hash. Desplazar pila/pila de límite. Adecuado para: la palabra clave tiene una gran cantidad de dígitos y la distribución de dígitos en cada dígito es aproximadamente uniforme.

El método de dividir y dejar el resto: tomar el resto obtenido después de dividir la clave por un número p no mayor que la longitud m de la tabla hash como la dirección hash, es decir, H(clave)=clave%p, p <= m.

Método de números aleatorios: tome el valor de la función pseudoaleatoria de la clave como la dirección hash, es decir, H(clave)=aleatorio(clave), que es adecuado para situaciones en las que la longitud de la clave es diferente.
la resolución de conflictos

Método de direccionamiento abierto: cuando ocurre un conflicto, se forma una secuencia de sondeo; a lo largo de esta secuencia, la dirección se sondea una por una hasta que se encuentra una ubicación vacía (dirección abierta), y el registro en conflicto se coloca en la dirección. Eso es Hi=(H(key)+di) % m, i=1,2,...k(k<=m-1), función hash H(key), longitud de la tabla hash m, secuencia de incremento di. Desventajas: Eliminación: solo se puede marcar, pero no eliminar realmente; desbordamiento; el factor de carga es demasiado grande, y el algoritmo para la resolución de conflictos no está bien seleccionado, y se producirán problemas de agregación. Se requiere que el factor de llenado α sea pequeño, por lo que se desperdiciará mucho espacio cuando la escala del nodo sea grande.

Sondeo lineal y refrito: di=1, 2, 3, ..., m-1

Segunda detección y rehashing: di=12,-12,22,-22,…, ±k2 (k<=m/2)

Detección pseudoaleatoria y rehashing: di es una secuencia de números pseudoaleatorios

Método de cadena de direcciones: almacene todos los registros cuyas palabras clave sean sinónimos en una lista enlazada individualmente y use una matriz unidimensional para almacenar el puntero principal. En el método de cremallera, α≥1 es deseable, y cuando los nodos son grandes, el campo de puntero agregado en el método de cremallera puede ignorarse, ahorrando así espacio. Una vez que ocurre un conflicto, simplemente agregue un nodo a la lista enlazada individualmente en la posición actual.

Otros métodos: refrito, establecimiento de un área de desbordamiento común

En la tabla hash construida por el método zip, la operación de eliminación de nodos es fácil de implementar. La desventaja del método zip es que el puntero requiere espacio adicional, por lo que cuando el tamaño del nodo es pequeño, el método de direccionamiento abierto ahorra espacio. Dado que el espacio de nodo en cada lista enlazada en el método de la cremallera se aplica dinámicamente, es más adecuado para la situación en la que no se puede determinar la longitud de la tabla antes de crear la tabla. Al usar el método de cremallera para resolver conflictos, debe usar un puntero para indicar la ubicación de almacenamiento del siguiente elemento

Método de dirección de cadena de tabla hash abierta; método de dirección abierta de tabla hash cerrada. La principal diferencia entre la tabla hash abierta y la tabla hash cerrada es que a medida que aumenta la densidad de la tabla hash, cuando se usa la tabla hash cerrada, no solo serán Elementos con el mismo valor de hash colisiona, y es fácil colisionar con elementos con diferentes valores de hash; mientras que el hash abierto no se ve afectado por la densidad de la tabla hash, y siempre solo chocará con elementos con el mismo valor de hash. Por lo tanto, al buscar en una tabla hash con una mayor densidad, es obvio que la longitud de búsqueda promedio del hash no aumentará.

Suponiendo que n palabras clave tienen el mismo valor de función Hash, usar el método de detección lineal para asignar estas n palabras clave a la tabla Hash requiere n*(n-1)/2 detecciones lineales. Si las n palabras clave se almacenan en la tabla hash usando el segundo método de detección y rehashing, se requieren al menos n*(n+1)/2 detecciones

Eficiencia de búsqueda de hash: factor de llenado = número de registros en la tabla / capacidad de la tabla

28. Búsqueda estática y búsqueda dinámica

La búsqueda estática es la búsqueda en nuestro concepto habitual, que es "búsqueda real". La razón por la cual la búsqueda estática es una búsqueda real es porque en el proceso de búsqueda estática, solo se realiza la operación de "búsqueda", es decir: (1)
Verificar si una palabra clave específica está en la tabla (búsqueda por juicio);
(2) ) Recuperar varios atributos de un elemento de datos clave específico (búsqueda recuperable).
Estas dos operaciones son solo para obtener la información de datos en una tabla existente, sin realizar ningún cambio en los elementos de datos y la estructura de la tabla, que es la llamada búsqueda estática.
La búsqueda estática incluye:
búsqueda secuencial
búsqueda a medias búsqueda de bloques
de Fibonacci Para obtener más información, consulte: http://blog.csdn.net/wangzi11322/article/details/45456871

Búsqueda dinámica La
búsqueda dinámica no es como "buscar", sino más bien como un proceso de "crear, expandir, modificar, eliminar" una tabla. En el proceso de búsqueda dinámica, habrá dos operaciones más en la tabla:
(1) Primero, también hay un proceso de "búsqueda por juicio". Si una palabra clave específica no existe en la tabla, se insertará en la tabla. de acuerdo con ciertas reglas (
2) Si ya existe, puede eliminarlo. Aunque el proceso de búsqueda dinámica es simplemente más operaciones de "inserción" y "eliminación", a menudo no es tan simple realizar estas dos operaciones en tablas específicas.
Las búsquedas dinámicas incluyen:

  1. árbol de ordenación binaria

  2. Referencia detallada del árbol binario equilibrado : http://blog.csdn.net/wangzi11322/article/details/45456971

29. Clasificación interna y clasificación externa

Clasificación interna: todos los datos se pueden clasificar en la memoria al mismo tiempo.

Clasificación externa: hay demasiados datos en el archivo que no se pueden cargar en la memoria para clasificarlos.
inserte la descripción de la imagen aquí

30. Clasificación por inserción directa

El peor de los casos es que los datos están en orden descendente, y la cantidad de comparación y movimiento de datos es la mayor, llegando a O (n ^ 2). Lo mejor es que los datos están en orden ascendente, y la comparación y el movimiento están en menos O(n).
Es análogo al proceso de jugar a las cartas de póquer.

31. Clasificación de inserción binaria

Consiste en seleccionar un elemento e insertarlo en la cola ordenada, utilizar la búsqueda binaria para encontrar una posición adecuada para él.
Dado que los primeros datos i están en orden al insertar el i-ésimo elemento entre r[1] y r[i-1], puede usar una búsqueda binaria para determinar la posición de inserción y luego insertar. El número de comparaciones se reduce pero el número de movimientos no se reduce y la complejidad sigue siendo O(n^2)

32. Tipo de colina

Clasificación incremental estrecha. En aplicaciones prácticas, la selección del tamaño del paso puede simplificarse como la mitad (n/2) de la longitud de la tabla n al principio, reducirse a la mitad cada vez a partir de entonces y finalmente 1. La mejora de la inserción, el último viaje es básicamente ordenado, y el número de comparaciones y movimientos es menor que el de la inserción directa en el último viaje. Utilice la ordenación por inserción directa en cada pasada.
inserte la descripción de la imagen aquí

33. Clasificación de burbujas

La clasificación de burbujas es una clasificación de intercambio.
Tiempo complejo O (n2), generalmente se considera que el burbujeo es relativamente pobre, y se pueden agregar algunas mejoras, como no intercambiar datos en un viaje (la secuencia es incremental), luego el final y otras medidas, por lo que el número de comparaciones está relacionado con el orden de secuencia inicial. Se puede usar cuando los datos están básicamente ordenados o la cantidad de datos es pequeña.

34. Clasificación rápida

El registro se divide en dos partes mediante clasificación de un solo paso, y la clave de una parte es más pequeña que la de la otra parte.
Características: después de completar el i-ésimo pase, aparecerán más de i números en su posición final, es decir, los números a la izquierda son más pequeños que él y los números a la derecha son más grandes que él.
complejidad del tiempo. Mejor caso: cada pivote siempre está en el medio, O (nlog2n), promedio O (nlog2n). En el peor de los casos, los datos ya están incrementados o decrementados, O(n2). Cuanto más cerca esté la selección de la tecla pivote del centro, es decir, cuanto más cerca estén las longitudes de las subsecuencias izquierda y derecha, más rápida será la velocidad de clasificación. Cuanto más desordenado, más rápido.
complejidad espacial. Se requiere espacio de pila para lograr la recursividad, peor caso: S(n)=O(n); caso general: S(n)=O(log2n)
Cuando la secuencia ya está ordenada, la complejidad del tiempo es máxima. Motivo: selección incorrecta del punto de apoyo. Mejora: seleccione aleatoriamente el fulcro o el valor en el medio de los elementos más a la izquierda, más a la derecha y en el medio como el fulcro, que generalmente puede evitar el peor de los casos. Por lo tanto, la ordenación rápida no es adecuada cuando la tabla está básicamente ordenada. Cuando las particiones están más equilibradas después de cada división, el número de recursiones es menor.

35. Clasificación de selección simple

O(n^2). El número total de comparaciones es n(n-1)/2.

36. Ordenar montones

La clasificación de montones está constantemente construyendo montones, intercambiando, construyendo montones e intercambiando.
Para encontrar los K números más grandes/más pequeños entre varios números, lo mejor es utilizar la clasificación por montones.

37. Ordenar por fusión

Combinar: combina dos listas ordenadas en una lista ordenada. Ordenación por fusión: trate n elementos como n listas ordenadas, primero fusione de dos en dos y luego fusione de dos en dos hasta que todos estén fusionados.
Combine una sola matriz, tiempo: O (nlogn), espacio: O (n), el algoritmo de clasificación por fusión ocupa más memoria, pero es un algoritmo de clasificación eficiente y estable. Generalmente se utiliza en la clasificación exterior. Se registra el número de veces que se fusiona.

38. Clasificación de raíz

39. Algunas características de los algoritmos de clasificación

En la clasificación de montones, la clasificación de burbujas y la clasificación rápida, un elemento se colocará en su posición final durante cada proceso de clasificación.
Algoritmo eficiente y estable: fusionar
Método de clasificación inestable: clasificación rápida, clasificación en montón, Hill, selección

Supongo que te gusta

Origin blog.csdn.net/dlz_yhn/article/details/126942774
Recomendado
Clasificación