Daniel Sank mencionou em um comentário , respondendo à (minha) opinião de que a aceleração constante de em um problema que admite um algoritmo de tempo polinomial é escassa,108108
A teoria da complexidade é obcecada demais com limites infinitos de escala de tamanho. O que importa na vida real é a rapidez com que você obtém a resposta para o seu problema.
Em Ciência da Computação, é comum ignorar constantes em algoritmos e, no geral, isso acabou funcionando muito bem. (Quer dizer, não são bons e práticos algoritmos. Eu espero que você me conceda (teóricas) algoritmos pesquisadores tiveram uma bastante grande mão nisto!)
Mas entendo que esta é uma situação um pouco diferente, como agora:
Não comparando dois algoritmos em execução no mesmo computador, mas dois algoritmos (ligeiramente) diferentes em dois computadores muito diferentes .
Agora estamos trabalhando com computadores quânticos , para os quais talvez as medições de desempenho tradicionais possam ser insuficientes.
Em particular, os métodos de análise de algoritmos são apenas métodos . Penso que métodos de computação radicalmente novos exigem uma revisão crítica de nossos métodos atuais de avaliação de desempenho!
Ao comparar o desempenho de algoritmos em um computador quântico versus algoritmos em um computador clássico, a prática de 'ignorar' constantes é uma boa prática?
Ignorar constantes nem sempre é uma boa ideia na computação clássica. Como isso é uma questão de computação quântica e não uma questão de como pensar sobre o dimensionamento de recursos de algoritmos? Em outras palavras, ao falar sobre o tempo ou outros recursos necessários para executar uma computação, se a computação é quântica ou clássica parece irrelevante para a questão de saber se você se importa ou não com um fator de velocidade de cem milhões.
@ DanielSank Como mencionei, ignorar constantes na análise de algoritmos funcionou bastante bem para a computação clássica. É também o padrão de fato para pesquisadores de algoritmos . Estou bastante interessado em ouvir sobre todos os pesquisadores de algoritmos que aparentemente discordam. A principal razão pela qual estou fazendo essa pergunta é que 'ignorar constantes' é mais uma regra do que não para quase qualquer pesquisador de algoritmos. Como tenho certeza de que este site terá essas pessoas como colaboradores úteis, pode ser interessante saber se esse pensamento deve ser ajustado ao comparar o quantum com o clássico.
Um bate-papo interessante sobre esta questão está aqui .
O uso comum da Ciência da Computação de 'ignorar constantes' é útil apenas onde as diferenças no desempenho de vários tipos de arquitetura ou software de hardware podem ser ignoradas com um pouco de massagem. Mas mesmo na computação clássica, é importante estar ciente do impacto da arquitetura (comportamento de cache, uso do disco rígido) se você quiser resolver problemas difíceis ou grandes.
A prática de ignorar constantes não é uma prática motivada (no sentido de ser continuamente afirmada) do ponto de vista da implementação. É motivado principalmente pelo interesse em uma abordagem para o estudo de algoritmos que é bem comportada sob composição e admite caracterizações simples, de maneira próxima à matemática pura. Os teoremas da aceleração para as Máquinas de Turing significavam que qualquer definição sensata não poderia tentar definir a complexidade dos problemas com muita precisão, a fim de chegar a uma teoria sensível; e, além disso, na luta para encontrar bons algoritmos para problemas difíceis, os fatores constantes não eram a parte matematicamente interessante ...
Essa abordagem mais abstrata do estudo de algoritmos foi e é amplamente proveitosa. Mas agora somos confrontados com uma situação em que temos dois modelos de computação, em que
Um deles está em avançado estado de maturidade tecnológica (computação clássica); e
Um deles está em um estado muito imaturo, mas está tentando realizar um modelo teórico que possa levar a melhorias assintóticas significativas (computação quântica).
Nesse caso, podemos perguntar se faz sentido considerar o benefício assintótico, com ou sem um cuidadoso registro dos fatores constantes. Por causa do esforço extra que pode ser necessário para executar a computação quântica escalável, não apenas os fatores escalares, mas também as "acelerações" polinomiais no desempenho teórico podem ser eliminadas quando toda a sobrecarga na realização de um algoritmo quântico for levada em consideração.
Nestes primeiros dias, também pode haver diferenças significativas no desempenho de diferentes abordagens da arquitetura quântica. Isso poderia tornar a escolha da arquitetura tão importante (se não mais importante) para o desempenho de um algoritmo do que a análise assintótica - da mesma forma que importaria muito para você fazer o cálculo convencional em uma máquina von Neumann ou em uma rede altamente distribuída com latências significativas.
O que é realmente importante para a computação prática é - e sempre foi - não apenas algoritmos, mas implementações de algoritmos : um algoritmo realizado de uma certa maneira, em uma certa arquitetura. A prática comum da análise assintótica, que ignora fatores constantes, permite prestar atenção às razões sistemáticas e matemáticas das diferenças no desempenho dos algoritmos e é praticamente motivada naquelas ocasiões em que as diferenças arquitetônicas não são tão grandes que dominam o desempenho prático. .
No que diz respeito às tecnologias quânticas, não estamos nessa situação feliz em que podemos encobrir com segurança fatores constantes em qualquer contexto prático. Mas talvez um dia possamos fazer isso. Este é o longo jogo das tecnologias da informação quântica - até agora, quase o único jogo que os cientistas acadêmicos da computação já jogaram, no que diz respeito à tecnologia da informação quântica. Antecipando aquele dia em que a tecnologia quântica se posicionar, será bom continuarmos buscando análises assintóticas, como uma linha de investigação no desempenho de algoritmos quânticos.
Então, em conclusão, você parece ser a favor de 'não jogar fora as constantes', por enquanto , enquanto ainda estamos no estágio em que a implementação é crucial. Interessante. Gosto da sua linha de raciocínio, mas discordo um pouco. Em breve vou expandir isso em uma resposta própria.
@ Discretelizard: Sou a favor de não jogar fora as constantes, em situações em que as constantes fazem uma diferença prática. Obviamente, constantes como 1e8 também importam praticamente na computação clássica; mas podemos ignorar essas constantes para tentar encontrar outros detalhes que também podem ser muito interessantes. Mas também é verdade que 1e8 é mais importante nas comparações entre as tecnologias quânticas e as clássicas como elas são hoje, do que na computação clássica.
— Niel de Beaudrap 19/03/19
O ( f[ N] )O(f[N])NN
≈ 300≈300
Você não pode ignorar os fatores constantes ao comparar a computação quântica com a computação clássica. Eles são muito grandes.
Por exemplo, aqui está uma imagem de alguns slides que apresentei no ano passado:
As coisas no fundo são fábricas de estado mágico. Eles têm uma pegada de 150K qubits físicos. Como o gate AND usa 150K qubits por 0,6 milissegundos, supomos que o volume no espaço-tempo de um gate AND quântico esteja na ordem de 90 qubit segundos.
Um dos objetivos dos meus colegas de trabalho é usar 1 CPU por 100 qubits ao executar a correção de erros. Então, podemos dizer que 90 qubit segundos requerem 0,9 cpu segundos de trabalho. Tornamos as construções quânticas várias vezes mais eficientes desde que a imagem acima foi feita, então vamos chamar de 0,1 cpu segundos.
(Há muitas suposições que entram nessas estimativas. Que tipo de arquitetura, taxas de erro, etc. Estou apenas tentando transmitir uma ideia de ordem de magnitude.)
São necessários 63 portões AND para executar uma adição de 64 bits. 63 * 0,1 cpu segundos ~ = 6 cpu segundos. Quantummente, uma adição de 64 bits custa mais que um segundo de CPU. Classicamente, uma adição de 64 bits custa menos que um nanossegundo de CPU. Há facilmente uma diferença fatorial constante de 10 bilhões aqui. Se você comparar com uma máquina clássica paralela, como uma GPU, os números ficarão ainda piores. Você não pode ignorar fatores constantes com tantos dígitos.
Por exemplo, considere o algoritmo de Grover, que nos permite procurar uma entrada satisfatória para uma função nas avaliações sqrt (N) da função em vez de N avaliações. Adicione o fator constante de 10 bilhões e resolva onde o computador quântico começa a exigir menos avaliações:
NN> 1010N--√> 1020N>1010NN>1020
O algoritmo de Grover não pode paralelizar as avaliações, e as avaliações exigem pelo menos um portão AND, então basicamente você só começa a ver os benefícios do tempo de CPU quando a pesquisa leva dezenas de milhões de anos.
A menos que melhoremos os fatores constantes, ninguém nunca usará a pesquisa do Grover para algo útil. No momento, a situação quântica versus clássica é uma vantagem ou um fracasso exponencial.
Enquanto outras respostas fornecem bons pontos, sinto que ainda discordo um pouco. Então, vou compartilhar meus próprios pensamentos sobre esse ponto.
Em suma, acho que apresentar a constante 'como está' é uma oportunidade desperdiçada na melhor das hipóteses. Talvez seja o melhor que podemos obter por enquanto, mas está longe de ser o ideal.
Mas primeiro, acho que uma breve excursão é necessária.
Quando temos um algoritmo eficaz?
P2P2PP
P2P2PPPPP2P2
Portanto, não é irracional que nosso algoritmo de lixo pareça coincidentemente ter acelerações 'milagrosas'. Agora, é claro, existem muitas técnicas de design de experimentos que podem atenuar o risco, mas talvez algoritmos "rápidos" mais inteligentes que ainda falhem em muitos, mas não há exemplos suficientes que possam nos enganar! (Observe também que estou assumindo que nenhum pesquisador é malicioso , o que torna as coisas ainda piores!)
Então, agora eu respondia: "Me acorde quando houver uma melhor métrica de desempenho".
Como podemos fazer melhor, então?
Se pudermos testar nosso algoritmo de 'caixa preta' em todos os casos, não podemos nos deixar enganar pelo exposto acima. No entanto, isso é impossível para situações práticas. (Isso pode ser feito em modelos teóricos!)
Em vez disso, o que podemos fazer é criar uma hipótese estatística para algum tempo de execução parametrizado (geralmente para o tamanho da entrada) para testar isso, talvez adaptar nossa hipótese e testar novamente, até obtermos uma hipótese que gostamos e rejeitar o nulo parecer razoável. (Observe que provavelmente há outros fatores envolvidos que estou ignorando. Sou praticamente um matemático. O design de experiências não é algo dentro da minha experiência)
Então, o que fazer com as constantes?
Eu acho que é mais útil considerar a constante curiosa como uma anomalia , ou seja, é uma afirmação que, por si só, merece mais investigação. Penso que criar hipóteses baseadas em modelos mais gerais do que simplesmente 'nosso algoritmo leva tempo X' é uma boa ferramenta para fazer isso. Portanto, embora eu ache que não podemos simplesmente assumir as convenções de CS aqui, desconsiderar completamente o 'desdém' por constantes também é uma má idéia.