[Análisis y diseño de algoritmos] Algoritmo codicioso (Parte 1)

Tabla de contenido


1. Puntos de aprendizaje

  Comprender el concepto de algoritmo codicioso.
  Domine los elementos básicos de los algoritmos codiciosos
  (1) Propiedades de subestructura óptimas
  (2) Propiedades de selección codiciosas.
  Comprender las diferencias entre algoritmos codiciosos y algoritmos de programación dinámica.
  Comprender la teoría general de los algoritmos codiciosos
  y aprender estrategias de diseño codiciosos a través de ejemplos de aplicación.
  (1) Problema de programación de actividades ;
  (2) Problema de carga óptima ;
  (3) Codificación Huffman ;
  (4) Ruta más corta de fuente única ;
  (5) Árbol de expansión mínimo ;
  (6) Problema de programación de múltiples máquinas .


2. El problema de encontrar monedas.

  Hay cuatro tipos de monedas: veinticinco centavos, diez centavos, cinco centavos y centavos. Encuentre el método que utiliza la menor cantidad de monedas para encontrar sesenta y tres centavos.
  Naturalmente, pensará en 2 cuartos, 1 centavo y 3 centavos. Utilice siempre la opción con la menor cantidad de monedas en las condiciones actuales. El resultado generalmente es el método óptimo.
  Hay tres tipos de monedas, diez centavos, cinco centavos y un centavo. Encuentra el método que utiliza la menor cantidad de monedas para encontrar una moneda de diez centavos.


2.1 Descripción general

  Como sugiere el nombre, el algoritmo codicioso siempre toma la mejor decisión en este momento . Es decirEl algoritmo codicioso no considera la elección óptima general y, en cierto sentido, la elección que hace es solo una elección óptima local.. Por supuesto, esperamos que el resultado final obtenido por el algoritmo codicioso también sea el óptimo general . Aunque el algoritmo codicioso no puede obtener la solución óptima general para todos los problemas, puede producir la solución óptima general para muchos problemas . Como el problema de la ruta más corta de una sola fuente, el problema del árbol de expansión mínima, etc.En algunos casos, incluso si el algoritmo codicioso no puede obtener la solución óptima general, su resultado final es una buena aproximación de la solución óptima.


3. Problemas con la organización del evento

  El problema de la organización de eventos esSeleccione el subconjunto consistente más grande de actividades del conjunto de actividades dado, es un buen ejemplo que se puede resolver eficazmente utilizando el algoritmo codicioso. El problema requiere orquestar eficientemente una secuencia de actividades que compiten por un recurso común . El algoritmo codicioso proporciona una manera simple y elegante de hacer compatibles tantas actividades como sea posible con el uso de recursos comunes.

  Sea un conjunto de n actividades E={1,2,…,n}, cada una de las cuales requiere el uso del mismo recurso , como un lugar de conferencia, etc., ySólo una actividad puede utilizar este recurso a la vez.. Cada actividad i tiene un tiempo de inicio si que requiere el uso del recurso y un tiempo de finalización fi, y si < fi.Si se selecciona la actividad i, ocupa recursos durante el intervalo de tiempo medio abierto [si, fi). Si el intervalo [si, fi) y el intervalo [sj, fj) no se cruzan, entonces se dice que la actividad i y la actividad j son compatibles. Es decir, cuando sj≥fi, la actividad i es compatible con la actividad j .

  Ejemplo: Supongamos que la hora de inicio y la hora de finalización de 11 actividades que se van a organizar están organizadas en orden no decreciente de hora de finalización de la siguiente manera:
Insertar descripción de la imagen aquí


3.1 Selección de estrategia

  Estrategia 1: Dar prioridad a aquellos con un tiempo de inicio temprano; demostrar que este método no es factible.
  Estrategia 2: Dar prioridad a aquellos que toman menos tiempo; dar contraejemplos para revertir esta estrategia.
  Estrategia 3: Dar prioridad a aquellos con un tiempo de inicio temprano; demostrar que este método no es factible. Hora de finalización anticipada ; ¡usa el algoritmo codicioso para obtener la solución óptima!

  porqueIngrese las actividades en orden no decreciente de su tiempo de finalización., por lo que el algoritmo greedySelector siempre selecciona la actividad compatible con el tiempo de finalización más temprano para unirse al conjunto A cada vez . Intuitivamente, seleccionar actividades compatibles de esta manera deja tanto tiempo como sea posible para actividades no programadas. En otras palabras, la importancia de la selección codiciosa del algoritmo es maximizar el período de tiempo restante para programar tantas actividades compatibles como sea posible .
  El algoritmo greedySelector es extremadamente eficiente. Cuando las actividades de entrada se han organizado en orden no decreciente de tiempo de finalización, el algoritmo solo necesita O (n) tiempo para programar n actividades de modo que la mayoría de las actividades puedan utilizar recursos públicos compatibles entre sí .Si las actividades dadas no están organizadas en orden no decreciente, se pueden reorganizar en tiempo O(nlogn).
Insertar descripción de la imagen aquí
  El proceso de cálculo del algoritmo greedySelector se muestra a la izquierda. Cada fila de la figura corresponde a una iteración del algoritmo. Las actividades representadas por las barras sombreadas son aquellas que se han seleccionado en el conjunto A, mientras que las actividades representadas por las barras en blanco son las actividades cuya compatibilidad se está verificando actualmente.


3.2 Código de programa para problemas de organización de eventos

template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{
    
    
       A[1]=true;
       int j=1;
       for (int i=2;i<=n;i++) {
    
    
          if (s[i]>=f[j]) {
    
     A[i]=true; j=i; }
          else A[i]=false;
          }
}

  La hora de inicio y la hora de finalización de cada actividad se almacenan en las matrices s y f y se organizan en orden no decreciente de la hora de finalización.

  Si la hora de inicio Si de la actividad comprobada i es menor que la hora de finalización fi de la actividad j seleccionada recientemente, entonces la actividad i no se selecciona; de lo contrario, la actividad i se selecciona y se agrega al conjunto A.
  Los algoritmos codiciosos no siempre encuentran la solución óptima general al problema.. Sin embargo, para el problema de disposición de actividades, el algoritmo codicioso siempre puede encontrar la solución óptima general , es decir, finalmente determina el conjunto de actividades compatible más grande A.
  ¡Debe demostrarse si el algoritmo codicioso es correcto y si puede obtener la solución óptima !


3.3 Generalmente utilice la inducción matemática para demostrar.

  Ejemplo: Demuestre que para cualquier número natural n,
  1+2+…+n=n(n+1)/2
  Prueba: Cuando n=1, izquierda=1, derecha=1(1+1)/2=1
  Suponga que para cualquier La ecuación del número natural n se cumple , entonces
  1+2+…+n+(n+1)=n(n+1)/2+(n+1)
  =(n+1)(n/2+ 1)
  =(n+1)2(n/2+1)/2
  =(n+1)(n+2)/2


3.4 Proposiciones de algoritmo de selección de actividades

  El algoritmo se ejecuta hasta el k-ésimo paso y se seleccionan k actividades, i1=1,i2,…ik, entonces existe una solución óptima A que contiene las actividades i1=1,i2,…ik. De acuerdo con la proposición anterior
  ,Para cualquier k, la combinación de los primeros k pasos del algoritmo conducirá a la solución óptima y, como máximo, en el enésimo paso, se obtendrá la solución óptima para la instancia del problema.


3.4.1 Primero verifique si es correcto cuando k = 1

  Demuestre que existe una solución óptima que incluye la actividad 1.
  Tome cualquier solución óptima A y las actividades en A se ordenan en orden ascendente según la fecha límite. Si la primera actividad en A es j≠1, reemplace la actividad j en A con 1 para obtener A', es decir, A '=(A-{j})∪{1},
  ya que f1<=fj, A' también es la solución óptima y contiene 1.


3.4.2 Paso de inducción, k->k+1

  El algoritmo se ejecuta hasta el k-ésimo paso y se seleccionan las actividades i1=1,i2,...ik.
  Según la hipótesis inductiva, existe una solución óptima A que contiene i1=1,i2,...ik. El
  resto las actividades en A se seleccionan del conjunto S'
  S'={ i|i∈Si>=fk}
  A={i1,i2,…ik}∪B


3.4.3 Pasos de inducción (continuación)

  B es la solución óptima de S' (de lo contrario, la solución óptima de S' es B*, y B tiene más actividades que B, entonces B ∪{1,i2,…ik} es la solución óptima de S, y es mejor que A Hay muchas actividades, lo que contradice la optimización de A
  ) Trate S' como un subproblema. Según la base inductiva, existe una solución óptima B' en S', existe la primera actividad ik+1 en S ', y | B' |=| B|, entonces {i1,i2,…ik}∪B'={i1,i2,…ik,ik+1}∪(B'-{ik+1}) también es el óptimo del problema original desatado


4. Elementos básicos del algoritmo codicioso.

  Esta sección se centra en discutirCaracterísticas generales de los problemas que se pueden resolver utilizando algoritmos codiciosos..
  Para un problema específico, ¿cómo saber si el algoritmo codicioso se puede utilizar para resolver el problema y si se puede obtener la solución óptima al problema? Es difícil dar una respuesta positiva a esta pregunta. Sin embargo, de muchos problemas que pueden resolverse mediante algoritmos codiciosos
  se puede ver que dichos problemas generalmente tienen dos propiedades importantes: propiedades de selección codiciosa y propiedades de subestructura óptimas .


4.1 La propiedad de la selección codiciosa

  La llamada propiedad de elección codiciosa se refiere aLa solución óptima general al problema se puede lograr mediante una serie de elecciones óptimas locales, es decir, selección codiciosa.. Este es el primer elemento básico que hace factible el algoritmo codicioso, y también es la principal diferencia entre el algoritmo codicioso y el algoritmo de programación dinámica .
  Los algoritmos de programación dinámica suelen resolver cada subproblema de abajo hacia arriba., mientras que los algoritmos codiciosos generalmente se llevan a cabo de arriba hacia abajo, tomando decisiones codiciosas sucesivas de forma iterativa, y cada vez que se realiza una elección codiciosa, el problema deseado se simplifica en un subproblema más pequeño .
  Para un problema específico, para determinar si tiene propiedades de elección codiciosa , se debe demostrarLas decisiones codiciosas que se toman en cada paso conducen en última instancia a la solución óptima general del problema.


4.2 Propiedades óptimas de la subestructura

  cuandoLa solución óptima de un problema contiene las soluciones óptimas de sus subproblemas.Cuando, se dice que este problema tiene propiedades de subestructura óptimas . La propiedad de subestructura óptima de un problema es una característica clave del problema que se puede resolver mediante programación dinámica o algoritmos codiciosos.


4.3 Diferencias entre algoritmo codicioso y algoritmo de programación dinámica

  Tanto los algoritmos codiciosos como los algoritmos de programación dinámica requieren que el problema tenga propiedades de subestructura óptimas , que es una característica común de los dos tipos de algoritmos. Sin embargo, para problemas con subestructuras óptimas, ¿deberíamos elegir el algoritmo codicioso o el algoritmo de programación dinámica ? ¿Pueden los problemas que pueden resolverse con el algoritmo de programación dinámica también resolverse con el algoritmo codicioso? Estudiemos dos problemas clásicos de optimización combinatoria e ilustrémoslos.La principal diferencia entre algoritmo codicioso y algoritmo de programación dinámica.


4.4 Problema de mochila 0-1 (programación dinámica)

  Dados n artículos y una mochila. El peso del artículo i es Wi, su valor es Vi y la capacidad de la mochila es C. ¿Cómo debemos elegir los artículos para poner en la mochila para maximizar el valor total de los artículos en la mochila?
  Al elegir los artículos para poner en la mochila, solo hay 2 opciones para cada artículo i, es decir, ponerlo en la mochila o no meterla en la mochila.El artículo i no se puede cargar en la mochila varias veces, ni solo una parte del artículo i se puede cargar en la mochila.


4.5 Problema de la mochila (elección codiciosa)

  Similar al problema de la mochila 0-1, la diferencia es que al seleccionar el elemento i para poner en la mochila,Puedes seleccionar parte del elemento i sin necesariamente ponerlo todo en la mochila, 1≤i≤n.
  Estos dos tipos de problemas tienen propiedades de subestructura óptimas y son muy similares. Sin embargo, el problema de la mochila se puede resolver mediante el algoritmo codicioso, pero el problema de la mochila 0-1 no se puede resolver mediante el algoritmo codicioso .


4.6 Pasos básicos para resolver el problema de la mochila usando un algoritmo codicioso

  Primero, calcule el valor Vi/Wi de cada artículo por unidad de peso y luego, de acuerdo con la estrategia de selección codiciosa , coloque tantos artículos con el valor de peso unitario más alto posible en la mochila . Si todos esos artículos se colocan en la mochila, el peso total de los artículos en la mochila no excede C, entoncesElija el artículo con el siguiente valor más alto por unidad de peso y coloque tantos como sea posible en su mochila.. Continúa esta estrategia hasta que la mochila esté llena.

void Knapsack(int n,float M,float v[],float w[],float x[])
{
    
    
       Sort(n,v,w);
       int i;
       for (i=1;i<=n;i++) x[i]=0;
       float c=M;
       for (i=1;i<=n;i++) {
    
    
          if (w[i]>c) break;
          x[i]=1;
          c-=w[i];
          }
       if (i<=n) x[i]=c/w[i];
}

  mochila de algoritmoTiempo de cálculo principalConsiste en clasificar diversos artículos de grandes a pequeños según su valor por unidad de peso . Por lo tanto, el límite superior del tiempo de cálculo del algoritmo es
O(nlogn).
  Para demostrar la exactitud del algoritmo, también es necesario demostrar que el problema de la mochila tiene propiedades de selección codiciosa .

  Para el problema de la mochila 0-1, la razón por la cual la selección codiciosa no puede obtener la solución óptima es porqueEn este caso no garantiza que la mochila eventualmente se lleneEl espacio parcialmente no utilizado en la mochila reduce el valor de cada kilogramo de espacio en la mochila . De hecho, al considerar el problema de la mochila 0-1, se debe comparar la solución final de elegir el artículo y no elegir el artículo, y luego tomar la mejor decisión. Esto lleva a muchossubproblemas superpuestos. Esta es otra característica importante que permite resolver este problema utilizando algoritmos de programación dinámica.
  De hecho, esto también es cierto: el algoritmo de programación dinámica puede resolver eficazmente el problema de la mochila 0-1 .


5. Problema de carga óptima

  Se va a cargar un lote de contenedores en un barco con capacidad de carga c. El peso del contenedor i es Wi. El problema de carga óptima requiere determinar cómo cargar tantos contenedores en un barco como sea posible sin limitar el volumen de carga .


5.1 Descripción del algoritmo

  El problema de carga óptima se puede resolver mediante un algoritmo codicioso. Adoptar la estrategia de selección codiciosa de cargar primero el peso más liviano puede producir la solución óptima al problema de carga óptima .
  Modelado matemático (omitido).

template<class Type>
void Loading(int x[],  Type w[], Type c, int n)
{
    
    
        int *t = new int [n+1];
        Sort(w, t, n);
        for (int i = 1; i <= n; i++) x[i] = 0;
        for (int i = 1; i <= n && w[t[i]] <= c; i++) {
    
    
	x[t[i]] = 1; 
	c -= w[t[i]];
	}
}

  La pregunta esSubproblemas del problema de la mochila 0-1, el contenedor es equivalente al artículo, el peso del artículo es wi y el valor vi es igual a 1. El límite de carga del barco C es equivalente al límite de capacidad de la mochila b
  0-1 Actualmente no existe ningún algoritmo de tiempo polinomial para El problema de la mochila, ¡pero este subproblema especial sí puede!


5.2 Propiedades de selección codiciosa

  Se puede demostrar que el problema de carga óptima tiene propiedades de selección codiciosa .


5.3 Propiedades óptimas de la subestructura

  El problema de carga óptima tiene propiedades de subestructura óptimas.
  Depender dePropiedad de selección codiciosa del problema de carga óptimayPropiedades óptimas de la subestructura, es fácil demostrar la exactitud del algoritmo.
  La principal cantidad de cálculo del algoritmo es ordenar los contenedores según su peso, de pequeños a grandes, por lo que el tiempo de cálculo requerido por el algoritmo es O(nlogn) .


5.4 Ideas para demostrar la exactitud del problema de carga óptima

  Proposición: Para cualquier instancia de entrada de tamaño n al problema de carga, el algoritmo obtiene la solución óptima. Supongamos que los contenedores de ligeros a pesados ​​se registran como 1, 2,... n
  .. Base inductiva: demuestre que para cualquier instancia de entrada que contenga solo una caja, el método codicioso obtiene la solución óptima (obviamente).
  Paso de inducción: suponga que para cualquier instancia de entrada de n cajas, el método codicioso obtiene la solución óptima, luego, para las instancias de entrada de n + 1 cajas, el método codicioso también obtiene la solución óptima.


5.5 Prueba de corrección

  Supongamos que para la entrada de n contenedores, el método codicioso puede obtener la solución óptima. N={1,2,…n,n+1}donde w1<=w2<=…<=wn<=wn+1. Según la hipótesis inductiva, para N'={2,3,…n,n +1 }, C'=C-w1, el método codicioso obtiene la solución óptima I', sea I=I'∪{1}, es necesario demostrar que I es la solución óptima del problema original N={1 ,2,...n,n+1} Excelente solución.
  De lo contrario, existe una solución óptima I* sobre N que contiene 1 (si no hay 1 en I*, la solución obtenida reemplazando el primer elemento en I* con 1 también es la solución óptima), y |I*|> | I|, entonces I*-{1} es la solución de N' y C' y |I* -{1} |>|I -{1} |=|I'|, y I' es aproximadamente N' y la solución óptima de C es contradictoria, por lo que I* no es la solución óptima de N. La solución óptima de N sólo puede ser I.


6. Codificación Huffman

  La codificación Huffman es un método de codificación muy eficaz y ampliamente utilizado para la compresión de archivos de datos. Su tasa de compresión suele estar entre el 20% y el 90%.El algoritmo de codificación de Huffman utiliza la tabla de frecuencia de los caracteres que aparecen en el archivo para crear una representación óptima de cada carácter utilizando una cadena de 0 y 1..
  Dar a los caracteres de alta frecuencia un código más corto y a los caracteres de menor frecuencia un código más largo puede acortar en gran medida la longitud total del código.


6.1 Código de prefijo

  Se especifica una cadena de 0,1 para cada carácter como código, y se requiere que el código de cualquier carácter no sea un prefijo de otros códigos de caracteres. Esta codificación se llama código de prefijo .
  Ejemplos de códigos sin prefijo son a:001, b:00, c:010, d:01.
  Decodifica 1:01,00,001 d,b,a.
  Decodificación 2: 010, 00, 01 c, b, d.

  Representación de árbol binario del código de prefijo:
  Código de prefijo: {00000,00001,0001,001,01,100,101,11}
  Frecuencia: {5%,5%,10%,15%,25%,10%,10%,20%}
  Árbol de construcción:
  0-izquierda Subárbol 1: el número máximo de dígitos correspondientes a una hoja
  en el código del subárbol derecho es la profundidad del árbol.
  
  

  La naturaleza del prefijo de la codificación hace que el método de decodificación sea muy sencillo.
  El árbol binario que representa el código de prefijo óptimo es siempre un árbol binario completo, es decir, cualquier nodo del árbol tiene dos nodos secundarios .
  longitud promedio del códigoSe define como:
Insertar descripción de la imagen aquí
  El esquema de codificación de código de prefijo que minimiza la longitud promedio del código se denomina código de prefijo óptimo para un conjunto de caracteres codificados C determinado.


6.2 Construir código Huffman

  Huffman propuso un algoritmo codicioso para construir códigos de prefijo óptimos, y el esquema de codificación resultante se llama codificación de Huffman .
  El algoritmo de Huffman construye un árbol binario T que representa el código de prefijo óptimo de abajo hacia arriba .
  El algoritmo comienza con nodos hoja |C| y realiza operaciones de "fusión" |C|-1 para generar el árbol T final requerido.

  Ejemplo:
  Entrada: a:45,b:13,c:12,d:16,e:9,f:5,
  construya un árbol de Huffman a partir de esto y encuentre la codificación de cada carácter
  a:1
  b:011
  c: 010
  d:001
  e:0001
  f:0000

  En el algoritmo huffmanTree proporcionado en el libro, la frecuencia de cada carácter c en el conjunto de caracteres codificados es f©. La cola de prioridad Q con f como valor clave se utiliza en la selección codiciosa para determinar efectivamente los dos árboles con la frecuencia mínima que el algoritmo actualmente desea fusionar.Una vez que se fusionan los dos árboles con la frecuencia mínima, se genera un nuevo árbol cuya frecuencia es la suma de las frecuencias de los dos árboles fusionados, y el nuevo árbol se inserta en la cola de prioridad Q. Después de que n-1 se fusiona, solo queda un árbol en la cola de prioridad, que es el árbol requerido T. El algoritmo huffmanTree
  utiliza un montón mínimo para implementar la cola de prioridad Q. La inicialización de la cola de prioridad requiere tiempo de computación O(n). Dado que las operaciones removeMin y put del montón mínimo requieren tiempo O(logn), las fusiones n-1 requieren un tiempo de computación total O(nlogn) . Por tanto, el tiempo de cálculo del algoritmo de Huffman para n caracteres es O (nlogn).


6.3 Corrección del algoritmo de Huffman

  Para demostrar la exactitud del algoritmo de Huffman, solo necesitamos demostrar que el problema del código de prefijo óptimo tiene propiedades de selección codiciosa y propiedades de subestructura óptimas .
  (1) Propiedades de selección codiciosa
  (2) Propiedades óptimas de la subestructura


6.4 Propiedades de los códigos de prefijo óptimos (Lema 1)

  Lema 1: C es un conjunto de caracteres, ∨c∈C, f© es frecuencia, x, y ∈C, f(x), f(y) tienen la frecuencia más pequeña, entonces existe un código de prefijo óptimo tal que x, y palabras en clave, etc. largas y que difieren sólo en el último dígito


6.5 Propiedades de los códigos de prefijo óptimos (Lema 2)

  Lema 2: Sea T un árbol binario de código de prefijo, ∨x,y ∈T, x,y son hojas hermanas, z es el padre de x,y, sea T'=T-{x,y} y sea el frecuencia de z f(z)=f(x)+f(y), T es un árbol binario correspondiente al código de prefijo C'=(C-{x,y})∪{z}, entonces B(T) =B(T') +f(x)+f(y)


6.6 Ideas para demostrar la corrección del algoritmo

  teorema:El algoritmo de Huffman obtiene un árbol binario del código de prefijo óptimo para C para cualquier conjunto de caracteres C de tamaño n (>=2)..
  Prueba básica inductiva: para el conjunto de caracteres de n = 2, el algoritmo de Huffman obtiene el código de prefijo óptimo .
  Prueba de paso de inducción: suponiendo que el algoritmo de Huffman obtiene el código de prefijo óptimo para un conjunto de caracteres de tamaño k, también obtiene un código de prefijo óptimo para un conjunto de caracteres de tamaño k+1 .


6.7 Conceptos básicos de la inducción

  n=2, juego de caracteres C={x1,x2},
  los caracteres de cualquier código requieren al menos 1 dígito binario. Los códigos obtenidos por el algoritmo de Huffman son 1 y 0, que son los códigos de prefijo óptimos .
  Supongamos que el algoritmo de Huffman obtiene el código de prefijo óptimo para un conjunto de caracteres de tamaño k . Considere un conjunto de caracteres de tamaño k+1 C={x1,x2,…xk+1}, donde x1,x2 ∈ C es la frecuencia mínima de dos personajes. Sea C'=(C-{x,y})∪{z}, f(z)=f(x)+f(y) .
  Según la hipótesis inductiva, el algoritmo obtiene un árbol binario T' del código de prefijo óptimo para el conjunto de caracteres C', frecuencia f(z) y f(xi) (i=3,4,...,k+1 ).
  Adjunte x1 y x2 a T' como hijos de z para obtener el árbol T. Entonces T es un árbol binario del código de prefijo óptimo para C=(C'-{z})∪{x1,x2}.
  Si no, existe un árbol mejor T*, B(T*)<B(T), y según el Lema 1, sus hojas hermanas son x1, x2.
  Elimine x1 y x2 en T* y obtenga T*'. Según el Lema 2, B(T*') = B(T*)-(f(x1)+f(x2))<B(T)-( f (x1)+f(x2))=B(T').
  Es inconsistente con que T' sea un árbol binario de código de prefijo óptimo sobre C'.


6.8 Aplicación: Fusión de archivos

  Pregunta: Dado un conjunto S={f1, f2,...fn} de archivos ordenados de diferentes longitudes, donde fi representa el número de elementos contenidos en el i-ésimo archivo. Utilice la combinación binaria para combinar estos archivos en un solo archivo ordenado .
  El proceso de fusión corresponde a un árbol binario: los archivos son hojas .Los archivos fusionados por fi y fj son sus nodos principales.


6.9 Fusión secuencial por pares

  Ejemplo: S={21,10,32,41,18,70}
  Costo de fusión: carga de trabajo en el peor de los casos
  (1) Todos los cálculos = 483.
  (2) (21+10+32+41)*3+(18+70)*2-5=483.
  (3) Fusión de Huffman = 456.

Supongo que te gusta

Origin blog.csdn.net/m0_65748531/article/details/133420143
Recomendado
Clasificación