Equivalências:
O problema de vetores não ortogonais (como definido acima) para um conjunto S de n vetores booleanos, cada um de comprimento d e um número inteiro positivo k é equivalente ao seguinte:
Encontre uma submatriz 2 por k de 1's em um dado n por d Matriz booleana.
Encontrar um K2,k subgráfico completa em um determinado gráfico bipartido, onde o primeiro conjunto de vértices tem o tamanho n e o segundo conjunto de vértices tem o tamanho d .
Algoritmo ingênuo:
A abordagem ingênua para o problema de vetores não-ortogonais é executada em O(d⋅n2) tempo, porque leva O(d⋅n2) tempo para calcular ingenuamente o produto escalar de cada par de vetores.
Responda às perguntas (2) e (3):
Sim, existem vários algoritmos que são mais eficientes em diferentes casos.
Primeira abordagem:
Podemos resolver o problema de vetores não ortogonais no tempo O(d⋅n+k⋅n2) .
Nota: Como o produto escalar de dois vetores booleanos de comprimento d deve ser delimitado por d , o problema só faz sentido quando k≤d .
Prova. Seja dado um conjunto S de n vetores booleanos, cada um de comprimento d e um número inteiro positivo k . Considere-se uma enumeração {si}i∈[n] dos elementos de S .
Criar uma hashmap m de pares (a,b)∈[n]×[n] para N . Inicialmente, m mapeia cada entrada para o valor 0.
Para cada i∈[d] , fazemos o seguinte. Enumere através de pares de vetores sa , sb modo que a<b , o i bit de sa seja 1 e o i bit de sb seja 1. Para cada um desses sa e sb se m(a,b)=k−1 , então sa e sbsão não ortogonais, isto é, sa⋅sb≥k . Caso contrário, incremente m(a,b) e continue.
Se terminarmos a enumeração, nenhum par de vetores será não ortogonal.
Leva O(n⋅d) tempo para percorrer todos os bits de cada vector. Em seguida, leva mais tempo para enumerar pares de vetores. Porque existem no máximo (n2) pares de vetores e cada par pode aparecer no máximok−1vezes antes de se mostrar não ortogonal, enumerar os pares leva no máximoO(k⋅n2). Portanto, o tempo de execução total éO(d⋅n+k⋅n2).
Nota: Quando k=2 , podemos melhorar essa abordagem para o tempo O(n⋅d) . Isso ocorre porque quando k=2 , podemos reduzir a localização de um par de vetores não ortogonais entre n vetores booleanos de comprimento d para encontrar um par de vetores não ortogonais entre d vetores booleanos de comprimento n .
Segunda abordagem:
Podemos resolver o problema de vetores não ortogonais em O(k⋅(dk)⋅n)de tempo.
Prova. Seja dado um conjunto S de n vetores booleanos, cada um de comprimento d e um número inteiro positivo k .
Enumere através dos conjuntos P⊆[d] modo que P tenha o tamanho k . Para cada vector v∈S , verificar se v tem todos os 1 de nas posições em P . Existem dois vetores que têm todos os 1s nas posições em P , então encontramos dois vetores não ortogonais.
No total, existem (dk) possíveis escolhas paraP. E, para cada escolha, nós fazemos a varredura atravésk⋅npedaços dos vetores. Portanto, no total, o tempo de execução éO(k⋅(dk)⋅n).
Terceira abordagem:
Quando d≤n , podemos resolver o problema de vetores não-ortogonais em O(dω−2⋅n2) tempo em que ω é o expoente da multiplicação da matriz inteira. Quando d>n , podemos resolver o problema de vetores não-ortogonais no tempo O(d⋅nω−1) .
Nota: Conforme apontado por @Rasmus Pagh, podemos melhorar esse algoritmo para O(n2+o(1)) tempo em que d≤n0.3 . Veja aqui para mais informações: https://arxiv.org/abs/1204.1111
Prova. Seja dado um conjunto S de n vetores booleanos, cada um de comprimento d e um número inteiro positivo k .
Considere matrizes A e B . A primeira matriz A tem dimensões n por d em que cada linha de A é um vector a partir de S . A segunda matriz B tem dimensões d por n , onde cada coluna de B é um vector a partir de S .
Podemos calcular o produto escalar de cada par de vetores em S calculando A⋅B usando algoritmos para multiplicação rápida da matriz inteira.
Quando d≤n , uma abordagem é converter a multiplicação de matriz retangular em (nd)2multiplicações do quadradodpordmatrizes. Usando a multiplicação rápida da matriz quadrada, podemos calcular todas as multiplicações emO((nd)2⋅dω)=O(dω−2⋅n2)tempo.
Quando d>n , uma abordagem é converter a multiplicação de matriz retangular em dn multiplicações denquadradospornmatrizes. Usando a multiplicação rápida da matriz quadrada, podemos calcular todas as multiplicações emO((dn)⋅nω)=O(d⋅nω−1)hora.