Eu estava pensando em classificar algoritmos em software e em possíveis maneiras de superar o O(nlogn)
obstáculo. Eu não acho que seja possível classificar mais rápido em um sentido prático, então, por favor, não pense que eu faço.
Com isso dito, parece que com quase todos os algoritmos de classificação, o software deve saber a posição de cada elemento. O que faz sentido, caso contrário, como saberia onde colocar cada elemento de acordo com alguns critérios de classificação?
Mas quando cruzei esse pensamento com o mundo real, uma centrífuga não tem ideia da posição em que cada molécula está quando "classifica" as moléculas por densidade. Na verdade, não se preocupa com a posição de cada molécula. No entanto, ele pode classificar trilhões e trilhões de itens em um período de tempo relativamente curto, devido ao fato de que cada molécula segue as leis da densidade e gravitacional - o que me fez pensar.
Seria possível com alguma sobrecarga em cada nó (algum valor ou método anexado a cada um dos nós) para 'forçar' a ordem da lista? Algo como uma centrífuga, onde apenas cada elemento se preocupa com sua posição relativa no espaço (em relação aos outros nós). Ou isso viola alguma regra de computação?
Acho que um dos grandes pontos levantados aqui são os efeitos da mecânica quântica da natureza e como eles se aplicam em paralelo a todas as partículas simultaneamente.
Talvez os computadores clássicos restrinjam inerentemente a classificação ao domínio de O(nlogn)
, onde, como computadores quânticos, podem ser capazes de cruzar esse limiar em O(logn)
algoritmos que agem em paralelo.
O ponto de que uma centrífuga sendo basicamente um tipo de bolha paralela parece estar correto, que tem uma complexidade de tempo de O(n)
.
Acho que o próximo pensamento é que se a natureza pode se classificar O(n)
, por que os computadores não podem?
n
processadores (núcleos) para organizar uma série den
itens apenas, você pode facilmente atingir aO(n)
complexidade. Uma verdade amarga é que geralmente temos que classificar matrizes longas (milhares e milhões de itens) na CPU com apenas 2..10 núcleos.O(n)
por si só não diz nada - só é útil para comparar algoritmos com restrições semelhantes e rodando em arquiteturas semelhantes; nos cursos introdutórios à complexidade algorítmica, usamos um modelo muito simplificado de "computador" que tem pouco a ver com centrífugas ou computadores reais :)Respostas:
EDIT: Eu tinha entendido mal o mecanismo de uma centrífuga e parece que ele faz uma comparação, um maciçamente paralelo nisso. No entanto, existem processos físicos que operam em uma propriedade da entidade que está sendo classificada, em vez de comparar duas propriedades. Essa resposta abrange algoritmos dessa natureza.
Uma centrífuga aplica um mecanismo de classificação que realmente não funciona por meio de comparações entre elementos, mas na verdade por uma propriedade ('força centrífuga') em cada elemento individual isoladamente.Alguns algoritmos de classificação se enquadram neste tema, especialmente Radix Sort . Quando esse algoritmo de classificação é paralelizado, ele deve se aproximar do exemplo de uma centrífuga.Alguns outros algoritmos de classificação não comparativos são Bucket sort e Counting Sort . Você pode descobrir que o tipo de balde também se encaixa na ideia geral de uma centrífuga (o raio pode corresponder a uma caixa).
Outro assim chamado 'algoritmo de classificação', em que cada elemento é considerado isoladamente, é o Sleep Sort . Aqui, o tempo, em vez da força centrífuga, atua como a magnitude usada para a classificação.
fonte
A complexidade computacional é sempre definida em relação a algum modelo computacional. Por exemplo, um algoritmo que é O ( n ) em um computador típico pode ser O (2 n ) se implementado no Brainfuck .
O modelo computacional da centrífuga tem algumas propriedades interessantes; por exemplo:
Dado que não temos a capacidade de implementar algo assim em hardware de computação de uso geral, o modelo pode não ter relevância prática; mas ainda pode valer a pena examinar, para ver se há algo a aprender com isso. Algoritmos não determinísticos e algoritmos quânticos têm sido áreas ativas de pesquisa, por exemplo, embora nenhum seja realmente implementável hoje.
fonte
O truque está aí, você só tem probabilidade de classificar sua lista usando uma centrífuga. Tal como acontece com outras classificações do mundo real [carece de fontes?], Você pode alterar a probabilidade de ter classificado sua lista, mas nunca tenha certeza sem verificar todos os valores (átomos).
Considere a pergunta: "Por quanto tempo você deve operar sua centrífuga?"
Se você executou por apenas um picossegundo, sua amostra pode ser menos classificada do que o estado inicial .. ou se você executou por alguns dias, pode ser completamente classificada. No entanto, você não saberia sem realmente verificar o conteúdo.
fonte
Um exemplo do mundo real de um "ordenamento" baseado em computador seria drones autônomos que trabalham cooperativamente uns com os outros, conhecidos como "enxames de drones". Os drones agem e se comunicam como indivíduos e como um grupo e podem rastrear vários alvos. Os drones decidem coletivamente quais drones seguirão quais alvos e a necessidade óbvia de evitar colisões entre drones. As primeiras versões disso eram drones que se moviam através de pontos de passagem enquanto permaneciam em formação, mas a formação poderia mudar.
Para uma "classificação", os drones poderiam ser programados para formar uma linha ou padrão em uma ordem específica, inicialmente liberada em qualquer permutação ou forma, e coletivamente e em paralelo eles formariam rapidamente a linha ou padrão ordenado.
Voltando à classificação baseada em computador, um problema é que há um barramento de memória principal e não há como um grande número de objetos se moverem paralelamente na memória.
No caso de uma classificação de fita, a posição de cada elemento (registro) só é "conhecida" pela "fita", não pelo computador. Uma classificação baseada em fita só precisa funcionar com dois elementos por vez e uma maneira de denotar os limites de execução em uma fita (marca de arquivo ou um registro de tamanho diferente).
fonte
IMHO, as pessoas pensam demais log (n). O (nlog (n)) É praticamente O (n). E você precisa de O (n) apenas para ler os dados.
Muitos algoritmos, como quicksort, fornecem uma maneira muito rápida de classificar elementos. Você poderia implementar variações de quicksort que seriam muito rápidas na prática.
Inerentemente, todos os sistemas físicos são infinitamente paralelos. Você pode ter um monte de átomos em um grão de areia, a natureza tem poder computacional suficiente para descobrir onde cada elétron em cada átomo deve estar. Portanto, se você tiver recursos computacionais suficientes (processadores O (n)), poderá classificar n números em tempo log (n).
Dos comentários:
Dado um processador físico que possui k número de elementos, ele pode atingir uma paralelicidade de no máximo O (k). Se você processar n números arbitrariamente, ele ainda os processará a uma taxa relacionada a k. Além disso, você pode formular esse problema fisicamente. Você poderia criar n bolas de aço com pesos proporcionais ao número que você deseja codificar, o que poderia ser resolvido por uma centrífuga em uma teoria. Mas aqui a quantidade de átomos que você está usando é proporcional a n. Considerando que, em um caso padrão, você tem um número limitado de átomos em um processador.
Outra maneira de pensar sobre isso é, digamos que você tenha um pequeno processador conectado a cada número e cada processador possa se comunicar com seus vizinhos, você poderia classificar todos esses números em tempo O (log (n)).
fonte
Trabalhei em um escritório nos verões após o colégio, quando comecei a faculdade. Eu tinha estudado em Ciência da Computação AP, entre outras coisas, classificação e pesquisa .
Eu apliquei esse conhecimento em vários sistemas físicos que me lembro:
Ordenação de mesclagem natural para começar ...
Um sistema imprimia formulários de várias vias, incluindo um rasgo do tamanho de um cartão de arquivo, que precisava ser arquivado em um banco de gavetas.
Comecei com uma pilha deles e classifiquei a pilha para começar. O primeiro passo é pegar 5 ou mais, poucos o suficiente para serem facilmente colocados em ordem em sua mão. Coloque o pacote classificado para baixo, cruzando cada pilha para mantê-los separados.
Em seguida, mescle cada par de pilhas, produzindo uma pilha maior. Repita até que haja apenas uma pilha.
... classificação de inserção para concluir
É mais fácil arquivar os cartões classificados, pois cada um está um pouco mais abaixo na mesma gaveta aberta.
Radix sort
Este ninguém mais entendeu como eu fiz isso tão rápido, apesar das repetidas tentativas de ensiná-lo.
Uma grande caixa de canhotos de cheques (do tamanho de cartões perfurados) precisa ser classificada. Parece que está jogando paciência em uma grande mesa - distribuir, empilhar, repetir.
Em geral
Há 30 anos, percebi o que você está perguntando: as ideias são transferidas para sistemas físicos de maneira bastante direta porque existem custos relativos de comparações e manuseio de registros e níveis de armazenamento em cache.
Indo além de equivalentes bem compreendidos
Lembro-me de um ensaio sobre o seu tópico, que trouxe à baila o tipo espaguete . Você corta um pedaço de macarrão seco para indicar o valor da chave e o rotula com o ID do registro. Este é O (n), simplesmente processando cada item uma vez.
Então você pega o pacote e bate com uma das pontas na mesa. Eles se alinham nas bordas inferiores e agora estão classificados. Você pode trivialmente tirar o mais longo e repetir. A leitura também é O (n).
Há duas coisas acontecendo aqui no “mundo real” que não correspondem a algoritmos. Em primeiro lugar, o alinhamento das bordas é uma operação paralela. Cada item de dados também é um processador (as leis da física se aplicam a ele). Portanto, em geral, você dimensiona o processamento disponível com n, essencialmente dividindo sua complexidade clássica por um fator em n.
Em segundo lugar, como o alinhamento das bordas realiza uma classificação? A verdadeira classificação está na leitura, que permite encontrar o mais longo em uma etapa, mesmo que você tenha comparar todos eles para encontrar o mais longo. Novamente, divida por um fator de n, então encontrar o maior agora é O (1).
Outro exemplo é o uso de computação analógica: um modelo físico resolve o problema “instantaneamente” e o trabalho de preparação é O (n). Em princípio, o cálculo é feito em escala com o número de componentes em interação, não com o número de itens preparados. Portanto, o cálculo é dimensionado com n². O exemplo em que estou pensando é um cálculo multifatorial ponderado, que foi feito fazendo furos em um mapa, pendurando pesos em cordas que passavam pelos buracos e reunindo todas as cordas em um anel.
fonte
A classificação ainda é o tempo total O (n). Que é mais rápido do que isso é devido à paralelização .
Você pode ver uma centrífuga como um Bucketsort de de n átomos, paralelizada sobre n núcleos (cada átomo atua como um processador).
Você pode tornar a classificação mais rápida por paralelização, mas apenas por um fator constante porque o número de processadores é limitado, O (n / C) ainda é O (n) (CPUs geralmente têm <10 núcleos e GPUs <6000)
fonte
A centrífuga não está classificando os nós, ela aplica uma força a eles, então eles reagem em paralelo a ela. Portanto, se você fosse implementar uma classificação de bolha em que cada nó se movesse em paralelo para cima ou para baixo com base em sua "densidade", você teria uma implementação de centrífuga.
Tenha em mente que no mundo real você pode executar uma grande quantidade de tarefas paralelas onde em um computador você pode ter um máximo de tarefas paralelas reais igual ao número de unidades físicas de processamento.
No final, você também ficaria limitado ao acesso à lista de elementos porque ela não pode ser modificada simultaneamente por dois nós ...
fonte
Quando classificamos usando programas de computador, selecionamos uma propriedade dos valores que estão sendo classificados. Geralmente é a magnitude do número ou a ordem alfabética.
Essa analogia me lembra muito bem do tipo de bolha simples. Como os números menores aparecem em cada iteração. Como sua lógica de centrífuga.
Então, para responder a isso, não fazemos realmente algo desse tipo na classificação baseada em software?
fonte
Em primeiro lugar, você está comparando dois contextos diferentes, um é a lógica (computador) e o outro é a física, que (até agora) está provado que podemos modelar algumas partes dele usando fórmulas matemáticas e nós, como programadores, podemos usar essas fórmulas para simular (algumas partes da) física na lógica funcionam (por exemplo, mecanismo de física no mecanismo de jogo).
Segundo, temos algumas possibilidades no mundo do computador (lógica) que são quase impossíveis na física, por exemplo, podemos acessar a memória e encontrar a localização exata de cada entidade a cada momento, mas na física esse é um grande problema do princípio da incerteza de Heisenberg .
Terceiro Se você quiser mapear centrífugas e sua operação no mundo real, para o mundo dos computadores, é como se alguém (O Deus) tivesse dado a você um supercomputador com todas as regras da física aplicadas e você estivesse fazendo sua pequena classificação nele ( usando centrífuga) e dizendo que seu problema de classificação foi resolvido em o (n), você está ignorando a enorme simulação de física acontecendo em segundo plano ...
fonte
Outra perspectiva é que o que você está descrevendo com a centrífuga é análogo ao que foi chamado de "classificação de espaguete" ( https://en.wikipedia.org/wiki/Spaghetti_sort ). Digamos que você tenha uma caixa de espaguetes crus de comprimentos variados. Segure-os em seu punho e afrouxe sua mão para abaixá-los verticalmente de forma que as pontas fiquem todas apoiadas em uma mesa horizontal. Estrondo! Eles são classificados por altura. Tempo O (constante). (Ou O (n) se você incluir separar as hastes pela altura e colocá-las em um ... rack de espaguete, eu acho?)
Você pode notar que é O (constante) no número de pedaços do espaguete, mas, devido à velocidade finita do som no espaguete, é O (n) no comprimento da fita mais longa. Portanto, nada vem de graça.
fonte
Considere: a "classificação por centrifugação" realmente tem uma escala melhor? Pense no que acontece conforme você aumenta.
Também vale a pena considerar outros problemas com a classificação por centrifugação. Por exemplo, você só pode operar em uma escala de tamanho estreita. Um algoritmo de classificação de computador pode lidar com números inteiros de 1 a 2 ^ 1024 e além, sem esforço. Coloque algo que pesa 2 ^ 1024 vezes mais que um átomo de hidrogênio em uma centrífuga e, bem, isso é um buraco negro e a galáxia foi destruída. O algoritmo falhou.
Claro que a resposta real aqui é que a complexidade computacional é relativa a algum modelo computacional, conforme mencionado em outra resposta. E "classificação por centrifugação" não faz sentido no contexto de modelos computacionais comuns, como o modelo RAM ou o modelo IO ou máquinas de Turing com várias fitas.
fonte