Forum:  Algorithmen / Datenstrukturen
Thema: Binäre Suche Unsortiertes Feld
Themen-Übersicht
qwert12
Neu
Dabei seit: 23.06.2020
Mitteilungen: 3
Aus:
Themenstart: 2020-06-23 23:55

Hallo!

Ich hatte neulich an der Uni eine Prüfung über Algorithmen, leider kam aber niemand den ich kenne und ich auch nicht auf eine Lösung zu folgendem Problem. Daher würde ich aus Interesse um eure Hilfe bitten:

Angabe:

Gegeben ist ein unsortiertes Integer Array.

Mittels Binärer Suche sollen lokale Maxima gefunden werden.
Folgende Kriterien:

.) Die Funktion soll ein(!) beliebiges lokales Maximum zurückliefern, nicht alle!
.) Lösung mittels Rekursion und ohne möglich.
.) Gibt es nur einen Nachbarn, so ist mit diesem zu vergleichen.
.) Bei gleich großen Nachbarn, gelten beide als lokale Maxima und eines soll zurückgegeben werden.
.) Das Feld darf nicht sortiert werden.


Nun weiß ich, wie ich iterativ mittels Schleife das ganze absuchen würde, komme aber nicht drauf, wie und warum das mittels binärer Suche gehen sollte bzw. auch Sinn macht.

Braucht eine binäre Suche nicht ein sortiertes Array (das bei obiger Aufgabe natürlich komplett sinnfrei wäre)?

Bitte um euren Rat!

Vielen herzlichen Dank!

Liebe Grüße


tactac
Senior
Dabei seit: 15.10.2014
Mitteilungen: 1882
Aus:
Beitrag No.1, eingetragen 2020-06-24 14:33

Hallo qwert12!
Willkommen auf dem Matheplaneten.

Der Algorithmus soll ein *lokales* Maximum finden (wobei die globalen Ränder als lokales Maximum zählen, wenn sie größer oder gleich ihrem Nachbarn sind, und bei zwei gleichen benachbarten Elementen dieses auch als lokales Maximum zählt, wenn ich die Aufgabe richtig verstanden habe).

Überlege dir folgendes:

1) Hat das Array keine Ränder, dann gibt es nur dann kein lokales Maximum, wenn die Differenzen zwischen Nachbarn erst negativ (0mal ist auch erlaubt) und dann positiv (0mal ist auch erlaubt) sind.
2) Nun hat das Array aber Ränder. Und ist am linken Rand die Differenz negativ oder 0, befindet sich dort schon ein lokales Maximum. Analog für den rechten Rand.

Irgendwie scheint es also sinnvoll zu sein, die Nachbardifferenzen zu betrachten und möglicherweise ist eine passende Invariante: am linken Rand ist sie positiv, am rechten negativ. Diese hilft dann auch dabei, die richtige Hälfte bei der binären Suche auszuwählen.

Irgendwann treffen die Ränder aufeinander (wenn man nicht durch Zufall vorher ein lokales Maximum gefunden hat), und dort sollte dann ein lokales Maximum sein.


qwert12
Neu
Dabei seit: 23.06.2020
Mitteilungen: 3
Aus:
Beitrag No.2, vom Themenstarter, eingetragen 2020-06-24 14:53

Vielen Dank für die Antwort!

Was genau meinst du mit Ränder? Jeder Array hat doch Ränder sonst wäre es ja unendlich? Oder meinst du die Teil Arrays die jeweils untersucht werden?

Wie jeweils das lokale Maximum definiert ist, ist mir wie gesagt schon klar. Jedoch würde bei sowas binäre Suche Sinn machen, wenn das Array ungeordnet bleibt? Binäre Suche ist ja für geordnete Arrays gedacht wenn ich das richtig verstanden habe oder?

Wenn ja, wie würde das mit binärer Suche hier gehen?



tactac
Senior
Dabei seit: 15.10.2014
Mitteilungen: 1882
Aus:
Beitrag No.3, eingetragen 2020-06-24 15:03

Wäre das Array aufsteigend sortiert, wären lokalen Maxima viel zu leicht zu finden: ganz rechts zum Beispiel ist definitiv eins. Daher ist es schon sinnvoll, dass das Array in der Aufgabe nicht sortiert ist.

Binäre Suche bedeutet für mich vor allem, dass der Algorithmus regelmäßig ungefähr die Hälfte des noch vorhandenen Suchraums aus der weiteren Betrachtung aussortiert, und das nur unter Betrachtung der "Mitte".

Der von mir bereits angedeutete Algorithmus sollte funktionieren.


qwert12
Neu
Dabei seit: 23.06.2020
Mitteilungen: 3
Aus:
Beitrag No.4, vom Themenstarter, eingetragen 2020-06-24 21:19

Das wäre genau das was ich meine: Aufsteigend wäre das Array komplett sinnlos weil ja dann die ganze Berg und Talfahrt verloren geht und man auch ohne Algorithmus einfach sagen kann, dass das lokale Maximum rechts außen ist ;)

Bei der binären Suche hab ich das auch so verstanden dass die regelmäßig einen Teil wegschneidet der irrelevant ist. Ich verstehe den binären Such Algorithmus nach diesem Modell hier:

javabeginners.de/Algorithmen/Suchalgorithmen/Binaere_Suche.php

Die Prüfungs-Angabe verlangte aber, dass wir das unsortierte Array durchsuchen, komplett(!), und das erste lokale maximum zurückgeben => also nix wegschneiden. TROTZDEM aber ZWINGEND den binnären Algorithmus nehmen.

Kann man das dann überhaupt? Wäre das sinnvoll? Bzw. wie würde das gehen?
Quasi: Wie mach ich einen binären Algorithmus, wo ich nicht wegschneide?

Vielen Dank schon mal!


tactac
Senior
Dabei seit: 15.10.2014
Mitteilungen: 1882
Aus:
Beitrag No.5, eingetragen 2020-06-24 21:37

Die Aufgabenstellung, die du gepostet hast, verlangt nur *irgendein* *lokales* Maximum.
Für das Array [0,1,2,3,3,5,10,8,6,4,4,7] darf 3, 10, 4 oder 7 zurückgegeben werden.

Folgender Code müsste funktionieren, und man sieht offensichtlich, dass da, wenn noch nichts gefunden wurde, eine Hälfte des Suchbereichs weggeworfen wird.
Python
def local_max_idx(a):
    lo = 0
    hi = len(a)-1
    if lo >  hi: raise IndexError("No max_idx")
    if lo == hi: return lo
 
    if a[lo+1] <= a[lo]: return lo
    if a[hi-1] <= a[hi]: return hi
 
    while True:
        mid = (lo+hi)//2
        if a[mid-1] == a[mid]: return mid
        if a[mid+1] == a[mid]: return mid
        if a[mid-1] < a[mid] and a[mid+1] < a[mid]: return mid
        if a[mid-1] > a[mid]:
            hi = mid
        elif a[mid+1] > a[mid]:
            lo = mid
        else:
            raise Exception("Huh!?")
 
def local_max(a):
    return a[local_max_idx(a)]




Dieses Forumbeitrag kommt von Matroids Matheplanet
https://https://matheplanet.de

Die URL für dieses Forum-Thema ist:
https://https://matheplanet.de/default3.html?topic=248311=5103
Druckdatum: 2020-11-26 10:41