Array-Frage
-
Ich habe eine Kiste mit dieser Unterteilung:
Kiste 1: Artikel 1 bis 33
Kiste 2: Artikel 34 bis 95
Kiste 3: Artikel 96 bis 124
Kiste 4. Artikel 125 bis 160
Kiste 5: Artikel 161 bis 189
usw.Wie programmiert man am geschicktest eine Abfrage in welcher Kiste sich zum Beispiel Artikel 39 befindet? Eine geschachtelte Abfrage scheidet aus weil sich die Zuordnung vll. noch nachträglich ändern kann z.b. durch größere oder kleinere Kisten.
-
Orchy schrieb:
Eine geschachtelte Abfrage scheidet aus weil sich die Zuordnung vll. noch nachträglich ändern kann z.b. durch größere oder kleinere Kisten.
Was verstehst du hier unter "geschachtelte Abfrage"?
Naja, wie auch immer. Wenn deine Daten so wunderschön sortiert sind, dann wäre eine binäre Suche vielleicht etwas. Zuerst über die Kisten, um herauszufinden, in welcher Kiste sich der Artikel befindet (grösser gleich dem Kleinsten und kleiner gleich dem Grössten), und danach in der Kiste selbst.
Grüssli
-
Guten Morgen,
Wie sieht denn Deine Datenstruktur aus?
Hast Du ein Array aus mehreren dynamischen Array's?
Ist eine doppelte Artikelnummer ABSOLUT ausgeschlossen?
Sind die Artikel innerhalb Deiner Datenstruktur schon nach größe sortiert
oder hat der index des jeweiligen Artikels eine Bedeutung?Also, wenn die Artikel in der jeweiligen Kiste sortiert sind, dann gleiche
doch einfach nur den Anfangsartikel und den Endartikel innerhalb der Kiste ab,
dann weißt Du schon einmal in welchen Kisten der gesuchte Artikel sich nicht
befindet und im besten Fall in welchen dieser sich wahrscheinlich aufhalten müsste.grüße
------------------------
edit:
eine binäre suche wäre nur innerhalb einer Kiste, oder wenn man die
anfangswerte und endwerte aller kisten in ein seperates array
hinterlegt sinnvoll ?!
-
zeusosc schrieb:
edit:
eine binäre suche wäre nur innerhalb einer Kiste, oder wenn man die
anfangswerte und endwerte aller kisten in ein seperates array
hinterlegt sinnvoll ?!Wieso? Die Kisten liegen doch sicher auch in einer Liste. Alles was man dann braucht, ist ein Zugriff auf den ersten (tiefsten) und letzten (höchsten) Wert in der Kiste und du kannst auch eine binäre Suche über die Kisten laufen lassen.
Grüssli
-
Um die Performance kann man sich kümmern sobald Kritisch ^^ (-> Profiler)
Bis dahin kann man Linq die Arbeit machen lassen:
//Pseudo class Demo { public Demo() { // Fill _boxes somehow } private List<Box> _boxes; public Article GetArticleById(int id) { return (from k in _boxes from a in k.Artikel where a.Id == id select a).FirstOrDefault(); } } public class Box { public List<Article> Artikel { get; set; } } public class Article { public int Id { get; private set; } }