Existem casos importantes em que é preciso saber programar algoritmos de classificação na programação de jogos? [fechadas]

7

Bem, eu já li um pouco sobre algoritmos de classificação na wikipedia, o assunto parece vasto, especialmente quando se lida com alguns casos em que alguns algos são mais rápidos que outros.

Isso pode precisar de um resumo rápido, mas antes disso, alguém pode me dizer se há assuntos de programação de jogos em que a classificação é necessária? (ou opcional, para questões de tempo de execução).

Talvez em um buffer de profundidade?

jokoon
fonte

Respostas:

19

Vou dizer que sim, à sua pergunta como formulada, mas com advertências importantes.

Sim, você precisa saber como classificar as coisas no desenvolvimento de jogos de programação. Há muitas classificações, em uma ampla variedade de situações. Não, você não precisa saber os detalhes de como todos (ou muitos) os vários algoritmos de classificação funcionam, quase sempre é suficiente procurá-lo em uma referência (online ou livro) quando necessário.

O importante não é o como e o porquê de cada algoritmo, é uma compreensão mais profunda do motivo pelo qual alguns algoritmos funcionam melhor em algumas situações. É entender exatamente qual situação você tem (eu preciso classificar no local, posso inserir itens na lista mais barato)? É conhecer os algoritmos mais comuns e flexíveis, não tanto os detalhes de como eles funcionam, mas mais as situações em que eles não devem ser usados.

E, finalmente, é saber quando a classificação do desempenho é importante (quando você tem muitos, muitos itens e precisa classificá-los muito) e quando não é tão importante (quando você tem apenas alguns itens e / ou você só precisa classificar quando a lista mudar). Neste último caso, basta passar a lista pelo quicksort. Se seus objetos forem grandes, classifique uma lista de índices para os objetos, e não para os próprios objetos. Nos últimos doze anos que desenvolvo profissionalmente, posso contar o número de vezes que precisei de um algoritmo de classificação mais ajustado ou específico, e provavelmente é menos de 20.

MrCranky
fonte
2
você classificou essa lista de algoritmos específicos ajustados?
SLF
9

Sim, você ordena as coisas o tempo todo. Um exemplo comum são as chamadas gráficas.

Se você precisa saber como implementar todos os algoritmos de classificação em primeiro plano é outra pergunta, mas você deve pelo menos ser capaz de responder perguntas como:

  • Que tipo eu uso se precisar de uma classificação no local com sobrecarga mínima da pilha? (Classificação rápida iterativa ou recursiva da cauda.)
  • Como posso classificar uma grande lista de strings o mais rápido possível? (Burstsort, classificação de raiz ou classificação rápida, dependendo da arquitetura.)
  • Como classifico esses ativos em ordem de dependência? (Classificação topológica.)
  • Eu só preciso classificar alguns dados desconhecidos de uma maneira razoável? (Timsort, quicksort.)

Todas essas situações surgem em todos os tipos de software, incluindo jogos.

Novamente, você não precisa de tudo isso memorizado, mas precisa ser capaz de abrir um livro de algoritmos de classificação, ler uma breve descrição de cada um e escolher o correto. Isso significa entender os requisitos de tempo e espaço (big-O) e ter uma idéia de como os diferentes algoritmos de classificação funcionam (mesclando, selecionando, trocando).

Os algoritmos de classificação também aparecem com destaque nas entrevistas de emprego; geralmente as perguntas não são "implementar quicksort", mas "aqui está uma descrição dos tipos de entrada, que algoritmo de classificação funciona bem para isso?"


fonte
5

Há muitos casos em que você pode precisar classificar as coisas, dependendo do tipo de programação de jogo que você está executando:

  • Classifique objetos opacos pela distância da câmera antes de desenhar ( algoritmo do pintor reverso )
  • Classifique os triângulos transparentes pela distância da câmera antes de desenhá-los na ordem inversa.
  • Gráfico topológico do tipo de dependência de meta para determinar uma ordem sensata para tentar atingir as metas (útil na IA ou no fornecimento de dicas automatizadas).
  • Classifique objetos ao longo de algumas coordenadas para testes rápidos de colisão.
  • Classifique os eventos por hora para descobrir qual deles será o próximo.
  • Classifique os objetos por ID exclusivo para obter ordem canônica para comparação ou serialização.
  • Classifique as estatísticas de criação de perfil para descobrir quais áreas seriam mais lucrativas para otimizar.

É raro você precisar implementar seu próprio algoritmo de classificação: geralmente você apenas escolhe uma função apropriada de uma biblioteca. Mas estudar e escrever algoritmos de classificação é uma boa prática geral para escrever e analisar algoritmos, e seu conhecimento será útil quando se trata de escolher um bom algoritmo de uma biblioteca ou identificar os casos (raros) em que os recursos especiais do seu problema significam que você pode melhorar a rotina da biblioteca genérica.

Gareth Rees
fonte
1

Vou adicionar uma resposta curta aqui: tabela HIGHSCORE ...

BerggreenDK
fonte
1

A maioria dos idiomas vem com uma boa implementação de quicksort de uso geral.

Eles não vêm necessariamente com implementações de classificações estáveis, classificações que não comparam valores diretamente, classificações que não sofrem quando usadas em dados pré-classificados, classificações que funcionam bem em dados baseados em disco, classificações que funcionam melhor se com muita memória, classificações que funcionam sem exigir memória extra, classificações parciais que classificam eficientemente apenas um subconjunto dos dados, partições que classificam apenas os dados relativos a um limite de dinâmica e assim por diante.

Tudo isso é útil de tempos em tempos.

Kylotan
fonte
-1

Como resposta mais geral, mesmo se você nunca escrever seu próprio algoritmo de classificação "em campo" (afinal, como você já viu na Wikipedia, sua classificação média de variedades de jardins é um problema que já foi resolvido), a classificação é um dos aspectos centrais da ciência da computação que ajuda no tipo de pensamento computacional que um programador precisa. Pense nisso como a "cera, cera" que você aprende antes de perceber que também pode usar essa habilidade no karatê :)

Ian Schreiber
fonte
11
"sua seleção média de variedades de jardins é um problema que já foi resolvido" - Na verdade não. O Timsort foi inventado em 2002, no Burstsort em 2003, etc. Ouvi dizer que "a classificação é um problema resolvido" desde que comecei a estudar CS no início dos anos 90, e ainda temos algoritmos de classificação muito melhores agora do que naquela época.
Justo, Joe. O que eu quis dizer com "variedade de jardim" é que, para fins de um tipo simples de, digamos, uma lista de <100 itens (como encontrado em uma tabela de pontuação alta ou lista de itens de inventário), você não precisa de um muita otimização; a classificação quicksort ou mesmo a bolha funcionaria muito bem e você realmente não precisa ter algoritmos de classificação de ponta para isso.
22410 Ian Ian Schreiber
Na verdade, o quicksort é realmente horrível nesses casos, em termos de custo por item. Talvez no esquema geral do seu programa isso não importe, porque você o classifica apenas uma vez por dia e não precisa ser feito rapidamente, mas se eu tiver, digamos, 1000 listas de 10 itens (itens de inventário de todos os jogadores on-line em um MMO, por exemplo), aplicar quicksort 1000 vezes é uma das piores soluções possíveis.