Matroids Matheplanet Forum Index
Moderiert von matroid
Informatik » Algorithmen / Datenstrukturen » Binäre Suche Unsortiertes Feld
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Binäre Suche Unsortiertes Feld
qwert12
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.06.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-06-23


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



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1880
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-06-24


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.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
qwert12
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.06.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-06-24


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?




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1880
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-06-24


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.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
qwert12
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.06.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2020-06-24


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:



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!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 1880
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-06-24


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)]



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
qwert12 hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]