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.
Tabla de contenido
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:
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:
- Enlace de descarga de GitHub: Portal
- Enlace al texto original: Leer el texto original
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!