Que diferenças e relações existem entre algoritmos aleatórios e algoritmos não determinísticos?
Da Wikipedia
Um algoritmo aleatório é um algoritmo que emprega um grau de aleatoriedade como parte de sua lógica. O algoritmo normalmente usa bits aleatoriamente uniformes como uma entrada auxiliar para orientar seu comportamento, na esperança de obter um bom desempenho no "caso médio" em todas as opções possíveis de bits aleatórios. Formalmente, o desempenho do algoritmo será uma variável aleatória determinada pelos bits aleatórios; portanto, o tempo de execução ou a saída (ou ambas) são variáveis aleatórias.
Um algoritmo não determinístico é um algoritmo que pode exibir comportamentos diferentes em execuções diferentes, em oposição a um algoritmo determinístico. Existem várias maneiras pelas quais um algoritmo pode se comportar de maneira diferente de execução para execução. Um algoritmo simultâneo pode ter um desempenho diferente em execuções diferentes devido a uma condição de corrida. O comportamento de um algoritmo probabilístico depende de um gerador de números aleatórios. Um algoritmo que resolve um problema em tempo polinomial não determinístico pode ser executado em tempo polinomial ou em tempo exponencial, dependendo das escolhas que ele faz durante a execução.
Algoritmos aleatórios e algoritmos probabilísticos são o mesmo conceito?
Se sim, algoritmos aleatórios são apenas uma espécie de algoritmos não determinísticos?
Respostas:
Algoritmos não determinísticos são muito diferentes dos algoritmos probabilísticos.
Algoritmos probabilísticos são aqueles que usam sorteios e funcionam "na maioria das vezes". Como exemplo, variantes aleatórias do quicksort funcionam com o tempo na expectativa (e com alta probabilidade), mas se você tiver azar, pode levar tanto quanto Θ ( n 2 ) . Os algoritmos probabilísticos são práticos e são usados, por exemplo, pelo seu computador ao gerar chaves RSA (para testar se os dois fatores de sua chave secreta são primos). Algoritmo probabilístico que não usa nenhum sorteio às vezes é chamado de "determinístico".Θ ( n logn ) Θ ( n2)
Algoritmos não determinísticos são aqueles que "precisam de uma dica", mas estão sempre corretos: não podem ser enganados ao receberem a dica errada. Como exemplo, aqui está um algoritmo não determinístico que fatora um inteiro : adivinhe uma fatoração de e verifique se todos os fatores são primos (existe um algoritmo determinístico "rápido na teoria" para fazer isso). Esse algoritmo é muito rápido e rejeita dicas falsas. A maioria das pessoas pensa que algoritmos aleatórios não podem fatorar números inteiros tão rapidamente. Claramente, esse modelo de computação não é realista.nn n
Por que nos preocupamos com algoritmos não determinísticos? Existe uma classe de problemas, conhecida como NP, que consiste em problemas de decisão que possuem algoritmos não determinísticos eficientes. A maioria das pessoas pensa que os problemas mais difíceis dessa classe, os chamados problemas completos de NP, não possuem algoritmos determinísticos (ou mesmo aleatórios) eficientes; isso é conhecido como questão P vs NP. Como muitos problemas naturais são NP-completos, é interessante saber se, de fato, eles não são solucionáveis com eficiência, no pior dos casos (na prática, muitas vezes os casos que surgem na prática são solucionáveis em tempo razoável).
fonte
Um algoritmo especifica um método para passar de uma determinada entrada para uma saída desejada que tenha uma certa relação com a entrada. Dizemos que esse algoritmo é determinístico se, a qualquer momento, for especificado de maneira exata e inequívoca qual o próximo passo no algoritmo que deve ser executado como parte desse método, potencialmente dependente da entrada ou dos dados parciais computados até agora, mas sempre identificado exclusivamente.
Não determinismo significa que parte do algoritmo é deixada abaixo ou mesmo não especificada. Por exemplo, "int i = um número par entre 0 e n" é subespecificado. Isso significa que não há comportamento exclusivo especificado neste momento.
Para que essa distinção seja útil, você precisa do conceito (usual) de 'correção' para algoritmos (determinísticos), que informalmente é o de que "o algoritmo sempre calcula o que eu quero calcular". Torna-se interessante pensar sobre o que correção significaria para algoritmos não determinísticos, que devem levar em conta as opções possíveis em instruções subespecificadas.
Existem duas maneiras de definir a correção para o não-determinismo. O primeiro é bastante simples e menos interessante, para o qual correção significa "o algoritmo sempre calcula o que eu quero calcular, para todas as seqüências de escolhas que tenho permissão para fazer". Às vezes, isso ocorre se um autor de um pouco de pseudocódigo é muito preguiçoso para escolher um número e diz "escolha qualquer número par entre 0 e n", quando "escolher 0" tornaria o algoritmo determinístico. Essencialmente, substituindo todo não-determinismo pelo resultado de alguma escolha, você pode tornar o algoritmo determinístico.
Este também é o 'não determinismo' referido no seu segundo parágrafo. Esse também é o não determinismo nos algoritmos paralelos: nesses algoritmos, você não tem certeza de como é a execução, mas sabe que sempre funcionará, não importa o que aconteça exatamente (caso contrário, seu algoritmo paralelo estaria incorreto).
A definição interessante de correção para o algoritmo não determinístico é "o algoritmo sempre calcula o que eu quero calcular, para alguma sequência de escolhas que tenho permissão para fazer". Isso significa que pode haver escolhas erradas, no sentido de que elas fazem o algoritmo produzir a resposta errada ou até mesmo ir em um loop infinito. No exemplo "escolha qualquer número par entre 0 e n", talvez 4 e 16 sejam as escolhas corretas, mas todos os outros números estão errados, e esses números podem variar dependendo da entrada, dos resultados parciais e das escolhas feitas até o momento.
Quando usado em ciência da computação, o não-determinismo geralmente se limita à escolha não-determinística de 0 ou 1. No entanto, se você escolher muitos desses bits não-deterministicamente, poderá gerar números não-determinísticos longos ou outros objetos, além de fazer escolhas não-determinísticas. (se alguma vez) limita sua aplicabilidade - se a aplicabilidade é limitada, o não determinismo era muito poderoso em primeiro lugar.
O não determinismo é uma ferramenta que é exatamente tão poderosa quanto um algoritmo determinístico baseado em certificado, ou seja, um algoritmo que verifica uma propriedade dada uma instância e um certificado para essa propriedade. Você pode simplesmente adivinhar não-deterministicamente o certificado para uma direção e pode fornecer um certificado que contenha todas as respostas 'certas' para as suposições não-determinísticas de 0 e 1 do seu programa para a outra direção.
Se jogarmos o tempo de execução na mistura, as coisas se tornarão ainda mais interessantes. O tempo de execução de um algoritmo não determinístico é geralmente considerado o mínimo sobre todas as opções (corretas). No entanto, outras opções podem levar a um tempo de execução dramaticamente pior (que pode ser assintoticamente pior ou até arbitrariamente pior que o mínimo), ou mesmo um loop infinito. É por isso que tomamos o mínimo: não nos importamos com esses casos estranhos.
Agora chegamos a algoritmos aleatórios. Algoritmos aleatórios são como algoritmos não determinísticos, mas em vez de 'permitir' a escolha entre 0 e 1 em determinados pontos, essa escolha é determinada por um sorteio aleatório de moedas no momento em que a escolha deve ser feita (que pode diferir de uma corrida para outra) ou quando a mesma escolha tiver que ser feita novamente mais tarde, durante a execução do algoritmo). Isso significa que o resultado é 0 ou 1 com igual probabilidade. A correção agora se torna "o algoritmo quase sempre calcula o que eu quero calcular" ou "o algoritmo sempre calcula o que eu quero calcular" (apenas a versão determinística). No segundo caso, o tempo que o algoritmo precisa para calcular sua resposta é geralmente 'quase sempre rápido', contrastando com um determinístico 'sempre rápido'.
fonte
Em resumo: não-determinismo significa ter várias opções igualmente válidas de como continuar um cálculo. Randomização significa usar uma fonte externa de bits (aleatórios) para orientar a computação.
Para entender o não determinismo, sugiro que você analise os autômatos finitos (FA). Para uma FA determinística (DFA), a função de transição é, bem, uma função. Dado o estado atual e o próximo símbolo de entrada, o próximo estado é definido exclusivamente.
[ fonte ]
O ponto principal aqui é que a aceitação é definida como "aceitar se houver uma execução de aceitação" para o NFA. Este critério de existência pode ser interpretado como "sempre adivinhando o que é certo", mesmo que não haja adivinhação real.
Observe que não há probabilidades aqui, em qualquer lugar. Se você traduzisse o não determinismo em linguagens de programação, teria instruções que podem causar saltos para outras declarações diferentes, no mesmo estado . Tal coisa não existe, exceto, talvez, em linguagens de programação esotéricas projetadas para despertar sua mente.
A randomização é bem diferente. Se a dividirmos, o autômato / programa não tem várias opções para continuar a execução. Depois que os bits aleatórios são desenhados, a próxima instrução é definida exclusivamente:
Em termos de autômatos finitos, considere o seguinte:
[ fonte ]
Uma nota final: podemos ver que o não determinismo é um conceito puramente teórico, não pode ser implementado! Então, por que usamos?
Geralmente permite representações menores. Você deve saber que existem NFA para os quais o menor DFA é exponencialmente tão grande¹. Usar os menores é apenas uma questão de simplificar o design dos autômatos e as provas técnicas.
A tradução entre modelos geralmente é mais direta se o não-determinismo for permitido no modelo de destino. Considere, por exemplo, converter expressões regulares em DFA: a maneira usual (e simples) é convertê-la em uma NFA e determinar essa. Não conheço uma construção direta.
Isso pode ser uma preocupação acadêmica, mas é interessante que o não determinismo possa aumentar o poder de um dispositivo. Este não é o caso de autômatos finitos e máquinas de Turing, discutíveis os dispositivos de modelos de máquinas mais populares, mas, por exemplo, autômatos de empilhamento determinísticos, autômatos Büchi e autômatos de árvores de cima para baixo podem aceitar estritamente menos idiomas do que seus irmãos não determinísticos².
fonte
Você deve estar ciente de que há duas definições diferentes de não-determinismo sendo lançadas por aqui.
Como a wikipedia o define, praticamente "não determinismo", ou seja, qualquer algoritmo que nem sempre tem o mesmo comportamento nas mesmas entradas. Algoritmos aleatórios são um caso especial de algoritmos "não determinísticos", porque eles se encaixam na definição como eu a forneci.
Modelos de cálculo não determinísticos (como máquinas de turbulência não determinísticas) são modelos teóricos de cálculo. Eles podem ter vários caminhos possíveis de execução e "aceitam" se algum desses caminhos aceitar. Você deve observar que eles não são reais. Não há como executar fisicamente um algoritmo que não é determinístico nesse sentido, embora você possa simulá-lo com um algoritmo aleatório ou determinístico.
No CS, não-determinismo geralmente significa (2); portanto, a definição da Wikipedia que você forneceu (que é (1)) é enganosa. A maioria das respostas dadas até agora explica (2), não (1).
fonte
Revisitando isso devido a algumas pesquisas relacionadas que estou fazendo, a discordância entre mim e alguns dos outros que responderam pode ser assimilada em um entendimento holístico em que todos estávamos corretos. Mas, na IMO, a terminologia adotada da ciência da computação “não determinismo limitado” é um oxímoro incorreto (que era meu ponto antes).
O ponto principal é distinguir entre não determinismo limitado e ilimitado. [1]
Máquinas de Turing não determinísticas (também conhecidas como "NTMs") limitaram o não-determinismo, pois cada transição de estado tem um número limitado de possibilidades, ou seja, o número de programas (também conhecido como "configurações") é finito. A fita permanece sem limite, portanto a prova de término permanece indecidível. Mas para qualquer entrada que parar, a saída é determinística e limitada no tempo - ou seja, para qualquer entrada, o resultado é determinístico ou não termina. Além disso, os NTMs executam todas as configurações possíveis em paralelo, portanto, executam exponencialmente mais rapidamente que a emulação de NTMs em máquinas determinísticas de Turing (também conhecidas como "DTMs"). [2]
Realmente não existe uma relação não determinística entre entradas e resultados em MNTs porque o resultado é sempre o mesmo para qualquer entrada ou estado inicial, o que é evidente porque eles podem ser emulados por DTMs sem qualquer aleatoriedade adicional. [2] Indecidível não é a antítese do determinístico, porque não parar também é um resultado determinístico. Máquinas determinísticas sempre têm o mesmo resultado para uma determinada entrada, mesmo quando esse resultado não deve ser interrompido. O não determinismo localizado dos MNTs está em cada transição de estado do algoritmo em execução. É indecidível a priori qual caminho da árvore pode terminar, fornecendo o estado de saída. Mas indecidibilidade não é não-determinismo. Assim, o termo "não determinismo limitado" se destina a descrever a indeterminação localizada dentro da máquina de estado, mas não a relação entre entradas e resultados, daí o conceito de "delimitado". Ainda acho que o termo "não determinismo limitado" é um oxímoro e poderia ter sido descrito com mais precisão como uma máquina de Turing de "transição de estado paralelo".
Enquanto que, para qualquer entrada ou estado inicial, o não determinismo ilimitado (também conhecido como “indeterminismo”) tem um número ilimitado de estados possíveis. O não determinismo ilimitado envolve não apenas o número de configurações possíveis de programas, mas também um estado externo ilimitado que não faz parte da entrada ou do estado inicial, como atrasos ilimitados. E, portanto, os resultados podem variar em execuções repetidas para a mesma entrada ou condição inicial; portanto, não é uma relação determinística entre insumos e resultados. [3]
Algoritmos aleatórios e probabilísticos empregam algum não-determinismo, ou seja, seleção aleatória de configurações possíveis, possivelmente limitadas em número de configurações, mas eles não executam todas as configurações possíveis como as NTMs fazem. Portanto, eles não são determinísticos, a menos que a aleatoriedade seja determinística (por exemplo, PRNG) e o estado inicial da entropia para a aleatoriedade seja considerado parte da entrada.
[1] https://en.wikipedia.org/w/index.php?title=Unbounded_nondeterminism&oldid=710628370#Nondeterministic_automata
[2] https://en.wikipedia.org/w/index.php?title=Non-deterministic_Turing_machine&oldid=754212081#Equivalence_with_DTMs
[3] Hewitt, Meijer e Szyperski: O Modelo do Ator (tudo o que você queria saber ...) . Pule para a marca dos 17:44 minutos.
fonte
Além de todas as respostas que explicam a diferença, tenho um exemplo que pode ajudá-lo a entender o que eles querem dizer.
Considere-se um sorteio, você quer pegar um H ou um T . Se o sorteio é aleatório, é altamente provável que em 1000 lançamentos de moeda, 500 seria H e é muito improvável que 999 deles seria H . Mas se o sorteio não for determinístico, não podemos dizer que obter 999 H seria altamente improvável.
fonte
Os algoritmos randomizados (tempo polinomial, resultado booleano) estão na classe de complexidade computacional RP, que é um subconjunto de NP onde residem algoritmos não determinísticos (tempo polinomial, resultado booleano) e um superconjunto de P onde determinístico (tempo polinomial, resultado booleano) residem algoritmos.
A complexidade do subconjunto é sobre a redução de problemas em um conjunto para outro. Assim, RP ⊆ NP exclui a possibilidade de algoritmos aleatórios que também não são determinísticos, porque, definitivamente, um superconjunto contém o subconjunto. Subconjunto significa que todo algoritmo RP (ou qualquer algoritmo RP-completo) pode ser reduzido a algum algoritmo NP (ou qualquer algoritmo NP-completo). P é um subconjunto de RP porque todos os problemas em P podem ser reduzidos a um problema em RP, em que a quantidade de entropia não controlada é 0.
Tangencialmente, isso é análogo ao modo como todo problema em NC (computação paralela) pode ser reduzido a um problema em P , simulando a computação paralela em uma redução a um problema serial em P, mas ainda não está provado que o inverso é verdadeiro, ou seja, que todo problema em P é redutível a um problema na NC, nem provado que não é verdade, ou seja, a prova implausível de que um problema com P completo não é redutível a um problema na NC. Pode ser possível que haja problemas inerentemente seriais e que não possam ser computados em paralelo, mas provar que provar P ≠ NC parece ser implausível (por razões tangenciais demais para discutir nesta resposta).
De maneira mais geral (ou seja, não limitado a tipos de resultados booleanos), os algoritmos aleatórios são diferenciados dos algoritmos determinísticos, em que parte da entropia é de origem externa . Os algoritmos randomizados são diferenciados dos algoritmos não determinísticos porque a entropia é limitada e, portanto, pode-se provar que os algoritmos aleatórios (e não não determinísticos) sempre terminam.
A imprevisibilidade de algoritmos não determinísticos se deve à incapacidade de enumerar todas as permutações possíveis da entropia de entrada (o que resulta em imprevisibilidade de terminação). A imprevisibilidade de um algoritmo aleatório se deve à incapacidade de controlartoda a entropia de entrada (o que resulta em uma imprevisibilidade de um resultado indeterminado, embora a taxa de imprevisibilidade possa ser prevista). Nenhuma dessas são declarações sobre imprevisibilidade da resposta correta para o problema, mas a imprevisibilidade se manifesta no canal lateral da terminação e resultado indeterminado, respectivamente. Parece que muitos leitores conflitam imprevisibilidade em uma área com imprevisibilidade do resultado correto, que é uma combinação que nunca escrevi (revise o histórico de edições).
É fundamental entender que o não determinismo é sempre (em qualquer ciência ou uso do termo) a incapacidade de enumerar entropia universal (isto é, sem limites). Enquanto a randomização se refere ao acesso a outra fonte de entropia (em programas que não sejam e, portanto, não estejam sob o controle das variáveis de entrada), que podem ou não ser ilimitadas;
Adicionei o seguinte comentário abaixo da resposta atualmente mais popular ao outro tópico que faz uma pergunta semelhante.
Acrescentando alguns dos melhores comentários para esclarecer meu argumento sobre a única distinção saliente entre randomizado e não determinístico.
É realmente muito elegante e fácil ver a distinção, uma vez que todos vocês param de confundi-la tentando descrevê-la de um ponto de vista operacional, em vez do ponto de vista de entropia saliente.
.
.
.
Dicionários são ferramentas. Aprenda a usá-los.
Assim, a randomização requer apenas que parte da entropia de entrada seja equiprobável, o que é congruente com minha definição de que parte da entropia de entrada não seja controlada pelo responsável pela chamada da função. Observe que a randomização não exige que a entropia de entrada seja indecidível até a finalização.
Portanto, isso está nos dizendo que algoritmos determinísticos devem ser completamente determinados pelo estado de entrada da função, ou seja, devemos ser capazes de provar que a função terminará (ou não terminará) e que não pode ser indecidível. Apesar da tentativa confusa da Wikipedia de descrever não determinística, a única antítese à determinística, conforme definida acima pela Wikipedia, são algoritmos cujo estado de entrada (entropia) está mal definido. E a única maneira de o estado de entrada poder ser mal definido é quando é ilimitado (portanto, não pode ser deterministicamente pré-analisado). É exatamente isso que distingue uma máquina de Turing não determinística (e muitos programas do mundo real, escritos em linguagens completas comuns de Turing, como C, Java, Javascript, ML, etc.) de TMs determinísticas e linguagens de programação como HTML, fórmulas de planilhas, Coq, Epigram,
Wikipedia e outros tentam confundir randomização com não-determinismo, mas qual é o sentido de ter os dois conceitos se você não os distingue eloquentemente?
Claramente, o determinismo é sobre a capacidade de determinar. Claramente, a randomização é sobre como tornar equitativa parte da entropia.
Incluir entropia aleatória no estado de um algoritmo não é necessário torná-lo indeterminável. Por exemplo, um PRNG pode ter a distribuição estatística equiprobável necessária, mas também ser inteiramente determinístico.
Conflitar conceitos ortogonais é o que as pessoas com baixo QI. Espero que seja melhor do que isso nesta comunidade!
fonte