Gibt es wichtige Fälle, in denen man wissen muss, wie man Sortieralgorithmen in der Spielprogrammierung programmiert? [geschlossen]


7

Nun, ich habe bereits ein wenig über Sortieralgorithmen auf Wikipedia gelesen. Das Thema scheint umfangreich zu sein, insbesondere wenn es um einige Fälle geht, in denen einige Algen schneller sind als andere.

Das könnte eine kurze Zusammenfassung erfordern, aber kann mir vorher jemand sagen, ob es Themen der Spielprogrammierung gibt, bei denen eine Sortierung erforderlich ist? (oder optional, wenn es um die Ausführungszeit geht).

Vielleicht in einem Tiefenpuffer?

Antworten:


19

Ich werde ja zu Ihrer Frage sagen, wie formuliert, aber mit wichtigen Einschränkungen.

Ja, Sie müssen wissen, wie man Dinge in der Programmierspielentwicklung sortiert. In einer Vielzahl von Situationen wird viel sortiert. Nein, Sie müssen nicht genau wissen, wie alle (oder sogar viele) der verschiedenen Sortieralgorithmen funktionieren. Es reicht fast immer aus, sie bei Bedarf in einer Referenz (online oder in einem Buch) nachzuschlagen.

Was wichtig ist, ist nicht das Wie und Warum jedes Algorithmus, sondern ein tieferes Verständnis dafür, warum einige Algorithmen in bestimmten Situationen besser funktionieren. Es ist genau zu verstehen, welche Situation Sie haben (muss ich vor Ort sortieren, kann ich Elemente billig in die Liste einfügen). Es geht darum, die gängigsten und flexibelsten Algorithmen zu kennen, nicht so sehr die Details ihrer Funktionsweise, sondern vielmehr die Situationen, in denen sie nicht verwendet werden sollten.

Und schließlich ist es wichtig zu wissen, wann die Sortierleistung wichtig ist (wenn Sie viele, viele Elemente haben und viel sortieren müssen) und wann es nicht so wichtig ist (wenn Sie nur wenige Elemente haben und / oder nur sortieren müssen wenn sich die Liste ändert). Im letzteren Fall werfen Sie die Liste einfach durch Quicksort. Wenn Ihre Objekte groß sind, sortieren Sie eine Liste von Indizes nach den Objekten und nicht nach den Objekten selbst. In den letzten rund zehn Jahren, in denen ich mich beruflich weiterentwickelt habe, kann ich zählen, wie oft ich einen genaueren oder spezifischeren Sortieralgorithmus benötigt habe, und es sind wahrscheinlich weniger als 20.


2
Haben Sie diese Liste abgestimmter spezifischer Algorithmen sortiert?
SLF

9

Ja, Sie sortieren die Dinge die ganze Zeit. Ein häufiges Beispiel sind Grafikanrufe.

Ob Sie wissen müssen, wie jeder Sortieralgorithmus von oben implementiert wird, ist eine andere Frage, aber Sie sollten zumindest in der Lage sein, Fragen zu beantworten wie:

  • Welche Sortierung verwende ich, wenn ich eine direkte Sortierung mit minimalem Stapelaufwand benötige? (Iterative oder schwanzrekursive Quicksortierung.)
  • Wie kann ich eine große Liste von Zeichenfolgen so schnell wie möglich sortieren? (Burstsort, Radix-Sortierung oder schnelle Sortierung je nach Architektur.)
  • Wie sortiere ich diese Assets in Abhängigkeitsreihenfolge? (Topologische Sortierung.)
  • Ich muss nur einige unbekannte Daten auf vernünftige Weise sortieren. (Timsort, Quicksort.)

All diese Situationen treten bei allen Arten von Software auf, einschließlich Spielen.

Auch hier müssen Sie nicht alle diese Informationen auswendig lernen, aber Sie müssen in der Lage sein, ein Buch mit Sortieralgorithmen zu öffnen, eine kurze Beschreibung der einzelnen Algorithmen zu lesen und die richtige auszuwählen. Das bedeutet, die Anforderungen an Zeit und Raum (Big-O) zu verstehen und eine Vorstellung davon zu haben, wie verschiedene Sortieralgorithmen funktionieren (Zusammenführen, Auswählen, Austauschen).

Sortieralgorithmen spielen auch in Vorstellungsgesprächen eine wichtige Rolle. Normalerweise lauten die Fragen nicht "Quicksort implementieren", sondern "Hier ist eine Beschreibung der Arten der Eingabe. Welcher Sortieralgorithmus funktioniert dafür gut?"


5

Es gibt viele Fälle, in denen Sie möglicherweise Dinge sortieren müssen, je nachdem, welche Art von Spielprogrammierung Sie ausführen:

  • Sortieren Sie undurchsichtige Objekte vor dem Zeichnen nach Entfernung von der Kamera ( Reverse-Painter-Algorithmus ).
  • Sortieren Sie transparente Dreiecke nach Abstand von der Kamera, bevor Sie sie in umgekehrter Reihenfolge zeichnen.
  • Topologische Art von Zielabhängigkeitsgraph, um eine sinnvolle Reihenfolge für den Versuch, Ziele zu erreichen, zu erarbeiten (nützlich in der KI oder beim Geben automatisierter Hinweise).
  • Sortieren Sie Objekte entlang einer Koordinate, um schnelle Kollisionstests durchzuführen.
  • Sortieren Sie Ereignisse nach Zeit, um herauszufinden, welches als nächstes behandelt werden soll.
  • Sortieren Sie Objekte nach einer eindeutigen ID, um eine kanonische Reihenfolge für den Vergleich oder die Serialisierung zu erhalten.
  • Sortieren Sie die Profilstatistiken, um herauszufinden, welche Bereiche für die Optimierung am rentabelsten sind.

Es ist selten, dass Sie Ihren eigenen Sortieralgorithmus implementieren müssen: Im Allgemeinen wählen Sie einfach eine geeignete Funktion aus einer Bibliothek aus. Das Studieren und Schreiben von Sortieralgorithmen ist jedoch eine gute allgemeine Praxis für das Schreiben und Analysieren von Algorithmen. Ihr Wissen ist hilfreich, wenn Sie einen guten Algorithmus aus einer Bibliothek auswählen oder die (seltenen) Fälle erkennen möchten, in denen die Besonderheiten Ihres Problems von Bedeutung sind dass Sie die generische Bibliotheksroutine verbessern könnten.


1

Ich werde hier nur eine kurze Antwort hinzufügen: HIGHSCORE-Tabelle ...


1

Die meisten Sprachen verfügen über eine gute allgemeine QuickSort-Implementierung.

Sie werden nicht unbedingt mit Implementierungen stabiler Sortierungen geliefert, Sortierungen, die Werte nicht direkt vergleichen, Sortierungen, die nicht leiden, wenn sie für vorsortierte Daten verwendet werden, Sortierungen, die für festplattenbasierte Daten gut funktionieren, Sortierungen, die besser funktionieren, wenn Bei viel Speicher, Sortierungen, die ohne zusätzlichen Speicher funktionieren, Teilsortierungen, die nur eine Teilmenge der Daten effizient sortieren, Partitionen, die Daten nur relativ zu einem Pivot-Schwellenwert sortieren, und so weiter.

Diese sind alle von Zeit zu Zeit nützlich.


-1

Als allgemeinere Antwort, selbst wenn Sie nie Ihren eigenen Sortieralgorithmus "vor Ort" schreiben (schließlich ist, wie Sie zweifellos bei Wikipedia gesehen haben, Ihre durchschnittliche Sortierung nach Gartensorten ein Problem, das bereits gelöst wurde). Das Sortieren ist einer der Kernaspekte der Informatik, der beim rechnerischen Denken hilft, das ein Programmierer benötigt. Betrachten Sie es als das "Wachs an, Wachs aus", das Sie lernen, bevor Sie erkennen, dass Sie diese Fähigkeit auch für Karate verwenden können :)


1
"Ihre durchschnittliche Sortierung nach Gartensorten ist ein Problem, das bereits gelöst wurde" - Nicht wirklich. Timsort wurde erst 2002 erfunden, Burstsort 2003 usw. Ich habe gehört, dass "Sortieren ein gelöstes Problem ist", seit ich Anfang der 90er Jahre angefangen habe, CS zu studieren, und dennoch haben wir jetzt so viel bessere Sortieralgorithmen als damals.

Fair genug, Joe. Was ich mit "Gartenvielfalt" gemeint habe, ist, dass Sie für die Zwecke einer einfachen Art von beispielsweise einer Liste von <100 Artikeln (wie in einer Highscore-Tabelle oder einer Inventar-Artikelliste) keine benötigen ganze Menge Optimierung; Quicksort oder sogar Blasensortierung würde gut funktionieren und Sie brauchen dafür nicht wirklich modernste Sortieralgorithmen.
Ian Schreiber

Tatsächlich ist Quicksort in diesen Fällen in Bezug auf die Kosten pro Artikel wirklich schrecklich. Vielleicht spielt es im großen Schema Ihres Programms keine Rolle, weil Sie es nur einmal pro Tag sortieren und es nicht schnell erledigen müssen, aber wenn ich zum Beispiel 1000 Listen mit 10 Gegenständen habe (Inventargegenstände aller Online-Spieler in Ein MMO, z. B. 1000-maliges Anwenden von Quicksort, ist eine der schlechtesten Lösungen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.