Existe algum problema cujo algoritmo mais conhecido tenha o tempo de execução

18

Eu nunca vi um algoritmo com um log no denominador antes e gostaria de saber se existem algoritmos realmente úteis com este formulário.

Entendo muitas coisas que podem fazer com que um fator de log seja multiplicado no tempo de execução, por exemplo, algoritmos de classificação ou de árvore, mas o que poderia fazer com que você se dividisse por um fator de log?

Mike Izbicki
fonte
24
Mergesort, com . f(n)=nlog2n
Jeffε
12
@ Jɛ ff E snarky Mcsnarkster
Suresh Venkat
5
Classificação Radix - é realmente . O que está acontecendo é que por causa do acesso aleatório, você é tão capaz salvar um fator log ....O(nlogn/logn)
Sariel Har-Peled
Gostaria de saber se o teorema da hierarquia DTIME pode ser usado como argumento para a existência de tais algoritmos, já que é possível fazer algum truque semelhante de economia de espaço no modelo de RAM.
chazisop

Respostas:

41

A resposta usual para "o que poderia fazer você se dividir por um log?" é uma combinação de duas coisas:

  1. um modelo de computação no qual operações aritméticas de tempo constante em números inteiros do tamanho de palavras são permitidas, mas no qual você deseja ser conservador quanto ao comprimento das palavras, então assume bits por palavra (porque é menor que isso e você não conseguia nem endereçar toda a memória, e também porque os algoritmos que usam pesquisas de tabela levariam muito tempo para configurar as tabelas se as palavras fossem mais longas) eO(logn)
  2. um algoritmo que comprime os dados compactando bits em palavras e depois opera com as palavras.

Eu acho que existem muitos exemplos, mas o exemplo clássico é o algoritmo dos quatro russos para as subsequências comuns mais longas, etc. Ele acaba sendo , porque usa a idéia de empacotar bits, mas economiza um segundo fator de log usando outra idéia: substituindo blocos de operações de O ( log 2 n ) bits por uma única consulta de tabela.O(n2/log2n)O(log2n)

David Eppstein
fonte
35

O Cubo de Rubik é um exemplo muito natural (e para mim inesperado). Um cubo n×n×n requer Θ(n2/logn) etapas para resolver. (Observe que essa é uma notação theta, portanto, esse é um limite superior e inferior apertado).

Isso é mostrado neste artigo [1].

Vale ressaltar que a complexidade de resolver instâncias específicas do cubo de Rubik é aberta, mas conjecturada como sendo NP-hard (discutida aqui por exemplo) NP-hard [2]. O algoritmo Θ(n2/logn) garante uma solução e garante que todas as soluções sejam assintoticamente ótimas, mas pode não resolver instâncias específicas de maneira ideal. Sua definição de útil pode ou não se aplicar aqui, pois os cubos de Rubik geralmente não são resolvidos com esse algoritmo ( o algoritmo de Kociemba é geralmente usado para cubos pequenos, pois fornece soluções rápidas e ideais na prática).

[1] Erik D. Demaine, Martin L. Demaine, Sarah Eisenstat, Anna Lubiw e Andrew Winslow. Algoritmos para resolver cubos de Rubik. Anais do 19º Simpósio Anual Europeu de Algoritmos (SEC 2011), 5–9 de setembro de 2011, páginas 689–700

[2] Erik D. Demaine, Sarah Eisenstat e Mikhail Rudoy. A solução ideal para o cubo de Rubik é NP-complete. Anais do 35º Simpósio Internacional sobre Aspectos Teóricos da Ciência da Computação (STACS 2018), 28 de fevereiro a 3 de março de 2018, páginas 24: 1-24: 13.

SamM
fonte
16

Um exemplo de aparecendo no denominador sem truques de empacotamento de bits é um artigo recente de Agarwal, Ben Avraham, Kaplan e Sharir sobre o cálculo da distância discreta de Fréchet entre duas cadeias poligonais no tempo O ( n 2 log log n / log n ) . Embora eu não esteja familiarizado com os detalhes do algoritmo, um truque geral é particionar a entrada em partes relativamente pequenas e depois combinar as respostas de maneira inteligente (é claro que isso soa como dividir e conquistar, mas você não obtém o log n no denominador com alguns truques inteligentes)lognO(n2loglogn/logn)

Suresh Venkat
fonte
5
Este é um exemplo mais complexo da técnica dos "quatro russos" descrita na resposta de David.
Jeffε 03/02
13

Não é exatamente o que você pediu, mas uma situação "em estado selvagem" na qual um fator de log aparece no denominador é o artigo " Seixos e programas de ramificação para avaliação de árvores ", de Stephen Cook, Pierre McKenzie, Dustin Wehr, Mark Braverman e Stephen Cook. Rahul Santhanam.

O problema de avaliação de árvore (TEP) é: dado uma árvore -ary anotada com valores em { 1 , , k } nas folhas e funções { 1 , , k } d{ 1 , , k } nos nós internos , avalie a árvore. Aqui cada nó interno obtém o valor de sua função anotada nos valores de seus filhos. Esse é um problema fácil, e o objetivo é mostrar que ele não pode ser resolvido no espaço logarítmico (quando a altura da árvore faz parte da entrada). Para esse efeito, estamos interessados ​​no tamanho dos programas de ramificação que resolvem o TEP.d{1,,k}{1,,k}d{1,,k}

{0,1}Θ(k2d1)Θ(k2d1/logk)logk

Yuval Filmus
fonte
12

TIME[t]SPACE[t/logt]

Isso fornece muitos exemplos de problemas cujo limite superior mais conhecido da complexidade do espaço possui um log no denominador. (Dependendo do seu ponto de vista, acho que isso torna este exemplo muito interessante - que teorema incrível! - ou muito desinteressante - provavelmente não é "realmente útil".)

[1] Hopcroft, Paul e Valiant. No tempo versus espaço . J. ACM 24 (2): 332-337, 1977.

Joshua Grochow
fonte
8

nO((n/logn)2)

William J. Masek, Mike Paterson: Uma seqüência de computação mais rápida de algoritmos de edição de distâncias. J. Comput. Syst. Sci. 20 (1): 18-31 (1980).

MCH
fonte
4
Novamente, acho que é uma variação do algoritmo dos Quatro Russos.
David Eppstein
7

Θ(n/logn)

Gregory Valiant e Paul Valiant, O poder dos estimadores lineares, 2011. No 52º Simpósio Anual do IEEE sobre os Fundamentos da Ciência da Computação, FOCS 2011.

Jelani Nelson
fonte
7

Aqui está outro exemplo de um limite restrito com um fator de log. (Este é o Teorema 6.17 da Complexidade da Função Booleana: Avanços e Fronteiras por Stasys Jukna.)

Θ(n2/logn)n

mpoly(m)n:=O(mlogm)O(logm)mΘ(m2logm)Θ(n2/logn)nn

Robin Kothari
fonte
2

θ(nlog(n))θ(nlog(n))

dspyz
fonte
3
2n/lognn
-2

O(f(n))O(f(n)logf(n))f(n)=nO(nlogn)

vzn
fonte
2
DTIME(n/logn)
?? ainda há a teoria de algoritmos de tempo sublinear ...
vzn
3
algoritmos sublineares fazem sentido em modelos de acesso aleatório e oracle. O DTIME é definido de forma padronizada wrt multitape TM, e essa é a definição usada no teorema da hierarquia para o DTIME.
Sasho Nikolov
1
DTIME(n/logn)n/lgnn/lgn
5
n/lgnO(n/logn)nnf(n)<nDTIME(f(n))kk