Diseño de algoritmos de Python: multiplicación de cadenas de matrices

Código fuente del diseño del algoritmo de Python: https://github.com/MakerChen66/Python3Algorithm

Declaración de derechos de autor: la originalidad no es fácil, este artículo prohíbe el plagio, la reimpresión y la infracción debe investigarse.

1. Multiplicación de cadenas de matrices

La multiplicación de matrices es una operación asociativa. Obviamente, para las matrices A, B y C, (AB)C y A(BC) son equivalentes, y podemos elegir el orden de las operaciones según nuestras preferencias, en resumen, los resultados son los mismos.

Pero este no es el caso de las computadoras, si asumimos que la matriz A=[10,20], B=[20,30], C=[30,40], entonces en las siguientes dos secuencias de operaciones, la fase escalar El número de multiplicaciones varía mucho:

(AB)C = 10 * 20*30 + 10 * 30 * 40 = 18000
A(BC) = 20 * 30 * 40 + 10 * 20 * 40 = 32000

Podemos usar la relación de recurrencia Para encontrar la solución óptima que necesitamos, primero, necesitamos usar una función para obtener el número mínimo de multiplicaciones escalares, luego esta función también se puede usar para definir la subsección óptima en todos los casos.

Luego use la programación dinámica y el método de memorándum para obtener el resultado, la complejidad del tiempo es O (n³).

Programación dinámica: es una estrategia de algoritmo que descompone una instancia de problema en subproblemas similares más pequeños, y almacena las soluciones de los subproblemas sin calcular subproblemas repetidos para resolver el problema de optimización.

Método Memento: Es una deformación del método de programación dinámica. A diferencia del algoritmo de programación dinámica, el método recursivo del método del memorando es de arriba hacia abajo, mientras que el algoritmo de programación dinámica es de abajo hacia arriba.

Implementación del algoritmo de Python:

def mult(chain):
    n = len(chain)
    aux = {
    
    (i, i): (0,) + chain[i] for i in range(n)}
    # i: 子链的长度
    for i in range(1, n):
        # j: 子链开始的索引
        for j in range(0, n - i):
            best = float('inf')
            # k: 子链的分割点
            for k in range(j, j + i):
                # 分割点的多个子链
                lcost, lname, lrow, lcol = aux[j, k]
                rcost, rname, rrow, rcol = aux[k + 1, j + i]
                cost = lcost + rcost + lrow * lcol * rcol
                var = '(%s%s)' % (lname, rname)
                # 选择最优解
                if cost < best:
                    best = cost
                    aux[j, j + i] = cost, var, lrow, rcol
    matrixchain =  dict(zip(['cost', 'order', 'rows', 'cols'], aux[0, n - 1]))
    print(matrixchain)

mult([('A', 10, 20), ('B', 20, 30), ('C', 30, 40)])

Resultado de salida:
inserte la descripción de la imagen aquí
Como se puede ver en la figura, la solución óptima obtenida es (AB)C, lo cual es consistente con lo que escribimos al principio

Nota : la función zip () puede crear un iterador que agrega elementos de varios iteradores juntos


2. Descarga del código fuente

Descarga del código fuente del diseño del algoritmo de Python:

3. Información del autor

Autor: Xiaohong's Fishing Daily, Objetivo: ¡Hacer la programación más interesante!

Cuenta pública original de WeChat: " Tecnología Xiaohong Xingkong ", centrada en algoritmos, rastreadores, sitios web, desarrollo de juegos, análisis de datos, procesamiento de lenguaje natural, IA, etc. Esperamos su atención, ¡crezcamos y codifiquemos juntos!

Nota de derechos de autor: ¡Este artículo prohíbe el plagio y la reimpresión, y la infracción debe investigarse!

Supongo que te gusta

Origin blog.csdn.net/qq_44000141/article/details/121801083
Recomendado
Clasificación