Algorithmus welcher True-Werte in einem Array findet und auswertet.

snuff

Mitglied
Hallo zusammen.
Ich bräuchte Hilfe bei der Entwicklung eines Algorithmus, welcher nach bestimmten "Muster" in einem boolean Array sucht. Der Algorithmus erhällt Arrays, welche mit true und false Werte gefüllt ist. Dabei stehen im Normalfall mehrere true-Werte hintereinander. Der Algorithmus soll den Index finden, welche dem mittleren Wert der Indizes alles True-Werte entspricht. Hier ein Beispiel:

Code:
boolean array1 = {false, false, false, true, true, true, false, false, false, false, false, false, false, false}

In diesem Fall soll der Algorithmus den Wert 4 ausgeben, da der niedrixte Index mit true 3 und der höchste Index 5 ist. Bei solch einem Beispiel ist das einfach zu realisieren mit folgendem code:

Code:
public int getMiddleTrueIndex(boolean array){
     int minIndex = getLowestTrueIndex(array);
     int maxIndex = getHighestTrueIndex(array);
     return (minIndex+maxIndex)/2;
}

private  int getLowestIndex(boolean[] array) {
         int index = 0;
            for(int i = 0; i < array.length;i++){
                    if(array[i]==true){
                        index = i;
                        return index;
                    }
            }
        return index;
      }

private int getHighestIndex(boolean[] array){
         int index = 0;
            for(int i = array.length-1; i > -1 ;i--){
                    if(array[i]==true){
                        index = i;
                        return index;       
                    }
            }
         return index;
     }

Im Falle das gar kein Index gefunden wird, sprich wenn im Array nur false-Werte stehen, gibt der Algorithmus als Index 0 zurück, was auch so gewollt ist. Dass bei der bestimmung des Mittelwertes manchmal gerundet wird spielt ebenfals keine Rolle.

Nun zum eigentlichen Problem. Der Algorithmus soll auch berücksichtigen können, dass eine bestimmte Anzahl von True-Werten hintereinander stehen muss damit der index "gültig" ist.
Hier ein weiteres Beispiel bei dem wir anehmen, dass die Minimalanzahl 3 beträgt:
Code:
boolean array2 = {false, false, false, true, true, false, false, false, false, false, false, true, true, true}
In diesem Fall müsste der Algorithmus den Wert 12 zurückgeben, da bei Index 3 nicht genügend True-Werte hintereinander stehen.

Als letztes der komplizierteste Fall:
Code:
boolean array2 = {false, false, true, true, true, false, false, false, false, true, true, true, true, false}
Nehmen wir auch hier an die Minimalanzahl an true-Werten wäre 3. In diesem Beispiel wäre dass von Index 2 - 4 und Index 9 - 12 erfüllt. In diesem Fall sollte sich der Algorithmus für einer der beiden True-Folgen entscheiden und entweder 3 oder 10 zurückgeben. Dabei spielt es keine Rolle für Welchen Wert er sich entscheidet, es ist nur wichtig dass sich der Algorithmus immer gleich entscheidet.


Die Erkennung der minimal Benötigten True-Folge habe ich so gelöst:
Code:
public boolean checkMinWidth(boolean[] array, int startIndex, int minWidth){
        boolean check = true;
        for(int i = 0; i < minWidth; i++){
            if(array[startIndex+i] == false){
                check = false;
            }
        }
        return check;
     }

Der StartIndex wird dabei mit der Methode getLowestIndex bestimmt. Im Falle dass die Methode checkMinWidth false zurückgibt, wird der startIndex um 1 erhöht und der Vorgang widerholt. Sobald der Startindex grösser als die Differenz der Arraylänge-minWidth ist, was bedeutet dass der Algorithmus bis fast ans Ende gelaufen ist und nicht genügend true-Folgen gefunden wurden, wird der Vorgang abgebrochen und als Index wird dann wieder 0 zurückgegeben.

Ich scheitere am letzten Punkt bei dem der Algorithmus sowohl die minimale Anzahl an true-Folgen sowie den "Abstand" zwischen mehreren Folgen im gleichen Array berücksichtigen soll.
Sollte jemand eine Lösung haben wäre ich sehr Dankbar.

Hier noch ein paar Beispiele von Arrays und den Werten, welche der Algorithmus liefern sollte:

Minimalwert: 2
Code:
boolean array3 = {false, true, false, true, false, true, false, true, false, true, false, true, false, true}
Ausgabe = 0 (keine Übereinstimmung gefunden)

Minimalwert: 3
Code:
boolean array4 = {false, true, true, false, true, true, false, false, false, false, false, false, false,false ,false }
Ausgabe = 0 (keine Übereinstimmung gefunden)

Minimalwert: 3
Code:
boolean array5 = {false, true, true, true, true, true, false, false, false, true, false, false, true,true,true}
Ausgabe = 3 oder 13
 

stg

Top Contributor
Du kannst einmalig übers Array laufen und dir dabei alle Tupel (startIndex, stopIndex) merken, die solche "true-Sequencen" repräsentieren. Anschließend wertest du dann diese gefundene Menge an Tupeln aus.
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst einmalig übers Array laufen und dir dabei alle Tupel (startIndex, stopIndex) merken, die solche "true-Sequencen" repräsentieren. Anschließend wertest du dann diese gefundene Menge an Tupeln aus.
Wenn ich's richtig verstanden hab, ist nicht mal das nötig, man muss einfach nur die erste, genügend lange, true-Sequent finden und fertig. Das ist kaum mehr als eine Schleife mit einem if...

@snuff, geh noch mal ein paar Schritte zurück und ignorier deinen bisherigen Code und fang noch mal von vorn an, deine bisherigen Ansätze sehen deutlich zu kompliziert aus ;)
 

stg

Top Contributor
Ja, da hast du wohl recht. So genau hab ich die Frage gar nicht durchgelesen. Der letzte Fall sah für mich nur so aus, dass es mehrere "richtige Lösungen" geben kann und diese auch ausgegeben werden sollen. Da aber offenbar doch nur eine beliebige Lösung gesucht wird muss man natürlich einfach nur einmal übers Array rennen, bis man ein Match gefunden hat.
 

snuff

Mitglied
Hallo zusammen

Vielen Dank für die schnellen Antworten.

Bisher bin ich gar nicht auf die Idee gekommen von "einer Seite" durchs Array zu gehen und zu Prüfen ob genügend true-Werte hintereinander stehen, anstatt den niedrigsten und höchsten Index zu suchen und daraus den Mittelwert zu bilden. Ich hab das vorhin in mein Programm implementiert und stosse dabei aber noch auf 2 Probleme.

Erstens soll immer der Mittelwert der gesamten Folge herausgegeben werden. Hier ein Beispiel:
Code:
boolean array5 = {false, true, true, true, true, true, true, true, true, true, false, false, false,false ,false }
Angenommen die eingestellte Minimalanzahl sei wieder 3, dann gibt der Algorithmus im Moment noch den Wert 2 zurück. Korrekterweise sollte er hier aber den Wert 5 ausgeben. Er müsste also noch etwas universeller sein und im Falle eines treffers so lange weiterlaufen bis er auf einen false-Wert trifft.

Ich würde das so realisieren dass ich bei jedem "Treffer" einen Zähler hochzählen lasse und anhand dessen Wert den Index bestimmen. Sobald der erfte false-Wert gefunden wird, wird die Methode verlassen.

Allerdings ergibt sich daraus noch ein weiteres Problem. In seltenen Fällen sieht das übergebene Array so aus:
Code:
boolean array4 = {false, false, false, true, true, true, true, false, true, true, true, true, true,false ,false }
Der Algorithmus würde dann bei Index 3 - 6 einen Treffer finden und danach abbrechen. Der Zurückgegebene Index wäre dann 4.
Wenn bei einer langen Kette nur vereinzelte false-Werte auftauchen sollen diese Ignoriert werden. Dass heisst das gewünschte Ergebnis in diesem Beispiel wäre dann 7.
Bei meiner bisherigen Methode fiel dies nicht auf da ich den "obersten" und "untersten" Treffer genommen habe und diese dan gemittelt habe. Alles was dazwischen war wurde ignoriert.

Im Programm sind die Arrays die ich verarbeite im Schnitt um die 600 Elemente lang. Wenn dann 50 True-Werte hintereinanderkommen und in dieser Folge ein einziger False-Wert ist, dann liegt der zurückgegebene Index weit daneben deben der Mitte dieser nocht ganz perfekten Folge. Deshalb ist es wichtig diese kleinen "Lücken" zu ignorieren. Neben der Minimalanzahl an Folgeelementen würde ich der Methode also noch so was wie eine Maximalgrösse für die Lücke mitgeben.

Danke und mfg
 

stg

Top Contributor
Ohne deinen jetzigen Stand zu kennen ist das natürlich nur geraten, aber:
nicht abbrechen, sobald alle Bedingungen erfüllt sind, sondern erst schauen, wie lang die Folge aufeinanderfolgender trues ist und dann erst prüfen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
K Algorithmus Allgemeine Java-Themen 10
C Algorithmus für Array Allgemeine Java-Themen 9
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J fällt euch ein Algorithmus ein? Allgemeine Java-Themen 4
S Algorithmus für Sudoku Allgemeine Java-Themen 17
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
F Algorithmus für Sortierung gesucht Allgemeine Java-Themen 15
T Algorithmus verbessern Allgemeine Java-Themen 10
U Suche Algorithmus zur bestimmung des längsten Wegs Allgemeine Java-Themen 3
U Ford-Fulkerson Algorithmus gesucht Allgemeine Java-Themen 1
U Dijkstra Algorithmus gesucht Allgemeine Java-Themen 4
D Algorithmus für die Erkennung fehlerhafter Eingaben Allgemeine Java-Themen 4
I hash-algorithmus Allgemeine Java-Themen 9
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben