Classificação em Ciência da Computação vs. classificação no mundo 'real'


87

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?


44
A centrífuga é apenas uma implementação de tipo de bolha maciçamente paralela, nada sofisticado.
el.pescado

3
Ao ter nprocessadores (núcleos) para organizar uma série de nitens apenas, você pode facilmente atingir a O(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.
Dmitry Bychenko

24
Observe que n log n é o número de comparações que devem ser feitas em uma classificação que compare pares de itens . Não há nenhum requisito de que um algoritmo de classificação compare pares de itens ; se você puder chegar a uma classificação que não faça comparações entre pares, poderá torná-la mais rápida do que n log n.
Eric Lippert

7
O que está faltando é que cada uma dessas moléculas na solução são unidades de processamento. Não há emulador que conte as moléculas - as moléculas contam a si mesmas. Um computador análogo teria tantos núcleos de processador e memórias independentes quantos itens você tem para classificar. 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 :)
Luaan

4
Estou votando para fechar esta questão como fora do tópico porque ela pertence ao cs.stackexchange.com
Robert Fraser

Respostas:


71

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.


Esta é, na verdade, a resposta certa - a classificação por compartimento / classificação raiz tem complexidade O (n), desde que os compartimentos e a entrada possam ser acessados ​​em tempo O (1).
pjc50

5
Eu ia perguntar "Alguém mais pensa em Sleep Sort imediatamente?". Aparentemente, sim :)
CompuChip

As centrífugas funcionam comparando elementos; a função hash é (principalmente) densidade. Por exemplo, se você centrifugar uma mistura de propano e ar, o propano será classificado até os limites; mas se você centrifugar o propano e a água, o propano será classificado no centro (a água é mais densa). Esse processo é quase exatamente igual ao processo físico que deu nome a uma "classificação por bolha".
Nat

A complexidade do SleepSort não depende realmente do agendador?
Morwenn

@Morwenn, o agendador Linux antigo era O (1), enquanto o novo é O (log n). Ambos são superados pelos fatores constantes no sono
usuário 1952500

35

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:

  • suporta paralelismo arbitrário; não importa quantas partículas estão na solução, elas podem ser classificadas simultaneamente.
  • não fornece um tipo estritamente linear de partículas por massa, mas sim uma aproximação muito próxima (de baixa energia).
  • não é possível examinar as partículas individuais no resultado.
  • não é possível classificar as partículas por propriedades diferentes; apenas a massa é suportada.

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.


Natureza / física é paralela em geral (é por isso que é computacionalmente caro para simular em nossos computadores seriais), então sim, a analogia do OP tem uma grande falha. Ainda leva tempo para que as partículas / moléculas se movam ao longo do comprimento de um tubo de ensaio ou qualquer outra coisa, portanto, um tubo de ensaio mais longo é como mais trabalho por fio, mas um tubo de ensaio mais largo é mais paralelismo. (E observe que uma centrífuga não classifica ao longo da área de um tubo de ensaio, então são muitos tipos paralelos sem fusão, mas talvez alguma interação ao longo do caminho. Ao contrário de uma classificação real em um computador paralelo, com fusão final)
Peter Cordes

29

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.


Esse é um ponto muito bom. Como você sabe? Então, novamente, se as regras em vigor forem boas o suficiente, você se importaria em saber? (ou seja, se você tornar a probabilidade tão baixa que se torne insignificante).
Kris

Você sempre pode calcular quanto tempo levaria para uma partícula chegar ao fim da centrífuga. Você conhece a aceleração (w ^ 2 * r onde w é a velocidade angular) e pode calcular o tempo.
user1952500

1
É verdade, mas como isso é confundido pelo movimento browniano , outras forças atômicas e física quântica (obrigado, coisas minúsculas!), Você ainda não pode estar completamente certo de ter classificado sua lista até verificar o estado.
ti7

1
Se você não tem partículas extremamente pequenas, pode ignorar os efeitos quânticos. Se você tiver partículas extremamente pequenas, o algoritmo de classificação não precisa funcionar e, de fato, você não pode depender dele para funcionar devido aos efeitos quânticos. E você não pode verificar o estado de maneira confiável devido ao princípio da incerteza (verificar uma partícula fará com que outras partículas se movam).
user1952500

1
@Kris Bem, sabemos que a centrífuga não classifica perfeitamente. Simplesmente continuamos fazendo isso até que a diferença não importe mais para o propósito prático - como evitar a coagulação do sangue em sua centrífuga de sangue. Mas olhe para as centrífugas de urânio - aquelas precisam classificar itens que estão muito "mais próximos" (mais difíceis de separar) e requerem uma enorme instalação que continua classificando indefinidamente a um custo enorme para produzir pequenas quantidades do material desejado. E a centrífuga tem um certo tamanho, e o tempo de separação é proporcional à largura dos tubos, e ... Você não pode simplesmente dizer O (n), yay!
Luaan

5

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.

saber a posição de cada elemento

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).


4

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:

  1. 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.

  2. 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)).


Mas a computação não é apenas isso - usar as propriedades físicas da natureza para fazer algum trabalho? Posso estar entrando na computação quântica aqui, mas se isso pode ser feito fisicamente, deve ser capaz de ser feito computacionalmente? Talvez a computação clássica seja o obstáculo entre O (nlogn) e O (logn).
Kris

2
@Kris Não exatamente. 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.
ElKamina

Esse limite também se aplica a objetos QM? Só por curiosidade
Kris

1
@Kris Não entendo QM com profundidade suficiente para responder.
ElKamina

Não se preocupe! Estou muito curioso e não consigo dormir haha. Obrigado pelas respostas interessantes.
Kris

4

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.


O tipo espaguete foi uma leitura divertida. Gostei de pensar nisso, mas critico a ação de procurar o macarrão mais comprido. Esta não é realmente uma operação O (1), já que você examina o macarrão. Imagine dez mil macarrões e alguns que são semelhantes em comprimento ... não é uma operação O (1) de "olho no olho". Na realidade, é preciso examinar todos os macarrões não selecionados para encontrar o mais comprido.
ThisClark

Você pode “escanear” todo o macarrão colocando a palma da mão em todo o molho e puxando o macarrão mais alto que entra em contato com a sua mão. Se o macarrão tiver comprimento muito próximo, use uma superfície de “mão” mais precisa para agarrar o macarrão mais alto. Os macarrões não são selecionados em série como uma classificação de seleção, eles são selecionados todos de uma vez para que haja O (n) poder de “computação” disponível.
Bradd Szonye

1
@ThisClark você precisa de um gabarito mais preciso: um plano plano paralelo ao batente na parte inferior que alinha o macarrão. Abaixe-o com cuidado até que um macarrão (o mais alto) seja tocado e colocado sob compressão. A comparação da altura do avião com cada macarrão é feita em paralelo por aquele macarrão. Você está sugerindo que um coeficiente mais alto é necessário, mas esse argumento não altera o Big-O.
JDługosz de

3

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)


2

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 ...


1

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?

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.

Algo como uma centrífuga, onde apenas cada elemento se preocupa com sua posição relativa no espaço (em relação a outros nós)

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?


1
Eu acho que você está certo. Acho que perdi minha analogia aqui é que esqueci que cada molécula age em paralelo. Então, seria como uma espécie de bolha paralela ...
Kris

1

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 ...


0

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.


É a mesma coisa que eu disse 11 horas antes. E continuei explicando como os sistemas físicos permitem dividir por n ou por n² e manter o modelo de algoritmos e computação.
JDługosz de

0

Considere: a "classificação por centrifugação" realmente tem uma escala melhor? Pense no que acontece conforme você aumenta.

  • Os tubos de ensaio têm que ficar cada vez mais longos.
  • O material pesado tem que viajar cada vez mais para chegar ao fundo.
  • O momento de inércia aumenta, exigindo mais potência e tempos mais longos para acelerar até a velocidade de classificação.

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.