Ein Array mit Reichweiten durchsuchen

Katzehuhn

Erfahrenes Mitglied
Folgendes:
Ich hab bestimmte Objekte, die eine relative Häufigkeit in einem größeren System haben. D.h genaur: Ich hab eine Liste von Objekten und jedes dieser Objekte hat eine relative Häufigkeit. Aus dieser Liste an Objekten möchte ich mir nun eines zufällig herausfischen.
Dazu lasse ich mir erstmal eine zufällige Zahl zwischen 0 und der Summe aller relativen Häufigkeiten ausgeben.
Anfangs war meine Idee, dies einfach über die Datenbank abzufragen. Sprich die Daten werden so aufbereitet das ich pro "Gruppe" einen von und einen bis Wert hatte, der der relativen Häufigkeit des Objekts entsprochen hatte.
So konnte ich einfach per 'Zufallszahl' BETWEEN von AND bis, den notwendigen Datensatz herauslesen.
Nun bin ich aber zu den Punkt gelangt, dies alles in Java abbilden zu versuchen.
Hab dies eigentlich auch schon ganz ok hinbekommen, mich würde es jedoch interessieren ob es irgendwo eine optimale Lösung zu diesem Problem gibt? Man könnte die Objekte ja nicht nur irgendwie sortieren und in der Mitte zu suchen anfangen, sondern sie nach Häufigkeiten ordnen um so irgendwie einen Geschwindigkeitszuwachs zu erhalten. Jemand ne Idee?:)
 
Nochmal durchgehen:

Du hast eine Klasse, welche einen Integer-Wert und noch irgend etwas haben. Nach dieser Häufigkeit werden die Instanzen eingeteilt, und du versuchst jetzt einen zufälligen Wert einer bestimmten Häufigkeit ausgeben?

Warum erstellst du keine Liste, die Listen enthalten, in denen dann die Werte stehen?
Dann musst du nur anhand der Häufigkeit die du willst eine Liste nehmen, und dann wie gehabt Zufallszahl und irgendwas ausgeben.

Könnte zum Beispiel so aussehen:
(In der Var. "haeufigkeit" die Häufigkeit und das Object was du willst heißt "Image". War jetzt nur irgendwie willkürlich.)

Java:
ArrayList<ArrayList<Image>> lol = new ArrayList<ArrayList<Image>>();
lol.add(new ArrayList<Image>()); //Häufigerkeit unter 5
lol.add(new ArrayList<Image>()); //Häufigerkeit unter 10
lol.add(new ArrayList<Image>()); //Häufigerkeit unter 15
lol.add(new ArrayList<Image>()); //Häufigerkeit ober/gleich 15
//Hier kommt event. Schleifenanfang, Variable wird gesetzt o. Ä.
if(haeufigkeit < 5)
	lol.get(0).add(new Image(haeufigkeit, new Object())); //Häufigkeit und Object
else if(haeufigkeit < 10)
	lol.get(1).add(new Image(haeufigkeit, new Object()));
else if(haeufigkeit < 15)
	lol.get(2).add(new Image(haeufigkeit, new Object()));
else if(haeufigkeit >= 15)
	lol.get(3).add(new Image(haeufigkeit, new Object()));
 
Also ich versteh dich da jetzt nicht so ganz, oder du mich nicht ;).
Problem ist das es theoretisch endlos viele Objekte mit einer willkürlichen relativen Häufigkeit gibt.
Die einzigen Informationen die ich nun zur Verfügung habe, ist
1.) die Summe der Häufigkeiten aller Objekte(Bsp 150) und
2.) die Anzahl der Objekte(Bsp 25).
Von der Summe der Häufigkeiten aller Objekte wird eine zufällige Zahl ermittelt(Bsp 47).

Da die Häufigkeiten relativ sind, muss beim initalisieren zb. nun eine Reichweite(von bis) erstellt werden.
Dh.: Alle zu einer bestimmten Gruppe gehörigen Objekte, werden ausgelesen, aneinandergereiht und bekommen zwei Werte zugewiesen.
object_list[0] -> 0 - 15 (Häufigkeit 16)
object_list[1] -> 16 - 18 (Häufigkeit 2)
usw..
Der Index des Arrays ist den Reichweiten zugeordnet. Sprich niedriger Index bedeutet niedrige Reichweite.

Code:
//pseudocode
$random_number = 47;
for($object : $object_list.values()){
if($object.getVon() >= $random_number && $object.getBis() <= $random_number){
return $object; //wir haben unser zufälliges Objekt erhalten
}
}

Mir liegt jetzt daran dieses Suchen so effizent wie möglich zu gestalten. Man könnte ja auch sagen, wenn meine Zufallszahl in den hinteren Bereich fällt ( in unseren Beispiel zb 149) beginne ich nicht am Anfang bei 0 zu suchen, sondern starte beim vorletzten Objekt der Liste (object_list[23]) und entscheide mich daraufhin ob ich nach oben (meine gesuchte Reichweite ist größer als die von object_list[23]) oder nach unten (-..- kleiner -..-) weiter Suche.
Theoretisch gibt es da sicher noch ein paar weitere Optimierungsmöglichkeiten (zb wie die Objekte geordnert werden, am Anfang sind zb die Objekte mit den größten Reichweiten, am Ende die mit den geringsten)

Meine Frage ist nun ob jemand eine ideale Lösung für dieses Problem kennt, oder ob ich versuchen muss dies selbst zu erarbeiten.
Oder anders gesagt: Wie fische ich am schnellsten aus einem Pool von unterschiedlich häufig vorkommenden Objekten, eines zufällig heraus, wenn mir nur die gesamt Häufigkeit, die Anzahl der Objekte und deren Sortierungsart bekannt sind?

Hoffe ich hab mich verständlicher ausgedrückt^^
lg Katzehuhn
 

Neue Beiträge

Zurück