Categorías
Otros

«Introducción a algoritmos» @ [email protected] Capítulo 4-Algoritmo Strassen (incluida la implementación del código de la versión js)

¿Qué hace el algoritmo Strassen

La multiplicación de matrices normalmente requiere complejidad de tiempo n^3
Primer vistazo a una fórmula para la multiplicación de matrices

Por lo tanto, podemos imaginar que la multiplicación de dos matrices se puede desmontar en la adición y multiplicación de cuatro (cuatro colores) pequeñas matrices.

Así que usted puede obtener tal recursivo (pseudocódigo)

Sin embargo, la complejidad del tiempo sigue siendo n^3, y esta fórmula recursiva se puede modificar mediante una determinada regla para que no se produzcan operaciones de multiplicación de matriz.
Por último, la complejidad del tiempo se puede reducir an^lg7 ~=2.8

Ideas de algoritmos

El proceso de prueba de fórmulas se da directamente aquí. . . . Sabes






Proceso de algoritmo

  1. Necesidad de implementar un método para inicializar la matriz
  2. Necesidad de implementar un método de matriz de partición (Note: This is actually a problem. In the introduction to the algorithm, it is mentioned that the matrix subscripts need to be calculated instead of copied. I only realized the copy here.)
  3. Necesidad de implementar la suma y resta de una matriz
  4. Necesidad de implementar un método para combinar las cuatro particiones
  5. Necesidad de implementar un método recursivo

Implementación de algoritmos

// The main premise assumes a matrix of nxn

/**
   * Initialization matrix
   * @param {*} l-n-order matrix
 */
function initMatrix(l) {
    let r = [];
    for (let i = 0; i < l; i++) {
        r.push([])
    }
    return r
}

/**
   * According to the area block (divided into 4 parts)
   * @param {*} A-original matrix
   * @param {*} a-1 or 2
   * @param {*} b-1 or 2
 */
function sliceMatrix(A, a, b) {
    let n = A.length / 2
    let matrix = initMatrix(n)
    let x = 0, y = 0;
    for (let j = (a - 1) * n; j < a * n; j++) {
        for (let i = (b - 1) * n; i < b * n; i++) {
            matrix[x][y] = A[j][i]
            ++y
        }
        ++x
    }
    return matrix
}
// addition and subtraction
function MatrixPM(A, B, type) {
    //Code omitted
    let n = A.length
    let rt = initMatrix(n)
    for (let j = 0; j < n; j++) {
        for (let i = 0; i < n; i++) {
            if (type == '-') {
                rt[j][i] = A[j][i] - B[j][i]
            } else {
                rt[j][i] = A[j][i] + B[j][i]
            }
        }
    }
    return rt
}
// merge matrix
function MergeMatrix(A, B, C, D) {
    let n = A.length;
    let matrix = initMatrix(2 * n)
    for (let j = 0; j < n; j++) {
        for (let i = 0; i < n; i++) {
            matrix[j][i] = A[j][i]
            matrix[j][i + n] = B[j][i]
            matrix[j + n][i] = C[j][i]
            matrix[j + n][i + n] = D[j][i]
        }
    }
    return matrix
}
function Strassen(A, B) {
    if (A.length == 1) {
        return [[A[0] * B[0]]]
    }
    let n = A.length;
    let s1 = MatrixPM(sliceMatrix(B, 1, 2), sliceMatrix(B, 2, 2), '-');
    let s2 = MatrixPM(sliceMatrix(A, 1, 1), sliceMatrix(A, 1, 2), '+');
    let s3 = MatrixPM(sliceMatrix(A, 2, 1), sliceMatrix(A, 2, 2), '+');
    let s4 = MatrixPM(sliceMatrix(B, 2, 1), sliceMatrix(B, 1, 1), '-');
    let s5 = MatrixPM(sliceMatrix(A, 1, 1), sliceMatrix(A, 2, 2), '+');
    let s6 = MatrixPM(sliceMatrix(B, 1, 1), sliceMatrix(B, 2, 2), '+');
    let s7 = MatrixPM(sliceMatrix(A, 1, 2), sliceMatrix(A, 2, 2), '-');
    let s8 = MatrixPM(sliceMatrix(B, 2, 1), sliceMatrix(B, 2, 2), '+');
    let s9 = MatrixPM(sliceMatrix(A, 1, 1), sliceMatrix(A, 2, 1), '-');
    let s10 = MatrixPM(sliceMatrix(B, 1, 1), sliceMatrix(B, 1, 2), '+');
    let p1 = Strassen(sliceMatrix(A, 1, 1), s1)
    let p2 = Strassen(s2, sliceMatrix(B, 2, 2))
    let p3 = Strassen(s3, sliceMatrix(B, 1, 1))
    let p4 = Strassen(sliceMatrix(A, 2, 2), s4)
    let p5 = Strassen(s5, s6)
    let p6 = Strassen(s7, s8)
    let p7 = Strassen(s9, s10)
    let c11 = MatrixPM(MatrixPM(MatrixPM(p5, p4, '+'), p2, '-'), p6, '+')
    let c12 = MatrixPM(p1, p2, '+')
    let c21 = MatrixPM(p3, p4, '+')
    let c22 = MatrixPM(MatrixPM(MatrixPM(p1, p5, '+'), p3, '-'), p7, '-')
    return MergeMatrix(c11, c12, c21, c22)
}
module.exports = Strassen
  Guía de jailbreak del IPhone

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *