Todo algoritmo de tempo linear é um algoritmo de streaming?

14

Sobre a esta pergunta sobre a contagem de inversão , eu encontrei um papel que prova um limite inferior da complexidade espaço para todos (exatas) streaming de algoritmos . Eu afirmei que esse limite se estende a todos os algoritmos de tempo linear. Isso é um pouco ousado, pois, em geral, um algoritmo de tempo linear pode pular à vontade (acesso aleatório) que um algoritmo de streaming não pode; tem que investigar os elementos em ordem. Eu posso executar várias passagens, mas apenas constantemente várias (para tempo de execução linear).

Portanto, minha pergunta:

Todo algoritmo de tempo linear pode ser expresso como um algoritmo de streaming com constantemente muitos passes?

O acesso aleatório parece impedir que uma construção (simples) seja uma resposta positiva, mas também não consegui encontrar um exemplo contrário.

Dependendo do modelo da máquina, o acesso aleatório pode até não ser um problema, em termos de tempo de execução. Eu estaria interessado em respostas para esses modelos:

  • Máquina de Turing, entrada plana
  • RAM, entrada como matriz
  • RAM, entrada como lista vinculada
Rafael
fonte
como você vê nas respostas, "algoritmos de streaming" geralmente implica minúsculo (espaço polilog). mas, dada a sua motivação, a pergunta que acho que deveria ser: todo algoritmo de tempo linear que usa palavras da área de trabalho pode ser convertido em um algoritmo de fluxo que usa O ( s ) espaço para palavras. portanto, um contra-exemplo seria um problema que pode ser resolvido com o ( n ) espaço com acesso aleatório, enquanto qualquer algoritmo de fluxo de passagem constante requer Ω ( n ) espaço. nenhuma resposta deu esse exemplo aindasO(s)o(n)Ω(n)
Sasho Nikolov 16/08/2012
@ShohoNikolov: Na verdade, toda a questão do espaço é tangencial. Minha pergunta é principalmente sobre tempo de execução. Se a resposta fosse "sim", os limites inferiores (na complexidade do espaço) comprovados no artigo se aplicariam a todos os algoritmos de tempo linear. O fato de o limite inferior estar no espaço é incidental, mas não o foco da questão em si.
Raphael
Eu não entendi. É trivial fazer com que um algoritmo de tempo linear seja "transmissão de uma passagem" com espaço ilimitado. Sua pergunta só faz sentido se, na forma "um algoritmo de acesso aleatório de tempo linear puder ser transformado em fluxo constante, enquanto preserva aproximadamente a medida de complexidade ". Portanto, você deve escolher uma medida de complexidade, o que não faz sentido. μ
Sasho Nikolov
@ SashoNikolov: Eu não sabia que o "algoritmo de streaming" apresentava problemas de definição. Dado que eles mostram um espaço linear inferior ligados para streaming de algoritmos, presumi que o espaço não era o núcleo de uma definição. Mas acho que você poderia traduzir isso vinculado a "Não há algoritmo de streaming ...". No entanto, o que dizer dessa definição: "Um algoritmo de streaming é um algoritmo que recebe a entrada (lista) um elemento por vez. Para cada novo elemento, ele pode executar um cálculo em . Após constantemente muitas dessas passagens , ele deve emitir uma resposta após um o ( n ) tempo adicional ". o(n)o(n)
Rafael
@ SashoNikolov: Isso excluiria os algoritmos "copiar a entrada e fazer qualquer coisa" da noção, mas limitá-la a tempo. Isso se encaixa na classe geralmente indicada? Caso contrário, acho que "streaming" não pode ser definido ao longo do tempo ou complexidades espaciais de uma maneira útil. É mais uma estratégia, muito parecida com Greedy ou dividir e conquistar. o(n2)
Raphael

Respostas:

15

Para que os algoritmos de streaming sejam significativos, eles precisam trabalhar com uma quantidade significativamente menor de espaço de trabalho que a própria entrada. Por exemplo, se você permitir a mesma quantidade de espaço de trabalho que a entrada, poderá declarar trivialmente qualquer algoritmo como um "algoritmo de streaming de passagem única" que primeiro copie a entrada para o espaço de trabalho em uma única passagem e depois use apenas o trabalho espaço.

Eu acho que é típico restringir o espaço de trabalho a no máximo polilogarítmico no tamanho da entrada ao falar sobre algoritmos de streaming. Sob esse pressuposto, a seleção mediana não possui um algoritmo de transmissão O-1 pelo resultado de Munro e Paterson [MP80]: qualquer algoritmo de transmissão P- passagem para seleção mediana em N elementos precisa armazenar Ω ( N 1 / P ) elementos. Por outro lado, a seleção mediana possui um conhecido algoritmo determinístico de tempo linear [BFPRT73].

[BFPRT73] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest e Robert E. Tarjan. Limites de tempo para a seleção. Journal of Computer and System Sciences , 7 (4): 448–461, agosto de 1973. DOI: 10.1016 / S0022-0000 (73) 80033-9

J. Ian Munro e Mike S. Paterson. Seleção e classificação com armazenamento limitado. Ciência da Computação Teórica , 12 (3): 315–323, novembro de 1980. DOI: 10.1016 / 0304-3975 (80) 90061-4

Tsuyoshi Ito
fonte
6

No modelo de streaming, você só pode armazenar dados extras constantes ou poliolarítmicos durante a varredura pela entrada. Se você considerar um algoritmo de tempo linear
que segue o paradigma de dividir e conquistar , precisará armazenar mais informações e / ou deverá verificar seus dados tantas vezes quanto a profundidade da recursão.

Um exemplo é o algoritmo DC3 para construir a matriz de sufixos de um texto (fornecido como matriz no modelo de RAM). Para construir uma matriz de sufixos, agrupe os caracteres em trigêmeos, para obter um texto com novos super caracteres . Você pode fazer isso com um deslocamento de 0 , 1 , 2 , o que resulta em três novos textos T 1 , T 2 , T 3 . Curiosamente, você pode calcular a matriz de sufixo, se você tem a matriz sufixo T 1T 2 no tempo linear. Portanto, o algoritmo precisaT0 0,1,2T1,T2,T3T1T2

t(n)=t(2/3n)+O(n)

Tempo. Essa recursão resolve claramente para . Não vejo como isso pode ser transformado em um algoritmo de streaming.t(n)=O(n)

Outro exemplo bem conhecido é o algoritmo clássico de seleção de tempo linear .

A.Schulz
fonte
Aqui está outro exemplo possível. Construir um heap utiliza O (n) e usa internamente a sub-rotina heapify () baseada em dividir e conquistar.
Massimo Cafaro
mas isso não é uma prova, é? você está apenas dizendo que uma simulação ingênua não funcionará. mas existem algoritmos surpreendentes, às vezes
Sasho Nikolov
@ SashoNikolov: O que estou dizendo é que não considero o algoritmo DC3 como algoritmo de streaming, pois requer muita memória de trabalho. Talvez você possa modificar o algoritmo para um algoritmo de streaming, mas o resultado não seria o DC3. Eu não discuti, se existe um algoritmo de streaming para construção de matriz de sufixos. Essa seria uma pergunta completamente diferente. O(n)
A.Schulz
"Eu não vejo como isso pode ser transformado em um algoritmo de streaming de" me fez acreditar que você está dizendo algo além de "este algoritmo não está fluindo sem modificação"
Sasho Nikolov
4

P . Nós definimos:

  • R(P)P pode ter. Eu acho que o modelo exato não importa tanto, mas vamos dizer que temos uma palavra RAM que recebe a entrada como uma matriz somente leitura de acesso aleatório.
  • S(P)P pode ter; aqui assumimos que o algoritmo (que é novamente modelado como uma máquina de RAM com palavras) prossegue em etapas de tempo: a cada etapa em que uma célula da matriz de entrada é fornecida, o algoritmo realiza algum processamento, registra algumas informações em seu armazenamento local e depois prossegue para a próxima etapa. A matriz é "repetida" um número constante de vezes dessa maneira.

R(P)S(P) .

n[1,n-1]O(registron)O(1)ω(registron)

O(1/registro2n)ps=Ω(n)psO(registro2n)

Sasho Nikolov
fonte
1

Mesmo na definição mais simples de "algoritmo de streaming" (um algoritmo que, após cada iteração incremental na fonte, resulta no conhecimento imediato da próxima parte incremental do resultado), posso pensar em alguns algoritmos lineares que não se comportar dessa maneira. Os algoritmos de hash são grandes; O FNV-1a é linear ao número de bytes na fonte, mas não conhecemos nenhuma parte do hash final até que a fonte completa tenha sido processada.

RadixSort, também conhecido como BucketSort, é O (N) (tecnicamente O (NlogM), onde M é o valor máximo nos itens N, que é considerado pequeno), e deve ser executado em sua totalidade para garantir que qualquer item individual esteja em seu lugar final.

Para ser um algoritmo de "streaming", na sua forma mais simples, um algoritmo deve ter as duas propriedades a seguir, nenhuma das quais é expressamente limitada pelo tempo:

  • Melhor que a complexidade do espaço O (N) (declarado de forma equivalente, a fonte inteira não precisa ser conhecida e o resultado inteiro não precisa ser armazenado)
  • Relação de E / S O (N) (o algoritmo produz um número de saídas linearmente proporcionais às suas entradas)

Portanto, a principal classe de algoritmos que transmitem é a de algoritmos que executam "projeções" (transformações incrementais de uma entrada em saídas X> 0).

KeithS
fonte
O(registron)ω(1)
logN também está bem; o ponto era que o algoritmo não deveria precisar de conhecimento de toda a entrada ou saída de uma só vez.
Keiths
Ω(n)