Galería de mapas mentales Estructura de datos Capítulo 8 Clasificación
Capítulo 8 de "Estructura de datos": notas de clasificación, incluida la clasificación por inserción, la clasificación por intercambio, la clasificación externa, la comparación y aplicación de varios algoritmos de clasificación internos, la clasificación por fusión, la clasificación por base, etc.
Editado a las 2022-11-23 16:08:11,Este es un mapa mental sobre una breve historia del tiempo. "Una breve historia del tiempo" es una obra de divulgación científica con una influencia de gran alcance. No sólo presenta los conceptos básicos de cosmología y relatividad, sino que también analiza los agujeros negros y la expansión. del universo. temas científicos de vanguardia como la inflación y la teoría de cuerdas.
¿Cuáles son los métodos de fijación de precios para los subcontratos de proyectos bajo el modelo de contratación general EPC? EPC (Ingeniería, Adquisiciones, Construcción) significa que el contratista general es responsable de todo el proceso de diseño, adquisición, construcción e instalación del proyecto, y es responsable de los servicios de operación de prueba.
Los puntos de conocimiento que los ingenieros de Java deben dominar en cada etapa se presentan en detalle y el conocimiento es completo, espero que pueda ser útil para todos.
Este es un mapa mental sobre una breve historia del tiempo. "Una breve historia del tiempo" es una obra de divulgación científica con una influencia de gran alcance. No sólo presenta los conceptos básicos de cosmología y relatividad, sino que también analiza los agujeros negros y la expansión. del universo. temas científicos de vanguardia como la inflación y la teoría de cuerdas.
¿Cuáles son los métodos de fijación de precios para los subcontratos de proyectos bajo el modelo de contratación general EPC? EPC (Ingeniería, Adquisiciones, Construcción) significa que el contratista general es responsable de todo el proceso de diseño, adquisición, construcción e instalación del proyecto, y es responsable de los servicios de operación de prueba.
Los puntos de conocimiento que los ingenieros de Java deben dominar en cada etapa se presentan en detalle y el conocimiento es completo, espero que pueda ser útil para todos.
clasificar
concepto basico
estabilidad del algoritmo
Si hay dos elementos Ri y Rj con la misma palabra clave en la lista que se va a ordenar, y si el orden (posición relativa) de los dos elementos no cambia después de la clasificación, entonces el algoritmo de clasificación se denomina estable; de lo contrario, es inestable.
Método de juicio: si existe intercambio de datos a larga distancia
Clasificación
Clasificación interna
Se refiere a una clasificación en la que todos los elementos se almacenan en la memoria durante la clasificación.
clasificación externa
Se refiere a un proceso de clasificación en el que todos los elementos no se pueden almacenar en la memoria al mismo tiempo durante la clasificación, y se mueven constantemente entre la memoria interna y externa durante el proceso de clasificación.
tipo de inserción
Idea básica
Cada vez que un registro a ordenar se inserta en la subsecuencia previamente ordenada según su tamaño de clave, hasta que se inserten todos los registros.
clasificación por inserción directa
Ideas
De L [2] ~ L [n-1], cada vez que el elemento a ordenar L [i] se inserta en la secuencia ordenada previamente, y los elementos más grandes que L [i] se mueven hacia atrás en orden (compare los bordes adelante, mueva el elemento hacia atrás)
código
eficiencia espacial
eficiencia de tiempo
Lo mejor: los elementos de la tabla ya están ordenados
Número de comparaciones: n-1
Número de movimientos: 0
Lo peor: orden inverso
Número de comparaciones:
Número de movimientos:
promedio
característica
Estabilizar
Tablas lineales adecuadas para almacenamiento secuencial y almacenamiento vinculado; cuando se trata de almacenamiento vinculado, la posición del elemento especificado se puede buscar de adelante hacia atrás (de hecho, la mayoría de los algoritmos de clasificación internos solo son adecuados para el almacenamiento secuencial)
clasificación de media inserción
Ideas
Primero doble por la mitad para encontrar la posición donde se insertará el elemento y luego mueva todos los elementos después del elemento que se insertará de manera uniforme.
código
eficiencia de tiempo
Número de comparaciones: (independientemente del estado inicial de la tabla)
Número de movimientos: depende del estado inicial de la tabla ordenada.
característica
Estabilizar
Se aplica solo a tablas de secuencia
Clasificación en colina (clasificación incremental de contracción)
Idea básica
Organice los elementos con un intervalo de d1 (paso/incremento) en un grupo, divida la tabla de clasificación en varias subtablas, realice una clasificación por inserción directa dentro de cada subtabla, luego reduzca el incremento d2 y repita el proceso anterior hasta di =1 hasta
código
Eficiencia espacial:
Eficiencia de tiempo:
característica
inestable
Solo es aplicable cuando la tabla lineal se almacena secuencialmente (porque se utilizan las características de acceso aleatorio del almacenamiento secuencial)
tipo de intercambio
Idea básica
Intercambie las posiciones de los dos registros en la secuencia según los resultados de la comparación de las palabras clave de los dos elementos de la secuencia.
Ordenamiento de burbuja
Ideas
Compara los valores de los elementos adyacentes de atrás hacia adelante (o de adelante hacia atrás) si están en orden inverso, intercámbialos hasta comparar la secuencia. El resultado de cada ronda será intercambiar el elemento más pequeño al primero. posición de la secuencia a ordenar (o al elemento más grande Los elementos se intercambian al final de la columna a ordenar), y este ciclo se puede realizar n-1 veces.
código
eficiencia espacial
eficiencia de tiempo
Mejor (no se produce ningún intercambio en el primer pase de clasificación, salte directamente del bucle)
Número de comparaciones: n-1
Número de movimientos: 0
Peor (en orden inverso)
Número de comparaciones
Número de movimientos
característica
Estabilizar
La subsecuencia generada en la clasificación de burbujas debe estar ordenada globalmente (a diferencia de la inserción directa), y todos los elementos que contiene deben ser mayores o menores que todos los elementos de la subsecuencia desordenada, y cada pasada de clasificación colocará un elemento en su posición final.
Ordenación rápida
Ideas
Según el método de dividir y conquistar, cada vez que se toma un determinado elemento pivote como punto de referencia, la secuencia se divide en dos subtablas, la izquierda y la derecha, y luego se ordena de forma recursiva dentro de las subtablas.
código
Eficiencia espacial (pila recursiva)
eficiencia de tiempo
Peor (ordenado o invertido)
Mejor (simétrico, es decir, la secuencia se divide equitativamente para cada punto de referencia)
Características
inestable
El algoritmo con mejor rendimiento promedio entre los algoritmos de clasificación interna
No se genera ninguna subsecuencia ordenada durante el proceso, pero cada operación de clasificación colocará el elemento pivote (base) en su posición final.
clasificación externa
concepto
Cuando hay demasiados registros en el archivo y todo el archivo no se puede copiar a la memoria para clasificarlo, es necesario transferir una parte de los datos a la memoria para clasificarlo cada vez. El proceso de clasificación implica múltiples intercambios de memoria interna y externa. .
Métodos de clasificación externos
paso
①Para la clasificación por fusión de k vías, se deben asignar k búferes de entrada y 1 búfer de salida en la memoria
② Ordene internamente un total de N registros (usando un algoritmo de clasificación interno) y genere r segmentos de fusión iniciales ordenados internamente (r = 『N/L], L es el número de buffers de entrada en la memoria)
③Fusionando S viajes y k rutas,
1) Leer los bloques de k segmentos fusionados en k buffers de entrada
2) Utilice el algoritmo de "ordenación por combinación" a su vez para seleccionar el registro más pequeño de los k segmentos de combinación y guárdelo temporalmente en el búfer de salida (se requieren comparaciones k-1 cada vez)
3) Cuando el búfer de salida esté lleno, escriba la memoria externa
4) Si el i-ésimo búfer de entrada está vacío, lea el siguiente bloque de disco del i-ésimo segmento de fusión
Costo de tiempo
Es hora de leer y escribir en la memoria externa.
Proporcional al número de pases de fusión S
Tiempo necesario para la clasificación interna
Tiempo de fusión interna
mejoramiento
1) Aumente el número de rutas de fusión k, y solo necesita una fusión equilibrada de múltiples vías
Costo 1: Necesidad de aumentar el buffer de entrada correspondiente
Costo 2: cada vez que seleccionar un elemento mínimo de k segmentos de fusión requiere (k-1) comparaciones de palabras clave (se puede resolver mediante un árbol perdedor)
2) Reducir el número de segmentos de fusión iniciales r
Árbol perdedor y fusión equilibrado multidireccional
Idea básica
Para evitar que la fusión interna se vea afectada por el aumento de k, se introduce un árbol perdedor. Los k nodos de hoja almacenan respectivamente los registros de los k segmentos de fusión que actualmente participan en la comparación durante el proceso de fusión. Memorice las "fallas" en los subárboles izquierdo y derecho ", el nodo raíz apunta al número mínimo;
El número inicial de comparaciones es k-1. Después de eso, solo se necesitan "log2k] tiempos de comparación para seleccionar un valor mínimo.
Número de comparaciones
Después de introducir el árbol perdedor, el número de comparaciones no tiene nada que ver con k; pero a medida que k aumenta, el número de búferes de entrada puede aumentar. Si el espacio total de memoria permanece sin cambios, es necesario reducir la capacidad de cada búfer. reducir el número de intercambios de memoria interna y externa.
Ordenación por selección de reemplazo (generando segmentos de fusión iniciales)
Objetivo
Aumente la longitud de cada segmento de combinación (pero no la longitud fija), reduciendo así la cantidad de segmentos de combinación
paso
Deje que el archivo inicial a ordenar sea FI, el archivo de salida del segmento de fusión inicial sea FO y el área de trabajo de la memoria sea WA (puede acomodar registros w)
1) Ingrese w registros de FI al espacio de trabajo WA.
2) Seleccione el registro con el valor mínimo de palabra clave de WA y regístrelo como registro MINIMAX.
3) Salida de registros MINIMAX a FO.
4) Si FI no está vacío, ingrese el siguiente registro de FI en WA.
5) Seleccione el registro de palabra clave más pequeño de todos los registros en WA con palabras clave mayores que el registro MINIMAX como nuevo registro MINIMAX.
6) Repita 3)~5) hasta que no se pueda seleccionar ningún nuevo registro MINIMAX en WA, obteniendo así un segmento de fusión inicial y enviando una bandera de fin del segmento de fusión a FO.
7) Repita 2)~6) hasta que WA esté vacío. A partir de esto, se obtienen todos los segmentos fusionados iniciales.
mejor árbol de fusión
Idea básica
1) Cada segmento de fusión inicial corresponde a un nodo hoja, y el número de bloques contenidos en el segmento de fusión es el peso de la hoja.
2) Combinar árbol WPL = la suma de las longitudes de ruta ponderadas de todos los nodos de hoja en el árbol
3) El número de E/S de disco durante el proceso de fusión = WPL del árbol fusionado*2
Cómo construir el árbol de combinación óptimo
1) Complementar el párrafo virtual
①El árbol de fusión óptimo para la fusión k-aria debe ser un árbol k-ario estricto, es decir, solo hay nodos con grados k y 0 en el árbol.
②Si (número inicial de segmentos fusionados-1)% (k-1) = 0, significa que se puede formar un árbol k-ario estricto
③ De lo contrario, es necesario agregar varios segmentos virtuales (segmentos fusionados que ocupan 0 bloques) para que la fórmula anterior sea = 0
2) Construir un árbol k-ary Huffman
Cada vez, se seleccionan k árboles con los pesos de nodo raíz más pequeños para fusionarlos, y la suma de los pesos de estos k nodos raíz se utiliza como el peso del nuevo nodo raíz.
Comparación y aplicación de varios algoritmos de clasificación interna.
Comparación de algoritmos de clasificación interna.
Aplicación del algoritmo de clasificación interna.
①Si n es pequeño, se puede utilizar la clasificación por inserción directa o la clasificación por selección simple. Dado que la ordenación por inserción directa requiere más movimientos de registros que la ordenación por selección simple, cuando el registro en sí tiene una gran cantidad de información, la ordenación por selección simple es mejor.
② Si el estado inicial del archivo está básicamente ordenado por palabras clave, es apropiado utilizar la inserción directa o la clasificación por burbujas.
③Si n es grande, se debe utilizar un método de clasificación con una complejidad temporal de O (nlogzn): clasificación rápida, clasificación en montón o clasificación por combinación.
1) La clasificación rápida se considera el mejor método entre los métodos de clasificación interna basados en comparaciones actuales. Cuando las palabras clave que se van a clasificar se distribuyen aleatoriamente, el tiempo promedio de clasificación rápida es el más corto.
2) La clasificación en montón requiere menos espacio auxiliar que la clasificación rápida y no sufre el peor de los casos que pueda tener la clasificación rápida: ambas clasificaciones son inestables.
3) Si se requiere que la clasificación sea estable y la complejidad del tiempo es O (nlog2n), se puede utilizar la clasificación por fusión.
④ En el método de clasificación basado en comparación, después de cada comparación de los tamaños de dos palabras clave, solo ocurren dos transferencias posibles. Por lo tanto, se puede usar un árbol binario para describir el proceso de comparación y determinación: cuando n archivos. Cuando las palabras clave se distribuyen aleatoriamente, cualquier algoritmo de clasificación que se base en la "comparación" requiere al menos O (nlogzn) tiempo.
⑤Si n es muy grande y la cantidad de palabras clave registradas es pequeña y se puede descomponer, es mejor utilizar la clasificación por base.
⑥Cuando el registro en sí tiene una gran cantidad de información, para evitar perder mucho tiempo moviendo el registro, se puede utilizar una lista vinculada como estructura de almacenamiento.
Estructura de almacenamiento aplicable al algoritmo
La estructura de almacenamiento secuencial es adecuada para acceso aleatorio y acceso secuencial, mientras que el almacenamiento en cadena solo es adecuado para acceso secuencial.
Solo los algoritmos de acceso secuencial pueden usar estructuras en cadena (como inserción directa, burbujeo), y otros algoritmos de clasificación interna solo pueden usar almacenamiento secuencial.
Combinar clasificación y clasificación por base
fusionar ordenar
Idea básica
La ordenación por fusión bidireccional trata la lista que se va a ordenar como n sublistas (cada sublista tiene una longitud de 1) y luego las fusiona de forma recursiva hasta que se sintetiza una lista ordenada de longitud n.
código
Análisis de rendimiento
eficiencia espacial
eficiencia de tiempo
Estabilizar
Ordenación por base
Idea básica
Utilice la idea de clasificación de varias palabras clave para tratar con palabras clave lógicas únicas
Bit más significativo primero (MSD)
Divídalo en varias subsecuencias más pequeñas capa por capa de acuerdo con el peso decreciente de la posición clave.
Menos significativo primero (LSD)
Ordenar por peso creciente de las palabras clave
Proceso de clasificación (LSD)
La base r = 10 requiere 10 colas en cadena; cada palabra clave tiene 3 bits y requiere tres operaciones de "asignación" y "recopilación".
Análisis de rendimiento
eficiencia espacial
eficiencia de tiempo
d viajes distribución y recogida
Una asignación requiere O(n)
Una colección requiere O(r)
independiente del estado inicial de la secuencia
Estabilizar
clasificación de selección
Idea básica
Cada paso (i) selecciona el elemento con la palabra clave más pequeña entre los n-i 1 elementos a ordenar, como el i-ésimo elemento de la subsecuencia ordenada, y realiza un bucle n-1 veces.
Orden de selección simple
Ideas
La clasificación i-ésima selecciona el elemento con la palabra clave más pequeña de L [i... n] y lo intercambia con L [i]. Cada pasada puede determinar la posición final de un elemento.
código
eficiencia espacial
eficiencia de tiempo
Número de comparaciones: n(n-1)/2
Número de movimientos
Mejor: 0
Peor: 3(n-1)
característica
inestable
clasificación de montón
Ideas
montón
Montón raíz grande (montón superior grande): el valor del nodo es mayor que el valor de sus hijos izquierdo y derecho
Montón raíz pequeño: el valor del nodo es menor que el valor de sus hijos izquierdo y derecho
Algoritmo de clasificación
① Primero construya n elementos en un montón raíz grande, el elemento superior del montón es el valor máximo, generelo y envíe el elemento inferior del montón a la parte superior del montón.
② Ajuste el elemento superior del montón hacia abajo para mantener la naturaleza de un montón raíz grande, luego genere el elemento superior del montón y repita esto
proceso de clasificación
① Para obtener un árbol binario completo con n nodos, comience a filtrar desde el nodo principal del último nodo ("n/2]) e intercambie los nodos principal e secundario para que se llame un montón raíz grande (el nodo principal puede continuar bajar hasta el final) y luego filtrar los subárboles enraizados en cada nodo ("n/2]~1)
②Después de generar el elemento superior del montón, intercambie el último elemento superior del montón con el elemento superior del montón, y luego intercambie recursivamente el orden del elemento superior del montón con el mayor de los hijos.
código
Algoritmo de creación de montón raíz grande
Algoritmo de clasificación de montón
operación de inserción
Primero coloque el nuevo nodo al final del montón, luego apúntelo hacia arriba para la operación de ajuste.
complejidad del tiempo
Análisis de rendimiento
eficiencia espacial
eficiencia de tiempo
Tiempo de construcción del montón:
Operaciones de ajuste:
característica
inestable
Adecuado para almacenamiento secuencial (debido al acceso aleatorio)