[árbol huffman] Cálculo rápido de la longitud de ruta ponderada fast_wpl

wpl: longitud de ruta ponderada, se refiere a la longitud de ruta ponderada.

        Para encontrar la longitud de ruta ponderada de un árbol de Huffman correspondiente a un conjunto de pesos, la forma más directa es construir primero un árbol de Huffman y luego calcular la suma de las rutas ponderadas de todos los nodos hoja, a saber:

gif.latex?wpl%28T%29%3D%5C%3B%20%5Csum_%7Bk%7D%5CL_%7Bk%7D*w_%7Bk%7D

        Esta solución requiere que primero construyamos un árbol de Huffman, luego marquemos la profundidad correspondiente a cada nodo de hoja y luego atraviesemos todos los nodos de hoja.

        Pero, de hecho, si solo necesitamos resolver wpl, no necesitamos construir un árbol Huffman, y mucho menos resolver la profundidad y atravesar los nodos hoja. Solo es necesario agregar repetidamente los pesos mínimos del nodo original y el nodo recién generado repetidamente .

Proporcione el código primero: ( se ordena la matriz de peso predeterminada )

//默认权重数组w已经有序(从小到大)
//指针p指向当前最小权值的index,初始值给1
//n为数组w的规模
//权重数组w默认1为起始位
int ans=0;
int fastwpl(int w[],int p,int n)   
{
    if(n<=1) return 0;        //没有或只有一个节点,wpl为0;
	if (p>= n) return ans;    //当p指向最末位(根节点),求解结束
	else {
		int new_w = w[p] + w[p+1];  //取出两个最小权值,生成新权值
		ans += new_w;               
		//插入新权值节点//
        //查找插入位置
		int i = p+2;        //由于两个最小权值已取出,所以从p+2开始检索
		while (new_w > w[i] && i<=n ) i++;
		//在i之前插入新权值
		for (int j = p + 1; j < i-1; j++) w[j] = w[j + 1];
		w[i - 1] = new_w;
        //指针后移一位(每次运算,删除两个最小节点,生成一个新节点,故p+1)
		p++;
		fastwpl(w, p, n);
	}
}

Descripción del algoritmo (el árbol de Huffman en la siguiente figura es un ejemplo):                 

5af8b3a04d434f03917ae7e0bcfa58df.png

La solución más sencilla es:

                                        gif.látex?wpl%3D2*3+4*3+5*2+7*1%3D35

La solución en este artículo es:

                ​​​​​​​ ​​​​​​​​ ​​​​​​​​        gif.látex?wpl%3D2+4+5+6+7+11%3D35

Eso es sumar los pesos de todos los nodos no raíz.

        Esta solución parece irrazonable, parece que no considera en absoluto la longitud de la ruta del nodo. De hecho, el cálculo de la "longitud del camino", es decir, la profundidad de la hoja, está implícito en el proceso de suma repetida de los nodos intermedios.

Por ejemplo, la longitud de la ruta de los nodos 2 y 4 es 3, es decir, la longitud de la ruta ponderada es 2*3+4*3, lo que equivale a sumar repetidamente 2 y 4 tres veces.

        En otra forma de pensar, cuando agregamos el nuevo nodo 6 compuesto por 2 + 4, es equivalente a realizar una operación de +2+4 en el par.

Eso es +2+4+6=+2+4+(2+4)=+2*2+4*2.

        De manera similar, en la siguiente capa de operaciones, agregar el nuevo nodo 11 obtenido por 6 + 5 es equivalente a sumar 6 = 2 + 4 nuevamente.

        Por lo tanto, en el proceso de agregar continuamente nuevos nodos, es equivalente a iterar continuamente las longitudes de ruta de los nodos hoja 2 y 4.

En general, podemos concluir que:

       wpl=Generar la suma de todos los pesos de los nodos no raíz del árbol huffman

        Por lo tanto, para calcular la longitud de ruta ponderada mínima de un conjunto de pesos, solo necesitamos agregar iterativamente los nodos hoja y sus nodos de peso recién generados. En el caso de que se ordene la matriz de pesos, la complejidad es O(n);

        En cuanto a la clasificación, podemos usar la clasificación rápida o la clasificación combinada .

 

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_67441224/article/details/127479614
Recomendado
Clasificación