Qual modelo computacional é usado para analisar o tempo de execução dos algoritmos de multiplicação de matrizes?

7

Embora eu já tenha aprendido algo sobre os tempos de execução assintóticos dos algoritmos de multiplicação de matrizes (algoritmo de Strassen e coisas semelhantes), nunca encontrei nenhuma referência explícita e satisfatória a um modelo de computação usado para medir essa complexidade. De fato, encontrei três respostas possíveis, nenhuma das quais me parece absolutamente satisfatória:

  • A Wikipedia diz que o modelo usado aqui é a Multitape Turing Machine. Isso não parece fazer muito sentido para mim, pois na análise da multiplicação de matrizes, a multiplicação escalar deve ter uma complexidade de tempo constante. Este não é o caso das máquinas de Turing.
  • Alguns textos descrevem a complexidade apenas vagamente como o número de operações aritméticas usadas. No entanto, o que exatamente são operações aritméticas neste contexto? Suponho que adição, multiplicação e provavelmente subtração. Mas e quanto à divisão, divisão inteira, restante, etc.? E as operações bit a bit - como elas se encaixam nessa configuração?
  • Finalmente, descobri recentemente um artigo, que usa a máquina BSS como modelo de computação. No entanto, isso também me parece um pouco estranho, pois, por exemplo, matrizes inteiras, não faz muito sentido desabilitar operações como, por exemplo, divisão inteira.

Eu ficaria grato a qualquer um que pudesse me ajudar a resolver essas coisas.

042
fonte
Por complexidade, nos preocupamos apenas com uma medida: etapas de uma TM. Na análise de algoritmos, é improvável que você obtenha algo mais preciso do que "número de operações básicas", que correspondem aproximadamente às operações elementares de acesso à ALU / memória nos processadores. Eu acho que você está pedindo análise de algoritmo, não complexidade do problema?
Raphael
@Raphael "Por complexidade, nos preocupamos apenas com uma medida: etapas de uma TM." Desculpe, mas isso é completamente falso. Primeiro, existem muitos modelos de computação que não são máquinas de Turing: circuitos, por exemplo. Então você obtém coisas como complexidade geométrica e descritiva. Mesmo nos reinos das máquinas de Turing, o espaço é uma medida tão importante quanto o tempo. E que tipo de máquina de Turing? Máquinas determinísticas, não determinísticas, alternadas e probabilísticas têm requisitos de recursos diferentes. O acesso aleatório é significativo se você quiser classificações mais refinadas que "tempo polinomial".
precisa saber é o seguinte
@DavidRicherby: Tudo verdade. Nossas declarações são compatíveis; Eu deveria ter deixado meu escopo mais claro. "Para complexidade do tempo, como considerado em aulas clássicas como P, NP etc, nós nos importamos ...".
Raphael
@ Rafael Mas isso não é uma pergunta sobre P, NP, etc. É uma pergunta sobre um problema específico. Os limites superiores para qualquer problema envolvem análise de algoritmos, então não acho que seja realmente possível dividir os dois. Dito isto, sim, parece que a complexidade de Strassen e assim por diante é expressa em termos de "operações aritméticas", e não em qualquer modelo padrão de computação.
precisa saber é o seguinte
Em relação à sua segunda abordagem (contando operações aritméticas): você pode simplesmente contar o número de cada operação (multiplicação, adição, operações bit a bit, etc.) separadamente. Você pode encontrar um exemplo em que isso é feito, por exemplo, em Sedgewick & Flajolet: Introdução à análise de algoritmos (lá eles analisam o Quicksort com muita precisão). Com a multiplicação de matrizes, acredito que o número de multiplicações envolvidas domina o resto, então, basicamente, você está contando isso.
john_leo

Respostas:

7

Os algoritmos de multiplicação de matrizes são analisados ​​em termos de complexidade aritmética . O modelo de computação é programas lineares com instruções do formulárioumabc, Onde {+,-,×,÷}, uma é uma variável e b,cpodem ser variáveis, entradas ou constantes. Além disso, certas variáveis ​​são distinguidas como saídas . Por exemplo, aqui está como multiplicar dois2×2 matrizes usando o algoritmo usual, com matrizes de entrada umaEuj,bEuj e matriz de saída cEuj:

x11uma11×b11y11uma12×b21c11x11+y11x12uma11×b12y12uma12×b22c12x12+y12x21uma21×b11y21uma22×b21c21x21+y21x22uma21×b12y22uma22×b22c22x22+y22
A medida de complexidade é o número de linhas no programa.

Para multiplicação de matrizes, pode-se provar uma forma normal para todos os algoritmos. Todo algoritmo pode ser convertido em um algoritmo da seguinte forma, ao custo de apenas um aumento multiplicativo constante na complexidade:

  1. Certas combinações lineares αEu da matriz de entrada umajk são calculados.
  2. Certas combinações lineares βEu da matriz de entrada bjk são calculados.
  3. γEuαEu×βEu.
  4. Cada entrada na matriz de saída é uma combinação linear de γEus.

Isso é conhecido como forma normal bilinear . No algoritmo de multiplicação de matrizes mostrado acima,xjk,yjk funcionar como o γEu, mas no algoritmo de Strassen as combinações lineares são mais interessantes; eles são oMEuestá na descrição da Wikipedia .

Usando uma abordagem de tensor (ou seja, aplicando recursivamente o mesmo algoritmo), semelhante à análise assintótica do algoritmo de Strassen, pode-se mostrar que, dado esse algoritmo para multiplicar n×n matriz com r produtos (ie r variáveis γEu), então arbitrário N×N matrizes podem ser multiplicadas em complexidade O(Nregistronr); portanto, apenas o número de produtos é importante assintoticamente. No algoritmo de Strassen,n=2 e r=7e, portanto, o limite é O(Nregistro27).

O problema de encontrar o número mínimo de produtos necessários para calcular a multiplicação de matrizes pode ser formulado como a classificação de um tensor de terceira ordem (uma "matriz" com três índices em vez de dois), e isso forma a conexão com a teoria da complexidade algébrica. Você pode encontrar mais informações neste livro ou nestas notas da aula (continuação aqui ).


A razão pela qual esse modelo é usado é dupla: primeiro, é muito simples e passível de análise; segundo, está intimamente relacionado ao modelo de RAM mais comum.

Programas lineares podem ser implementados no modelo de RAM, e a complexidade de ambos os modelos está fortemente relacionada: operações aritméticas têm custo unitário em várias variantes do modelo (por exemplo, o modelo de RAM com números reais) e, de outra forma, são polinomialmente relacionadas para o tamanho dos números. No caso da multiplicação de matrizes modulares, portanto, a complexidade aritmética fornece um limite superior à complexidade no modelo de RAM. No caso de multiplicação de matriz inteira ou racional, pode-se mostrar que, para algoritmos bilineares resultantes de tensorização, o tamanho dos números não cresce muito e, portanto, a complexidade aritmética fornece um limite superior para o modelo de RAM, até fatores logarítmicos .

Pode ser a priori que uma máquina de RAM possa fazer alguns truques aos quais o modelo aritmético não sabe. Mas geralmente queremos que os algoritmos de multiplicação de matrizes funcionem para matrizes em campos arbitrários (ou mesmo anéis) e, nesse caso, o algoritmo uniforme deve usar apenas as operações aritméticas especificadas pelo modelo. Portanto, este modelo é uma formalização de algoritmos "independentes de campo".

Yuval Filmus
fonte
Existe um modelo de máquina de Turing?
T ....
Acontece que você não precisa de um. Geralmente, introduz-se a máquina de Turing para introduzir uniformidade - um pedaço de código que funciona para todosn. Embora o modelo que descrevi não seja uniforme, é possível abordar o expoente idealω uniformemente, forçando brutalmente um bom algoritmo em algum tamanho de matriz muito menor que n.
Yuval Filmus