Algorithmus zum entmischen einer Zahlenfolge

BlackParrot

Mitglied
Hallo zusammen,
leider weiß ich nicht, ob ich hier richtig bin, aber leider komme ich bei einem Problem nicht weiter:Ich habe eine Frage zu folgendem Algorithmus:

Code:
Mischen(Feld A)
    n1 = ⌊(A.länge + 1)/2⌋
    n2 = A.länge − n1
    L = neues Feld[1..n1]
    R = neues Feld[1..n2]
    L[1..n1] = A[1..n1]
    R[1..n2] = A[n1 + 1..A.length]
    i=j=1
    für k = 1 bis A.length mache {
        b = Random(0,1)
        wenn(b==0 und i≤n1) oder j>n2 dann {
            A[k] = L
            i=i+1
}
        sonst {
            A[k] = R[j]
            j=j+1
}
}

Ich habe ein sortierte Feld A, auf das nur 1x obiger Misch-Algorithmus angewendet wurde.
Jetzt ist es meine Aufgabe, einen vergleichsbasierten Algorithmus zu entwerfen, der in linearer Laufzeit dieses einmal gemischte Feld wieder (rück-)sortiert.

Leider komme ich hier nicht weiter. Kann mir vielleicht jemand einen Tipp geben?

Vielen Dank!
 
Zuletzt bearbeitet von einem Moderator:

mariane

Mitglied
Die ersten zwei Codezeilen sind so nicht direkt auf Java übertragbar, nur als Tipp. Dann wären nämlich n1 und n2 vom Zahlenwert her identisch. Beachte dabei auch das L-ähnliche Symbol links und rechts (gespiegelt), die haben eine spezielle Bedeutung.
Unabhängig davon kann Codezeile 6 nicht korrekt sein, weder in Java noch in irgendeiner anderen Programmiersprachen, da knallt es einfach.

Versuche aber durchaus dahinter zu kommen, was hier passieren soll und setze das mal Java-Konform um und passe dabei vorallem bei den Indizes auf.

Ansonsten kann ich mir gut vorstellen was da passieren soll und kann dir versichern, das es kein besonderen Algorithmus geben wird, der das wieder in die richtige Reihenfolge bringt, es sei denn du nimmst Monkey-Sort (Bogo-Sort). Nein, ernsthaft, jeder bekannter Sortieralgorithmus ob Bubblesort oder Quicksort oder oder wäre eine Lösung für das Problem hier.
 

BlackParrot

Mitglied
Hallo zusammen,

ja meine Code soll nur Pseudocode sein.
Wir können uns das ja vorstellen, als wäre Fels A ein Kartenstapel:
Ein Kartenstapel wird zuerst in der Mitte geteilt
(falls A.length gerade: zwei gleich große Stapel; falls A.lenght ungerade:
Stapel L um 1 größer als Stapel R -> Abrundungsklammern);
Nun werden die Stapel von oben nach unten durchgegangen:
Wenn der Zufallszahlengenerator die Zahl 0 ausgibt (Wahrscheinlichkeit = 0,5)
und es noch Karten im Stapel L gibt (i<= n1) oder es keine Karten mehr im
Stapel R gibt (j > n2), wie die oberste Karte von Stapel L weggenommen.
Wenn hingegen die Zufallszahl 1 ist und der Stapel R noch nicht leer ist
oder wenn der Stapel L bereits leer ist, wird vom Stapel R eine Karte genommen
und auf die bereits weggenommenen Karten gelegt, sodass diese
gemischt werden.

Was der Misch-Algo macht, ist mir prinzipiell klar und ich kann das auch mit Beispielfeldern durchgehen.
Die Aufgabe ist es nun aber, einen vergleichsbasierten Sortieralgorithmus zu entwerfen, der ein Feld, das zuvor sortiert war und auf das dann nur einmal der obere Algorithmus angewendet wurde, wieder zu sortieren. Und das soll in linearer Zeit geschehen. vergleichsbasierten Sortieralgorithmen (wie auch Quicksort) brauchen ja mindestens nlogn als Laufzeit. Diesen Spezialfall eines "unsortierten" Felds kann man scheinbar aber mit einem speziellen Algorithmus in linearer Zeit sortieren.
 

DrZoidberg

Top Contributor
Du musst den Mischalgorithmus im Grunde nur umkehren. Du hast dann also wieder zwei Felder L und R.
Du weißt, dass alle Elemente in R grösser oder gleich sämtlichen Elementen in L sein müssen.
Du gehst jetzt alle Elemente von A der Reihe nach durch. Wenn das aktuelle Element >= dem letzten Element von R ist, muss das Element aus A an R angehängt werden, andernfalls an L.
Am Schluss musst du nur noch L und R wieder nach A zurückkopieren.
Das einzige Problem dabei ist, dass R anfangs noch leer ist. Deshalb musst du erst einmal A so lange durch gehen, bis das aktuelle Element kleiner ist als das vorangegangene. Jetzt kannst du die nicht passenden Elemente nach R verschieben und dann mit dem zuvor genannten Algorithmus den Rest auf die beiden Felder verteilen.
Verwendest du Java um deinen Algorithmus zu testen?
 

BlackParrot

Mitglied
Hallo DrZoidberg, deine Idee hört sich für mich logisch und richtig an. Ich habe nur ein Verständnisproblem:
Jetzt kannst du die nicht passenden Elemente nach R verschieben
Meinst Du damit, dass ich am Anfang das Feld so lange durchgehe, bis A[i ]<A[i-1]. Sobald das gilt, schreibe ich A[i ] in R[1] und mache dann mit dem von dir zuerst genannten Algorithmus weiter. Habe ich das so richtig verstanden? Oder was genau meinst du mit den "nicht passenden Elementen"?
Vielen Dank für Deine Hilfe!
 

DrZoidberg

Top Contributor
Fast richtig. Wenn A[i ] < A[i-1] kopierst du nicht A[i ] nach R, sondern A[i'] bis A[i-1], wobei i' kleiner ist als i und A[i'] das erste Element von A, das grösser ist als A[i ]. Die Elemente vor A[i'] müssen nach L kopiert werden.
 
Zuletzt bearbeitet:

BlackParrot

Mitglied
Okay, danke! Ich stehe glaube ich gerade auf dem Schlauch, denn ich kann mir gerade nicht vorstellen, wie ich diesen Kopiervorgang in Pseudocode (oder Java) schreiben könnte. Das andere ist mir alles klar, aber könntest du mir vielleicht die ersten Zeilen vorgeben? Den Rest kann ich dann vervollständigen.
 

DrZoidberg

Top Contributor
Hier ist mal die erste Hälfte des Entmisch Algorithmus in Pseudocode.
Code:
Entmischen(Feld A)
    L = neues Feld[1..A.length]
    R = neues Feld[1..A.length]
    k=2
    while(k <= A.length und A[k] >= A[k-1]) {
      k++
    }
    wenn(k > A.length) {
      return; // A ist schon sortiert
    }
    i = k - 1
    while(i > 1 und A[i-1] > A[k]) {
      i--;
    }
    L[1..i-1] = A[1..i-1]
    R[1..k-i] = A[i..k-1]
    j = k-i+1
    // jetzt ist i gleich der "Länge" von L plus 1 und
    // j ist gleich der "Länge" von R plus 1
 

BlackParrot

Mitglied
Entmischen(Feld A)
Java:
    L = neues Feld[1..A.length]
    R = neues Feld[1..A.length]
    k=2
    while(k <= A.length und A[k] >= A[k-1]) {
      k++
    }
    wenn(k > A.length) {
      return; // A ist schon sortiert
    }
    i = k - 1
    while(i > 1 und A[i-1] > A[k]) {
      i--;
    }
    L[1..i-1] = A[1..i-1]
    R[1..k-i] = A[i..k-1]
    j = k-i+1
    // jetzt ist i gleich der "Länge" von L plus 1 und
    // j ist gleich der "Länge" von R plus 1

    k = i
    while (k <= A.length) {
      if A[k] >= R[j] then {
        R[j+1] = A[k]
        j++
        k++
      } else {
        L[i ] = A[k]
        i++
        k++
      }
    }
    for n = 1 to i -1 do {
      A[n] = L[n]
    }

    for n = i to j-1 do {
      A[i-1+n] = R[n]
    }
}


Habe ich das einigermaßen richtig gemacht?
 
Zuletzt bearbeitet von einem Moderator:

DrZoidberg

Top Contributor
Du musst dich entscheiden, ob i und j jeweils der momentanen Länge von L und R entsprechen oder der Länge plus 1. Ausserdem solltest du k nicht auf i setzen. k hatte schon den richtigen Wert (die aktuelle Position in A).
 

BlackParrot

Mitglied
Achso, also dann:

Entmischen(Feld A)
Code:
L = neues Feld[1..A.length]
R = neues Feld[1..A.length]
k=2
while(k <= A.length und A[k] >= A[k-1]) {
   k++
}
wenn(k > A.length) {
   return; // A ist schon sortiert
}
i = k - 1
while(i > 1 und A[i-1] > A[k]) {
   i--;
}

L[1..i-1] = A[1..i-1]
R[1..k-i] = A[i..k-1]
j = k-i+1
// jetzt ist i gleich der "Länge" von L plus 1 und
// j ist gleich der "Länge" von R plus 1

while (k <= A.length) {
   if A[k] >= R[j-1] then {
     R[j] = A[k]
     j++
     k++
   } else {
     L[i ] = A[k]
     i++
     k++
   }
}
for n = 1 to i -1 do {
   A[n] = L[n]
}

for n = i to j-1 do {
   A[i-1+n] = R[n]
}

Habe ich die Indizes jetzt richtig gesetzt oder ist da immer noch ein Denkfehler von mir drin?
PS: Danke für Dein Durchhaltevermögen, leider habe ich für diese Indizes kein Gefühl...
 
Zuletzt bearbeitet von einem Moderator:

BlackParrot

Mitglied
Oh ja, das war noch ein alter Gedankengang ...
Es müsste doch so heißen, oder?

Java:
for n = 1 to j-1 do {
A[i-1+n] = R[n]
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
S Problem mit einem rekursivem FloodFill Algorithmus Java Basics - Anfänger-Themen 62
B Algorithmus Square und Multiply Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D Frage Boyer-Moore Algorithmus Java Basics - Anfänger-Themen 7
M Komplexität Algorithmus Java Basics - Anfänger-Themen 8
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
B Code Verständnisfragen - FLoyd Warshall Algorithmus Java Basics - Anfänger-Themen 1
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
T Algorithmus zur Überprüfung eines binären Suchbaums Java Basics - Anfänger-Themen 2
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
L Frage zu BubbleSort Algorithmus Java Basics - Anfänger-Themen 2
B gibt es ein Stundenplan-Algorithmus? Java Basics - Anfänger-Themen 11
O Algorithmus-Problem Java Basics - Anfänger-Themen 5
P Euklidischer Algorithmus Java Basics - Anfänger-Themen 9
L Greates Commong Dividend - euklidischer Algorithmus, modulos not positive Java Basics - Anfänger-Themen 5
J Euklidischer Algorithmus Java Basics - Anfänger-Themen 1
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
M Dijkstras Algorithmus Java Basics - Anfänger-Themen 5
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
C Ideen für einen Algorithmus Java Basics - Anfänger-Themen 1
F Best Practice Algorithmus optimieren - Binaeruhr Java Basics - Anfänger-Themen 2
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
L Welcher Algorithmus ist das ? Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
O Java Zufalls-Verteil-Algorithmus Java Basics - Anfänger-Themen 3
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
C Sortieren ohne Algorithmus Java Basics - Anfänger-Themen 8
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
A Text Verschriebung/Algorithmus(?) Java Basics - Anfänger-Themen 8
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
U Peterson Algorithmus Java Basics - Anfänger-Themen 13
algebraiker Collections Bräuchte Hilfe bei dem Algorithmus - LinkedHashMap Java Basics - Anfänger-Themen 2
S A* Path Algorithmus in Java schon vorhanden Java Basics - Anfänger-Themen 3
S Bubble Sort Algorithmus Java Basics - Anfänger-Themen 3
N Unerklärlich: Rekursiver Algorithmus gibt falschen Datentyp zurück... Java Basics - Anfänger-Themen 4
S Algorithmus (Programmablaufplan) Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben