1.
Las estructuras de datos son la forma en que las computadoras almacenan y organizan los datos. Una estructura de datos se refiere a una colección de elementos de datos que tienen una o más relaciones específicas entre sí. La estructura incluye estructura lógica y estructura física.
La estructura lógica de los datos incluye cuatro tipos.
(1) Conjunto: No existe otra relación entre elementos de datos excepto que tienen el mismo tipo de datos.
(2) Estructura lineal: existe una correspondencia uno a uno entre los elementos de datos: tablas lineales, pilas y colas.
(3) Estructura de árbol: existe una relación de uno a muchos entre los elementos de datos.
(4) Estructura gráfica: existe una relación de muchos a muchos entre los elementos de datos.
La estructura física incluye una estructura de almacenamiento secuencial y una estructura de almacenamiento en cadena.
En segundo lugar, explique el almacenamiento secuencial y el almacenamiento encadenado.
La estructura de almacenamiento secuencial utiliza espacio de almacenamiento continuo para almacenar elementos de datos, a los que se puede acceder aleatoriamente y tiene una alta eficiencia de acceso. La estructura de almacenamiento en cadena utiliza espacio de almacenamiento arbitrario para almacenar elementos de datos y no permite el acceso aleatorio, por lo que la eficiencia del acceso es baja.
3. ¿Cuál es la diferencia entre puntero principal y nodo principal?
Puntero de cabeza: puntero a la ubicación de almacenamiento del primer nodo, que sirve como identificador. El puntero de encabezado es un elemento necesario de la lista vinculada y existe tanto si la lista vinculada está vacía como si no.
Nodo de encabezado: colocado antes del nodo del primer elemento para facilitar la inserción y eliminación antes del nodo del primer elemento. El nodo principal no es un elemento obligatorio de la lista vinculada y es opcional. Los campos de datos del nodo principal no pueden almacenar ninguna información.
Cuarto, características de la estructura lineal
(1) Debe haber un "primer elemento" único en el conjunto.
(2) Debe haber solo; un elemento en el conjunto "Último elemento";
(3) Excepto el último elemento, todos los demás elementos de datos tienen un "sucesor" único
(4) Excepto el primer elemento, otro Todos los elementos de datos tienen un "predecesor" único.
5. ¿Cuál es la diferencia entre una matriz y una lista enlazada?
Desde una perspectiva de estructura lógica, la longitud de almacenamiento de la matriz es fija, por lo que no puede adaptarse al aumento o disminución dinámica de datos. Las listas vinculadas pueden asignar dinámicamente espacio de almacenamiento para adaptarse al aumento y disminución dinámica de datos, y la inserción y eliminación son fáciles.
Desde la perspectiva del método de acceso, la matriz es un espacio de almacenamiento continuo en la memoria. Se puede acceder a la matriz aleatoriamente a través del subíndice de la matriz y la eficiencia del acceso es alta. Una lista vinculada es una estructura de almacenamiento vinculada. El espacio de almacenamiento no es necesariamente continuo y puede ser arbitrario. El acceso debe realizarse de adelante hacia atrás y la eficiencia del acceso es menor que la de las matrices.
Si se insertan varios elementos desde la posición I-ésima, para una matriz, cada inserción requiere mover los elementos hacia atrás y la complejidad temporal de cada inserción es O(n), mientras que para una lista enlazada individualmente Por ejemplo, solo la complejidad temporal de encontrar la posición de I por primera vez es O (n), y la complejidad temporal de otras operaciones de inserción y eliminación es O (1), lo que mejora la eficiencia de la inserción y eliminación.
6. ¿Cuál es la diferencia entre una estructura de lista enlazada individualmente y una estructura de almacenamiento secuencial?
Durante la inserción y eliminación, la estructura de almacenamiento secuencial necesita mover elementos cada vez, y la complejidad del tiempo total es O (n 2), mientras que la estructura de almacenamiento en cadena solo necesita O (después de determinar el puntero en el Yo posiciono 1). Debido a que la estructura de almacenamiento secuencial requiere una asignación previa de espacio de almacenamiento, es fácil provocar un desperdicio o desbordamiento de espacio. La estructura de almacenamiento encadenada no requiere asignación previa de espacio de almacenamiento y la cantidad de elementos no está limitada.
7. La diferencia entre pila y cola
La cola es una tabla lineal que se puede insertar en un extremo y eliminar en el otro. Los elementos que ingresan a la cola se procesan de acuerdo con la regla "primero en entrar, primero en salir", se eliminan al principio y se insertan al final.
La pila es una lista lineal y solo se puede insertar y eliminar en el pie de página. Adjunto a los datos del elemento transmitidos a la pila, las operaciones de procesamiento, inserción y eliminación de reglas "LIFO" se realizan en la parte superior de la pila.
Primero, debido a que la entrada y salida de la pila se realizan en la parte superior de la pila, debe haber una variable de tamaño.
Registra el tamaño de pila actual.
Al ingresar a la pila, el tamaño no puede exceder la longitud de la matriz.
Tamaño 1, la pila no está vacía al abrir, tamaño-1.
8. Presentación de algoritmos de coincidencia de cadenas:
Algoritmo de coincidencia ingenuo y algoritmo KMP
1. Algoritmo BF (BruteForce)
Cadena objetiva. T (cadena a coincidir)
Cadena de patrón p (cadena corta)
① Compare el primer carácter de T y el primer carácter de s, si es igual, continúe con t- 2VSp-2. Si es igual, ¿continuar con t-3VSp?
②No es igual a t-1VSp-2, t-2VSp-3.
Algoritmo 2.KMP: encuentra rápidamente subcadenas a partir de la cadena principal.
① Haga coincidir los prefijos de las subcadenas superior e inferior
② Encuentre el sufijo antes de * * * (tome la longitud más larga y menor que la longitud de las cadenas superior e inferior en comparación).
(3) Mueva el siguiente prefijo de subcadena P a la posición del sufijo.
El algoritmo de fuerza bruta tiene muchos caracteres en la cadena del patrón y varios caracteres consecutivos en la cadena principal, pero cuando los últimos caracteres no son iguales, la posición de comparación de la cadena principal debe retroceder. En el caso anterior del algoritmo KMP, no es necesario devolver la posición de la cadena principal, lo que puede mejorar en gran medida la eficiencia.
9. ¿Cómo se implementan la búsqueda en profundidad y la búsqueda en amplitud?
Búsqueda en profundidad: (1) Visita el punto de partida v0.
(2) Si el primer vecino de v0 no ha sido visitado, recorra los vecinos en profundidad
(3) Si el primer vecino de v0 ha sido visitado, visite; su segundo punto adyacente para recorrer en profundidad; repita los pasos anteriores hasta que se visiten todos los nodos.
Búsqueda primero en amplitud: (1) Visita el punto de partida v0.
(2) Atraviese todos los puntos adyacentes no visitados de v0 en secuencia.
(3) Visite los puntos adyacentes no visitados en la siguiente capa por turno; repita los pasos anteriores hasta que se hayan visitado todos los vértices.
X. ¿Cómo construir un árbol de Huffman?
Encuentre la suma mínima de w, y luego encuentre la suma mínima de w; pequeña a la izquierda y grande a la derecha una vez completada la construcción, 0 a la izquierda y 1 a la derecha; p>
XI. Árbol de expansión mínimo
El árbol de expansión mínimo es encontrar el borde más pequeño que pueda conectar todos los nodos. La ruta más corta es la ruta más corta desde un nodo a los nodos restantes.
Árbol de sal mínimo:
En un gráfico no dirigido dado G=(V, e), (U, V) representa el borde que conecta el vértice U y el vértice V (es decir), w (u,V) representa el peso de esta arista. Si hay un subconjunto (es decir, un gráfico acíclico) donde T es e, entonces w(T) es el valor mínimo, entonces este T es el árbol de expansión mínimo de g.
w(t)=w(u,u)
El árbol de expansión mínimo es en realidad el mínimo (u, u)et.
La idea básica del algoritmo prim (PRIM) es: establecer el vértice en el borde con el menor peso de otros puntos, agregar un nuevo conjunto de vértices y luego encontrar el borde... hasta Se recorren todos los puntos.
A partir de un vértice u0 en la red conectada N={V, E}, seleccione el borde con el menor peso asociado, agregue su vértice al conjunto de vértices S y luego, de todos los vértices Seleccione el borde con el peso más pequeño, en el que un vértice está en el conjunto S y el otro vértice no está en el conjunto S, y los vértices correspondientes se agregan al conjunto S hasta que todos los vértices se agreguen al conjunto S.
La idea básica del algoritmo de Kruskal es: seleccionar los bordes más pequeños en secuencia, de modo que no haya ciclo y finalice el recorrido de todos los puntos.
Supongamos que existe una red conectada con N vértices, N={V, E]. En la prueba inicial, se construyó un gráfico desconectado T con solo n vértices y sin aristas. Cada vértice en T se considera una rama conexa. Si se selecciona una arista con peso mínimo del conjunto de aristas E, y los dos puntos finales de esta arista no están en la rama conectada, entonces la arista se agrega a T; de lo contrario, se selecciona una nueva arista con peso mínimo hasta que todos los vértices estén en este lado.
12. Algoritmo de ruta más corta
La complejidad temporal del algoritmo de Dijkstra es O(n~2)
La complejidad temporal del vuelo es o (n 3), la complejidad del espacio es o(N2);
Ruta más corta: se utiliza para calcular la ruta más corta desde un nodo a todos los demás nodos. La característica principal es que se expande hacia afuera desde el punto inicial hasta el punto final.
Algoritmo Dij astra
El clásico algoritmo de ruta más corta de fuente única se basa principalmente en su idea de programación dinámica.
Algoritmo de Freud
El método clásico para encontrar el camino más corto entre cualquier vértice es el método codicioso.
13. ¿Introducción a la clasificación topológica y cómo implementarla?
Pasos de la clasificación topológica:
(1) Seleccione aleatoriamente un nodo sin predecesor en el gráfico dirigido a generar.
(2) Elimina el nodo y los bordes conectados a él del gráfico.
(3) Repita los pasos anteriores hasta que se generen todos los vértices o no haya vértices sin predecesores en el gráfico actual. Esto significa que el gráfico es un gráfico cíclico, por lo que puede utilizar la clasificación topológica para determinar si. una gráfica tiene un ciclo.
Catorce. Describa brevemente varios métodos de búsqueda.
La búsqueda se divide en tabla de búsqueda estática y tabla de búsqueda dinámica.
Las tablas de búsqueda estática incluyen: búsqueda secuencial, búsqueda de pliegues y búsqueda de bloques;
La búsqueda dinámica incluye árboles de clasificación binarios y árboles binarios equilibrados.
(1) Búsqueda secuencial: coloque la llave a encontrar en la posición de centinela (i = 0) y luego compare los elementos de la tabla con la llave de atrás hacia adelante. Si el valor de retorno es 0, la búsqueda falló y no existe dicho valor clave en la tabla. Si el valor de retorno es la posición del elemento i (il=0), la búsqueda es exitosa. La posición del centinela está configurada para acelerar la ejecución y su complejidad temporal es O (n).
(2) Búsqueda plegable: Se requiere que la tabla de búsqueda sea una estructura de almacenamiento secuencial y en orden. Si la palabra clave está en la tabla, devuelve la posición de la palabra clave. Si la palabra clave no está en la tabla, una señal típica para detener la búsqueda es: el límite superior del rango de búsqueda
(3) Búsqueda en bloque: primero divida la tabla de búsqueda en varias subtablas, lo que requiere que los elementos de cada subtabla son más pequeños que las siguientes subtablas Los elementos de la tabla, es decir, los bloques garantizados están ordenados (pero no necesariamente en la subtabla), y la clave más grande en cada subtabla forma una tabla de índice , que también contiene la dirección inicial de cada subtabla. Las características son: ordenado entre bloques, desordenado dentro de bloques, búsqueda indexada entre bloques y búsqueda secuencial dentro de bloques.
(4) Árbol de clasificación binario: un árbol de clasificación binario se define como un árbol vacío o un árbol con las siguientes características: si el árbol tiene un subárbol izquierdo, entonces todos los valores de nodo de su subárbol izquierdo son menores que el valor raíz; si el árbol tiene un subárbol derecho, todos los valores de nodo del subárbol derecho son mayores que el valor raíz; sus subárboles izquierdo y derecho también son árboles ordenados binariamente;
(5) Árbol binario equilibrado: un árbol binario equilibrado, también conocido como árbol AVL, es un árbol vacío o tiene las siguientes características: el valor absoluto de la diferencia de altura entre su subárbol izquierdo y su El subárbol derecho no puede ser mayor que 1. Los subárboles izquierdo y derecho también son árboles binarios equilibrados.
Si insertar un nodo en otro árbol binario equilibrado puede causar un desequilibrio, entonces se debe ajustar la estructura del árbol, es decir, rotación equilibrada. Incluyendo 4 situaciones: al insertar un nodo en el subárbol izquierdo del subárbol izquierdo, gire hacia la derecha en una dirección; cuando inserte el nodo en el subárbol derecho del subárbol derecho, gire hacia la izquierda en una dirección; del subárbol izquierdo Al insertar un nodo en el subárbol izquierdo del subárbol derecho, gírelo primero hacia la izquierda y luego hacia la izquierda.
15. Introducción a varios algoritmos de clasificación (1)
La clasificación interna incluye: clasificación por inserción, clasificación por selección, clasificación por intercambio, clasificación por fusión y clasificación por base.
Entre ellos, la clasificación por inserción incluye: clasificación por inserción directa, clasificación por semiinserción y clasificación por colinas;
clasificación por selección incluye: clasificación por selección simple y clasificación por intercambio de montón incluye clasificación por burbujas y; Clasificación rápida.
(1) Clasificación por inserción directa (estable): la idea básica es: dividir la secuencia en una parte ordenada y una parte desordenada, seleccionar elementos de la parte desordenada uno por uno y compararlos con la parte ordenada. y busque En la posición apropiada, mueva el elemento original hacia atrás e inserte el elemento en la posición correspondiente.
La complejidad temporal es O (n ~ 2) y la complejidad espacial es O (1).
(2) Clasificación por semiinserción (estable): la idea básica es: establecer tres variables, baja y media alta, y hacer
Mid=(baja y alta)/2 , si es una tecla [mid]>, deje alto = mid-1; de lo contrario, deje low = mid 1 hasta low > high, deje de hacer el bucle, realice el procesamiento anterior para cada elemento de la secuencia, encuentre una posición adecuada y mueva otros elementos hacia atrás. e insertar. El número de comparaciones es O (nlog2n), pero debido al desplazamiento hacia atrás, la complejidad temporal es O (n ~ 2) y la complejidad espacial es O (1). La ventaja es que el número de comparaciones se reduce considerablemente.
(3) Clasificación Hill (inestable): la idea básica es: primero dividir la secuencia en varias subsecuencias, insertar y ordenar directamente cada subsecuencia, y cuando la secuencia esté básicamente en orden, luego ordenar la secuencia completa Realizar inserción y clasificación directa. La ventaja es que los elementos con valores clave pequeños se pueden mover rápidamente al frente. Cuando la secuencia está básicamente ordenada, la eficiencia del tiempo de la clasificación por inserción directa mejorará enormemente y la complejidad del espacio es O (1).
(4) Ordenación por selección simple (inestable): la idea básica es: dividir la secuencia en dos partes, encontrar un valor mínimo en la parte desordenada cada vez y luego intercambiarlo con el primer elemento de la Ubicación de la pieza desordenada. La ventaja es: implementación simple; la desventaja es: cada viaje solo puede determinar la posición de un elemento y la eficiencia del tiempo es baja. La complejidad temporal es O (n 2) y la complejidad espacial es O (1).
(5) Clasificación del montón (inestable): hay una secuencia arbitraria, k1, k2, "
Cuando Kn satisface las siguientes características, se llama montón: deje que esta secuencia estar organizado como b.
Un árbol binario completo. Este árbol tiene las siguientes características. Cualquier nodo en el árbol
es más grande o más pequeño que el subárbol a su izquierda y derecha. El nodo raíz de este árbol es el valor más grande o
mínimo. La ventaja es que la eficiencia mejora significativamente para archivos grandes, pero la eficiencia no es obvia para archivos pequeños. La complejidad del tiempo es O (nlog2n). y la complejidad del espacio es O (1). p>
16 Introducción a varios algoritmos de clasificación (1)
La clasificación interna incluye: clasificación por inserción, clasificación por selección, clasificación por intercambio, clasificación por fusión y clasificación por base.
Entre ellos, la clasificación por inserción incluye: clasificación por inserción directa, clasificación por semiinserción y clasificación por colina;
la clasificación por selección incluye: clasificación por selección simple y clasificación por intercambio de montón. ordenar y ordenar rápidamente.
(6) Clasificación de burbujas (estable): la idea básica es: comparar elementos cada dos veces e intercambiarlos de acuerdo con la regla de "primero lo pequeño, luego lo grande". : en cada paso, no solo se puede encontrar el elemento más grande y colocarlo al final de la secuencia, sino que también se puede colocar el elemento más grande al final de la secuencia si no hay intercambio en el siguiente. clasificación, la clasificación se puede finalizar temprano. La complejidad del tiempo es O (n ~ 2) y la complejidad del espacio es O (1). Clasificación rápida (inestable): la idea básica es: seleccione cualquier elemento en la secuencia como centro, todos los elementos más grandes que él se mueven hacia atrás y todos los elementos más pequeños que él se mueven hacia adelante, formando dos subsecuencias izquierda y derecha, y luego ajuste las subsecuencias de acuerdo con las operaciones anteriores, hasta que solo haya una elemento en todas las subsecuencias, la ventaja es que no solo se puede determinar un elemento por viaje, sino que la complejidad del tiempo es O (nlog2n) y la complejidad del espacio es O (p>
(8) Orden de combinación (estable). ): La idea básica es fusionar dos o más listas ordenadas en una nueva lista ordenada. La complejidad temporal es O (n logn) y la complejidad espacial es la misma.
(9) Ordenación por base: la complejidad temporal es: La complejidad temporal de la ordenación por base de cadena de n registros es O(d(n rd)), donde cada pasada La complejidad temporal es O(n), y la complejidad temporal de recuperación es O(rd).
La ventaja de la regla "primero lo pequeño, luego lo grande" es que cada viaje no solo puede encontrar el elemento más grande, sino que también puede ordenarlo. Si no hay intercambio en el próximo viaje, la clasificación se puede finalizar antes. La complejidad del tiempo es O (n 2) y la complejidad del espacio es O (1).