Such-/Vergleich-Algorithmus gesucht

Anfängerfragen zum Programmieren mit PureBasic.
spider84
Beiträge: 76
Registriert: 05.03.2008 03:06

Such-/Vergleich-Algorithmus gesucht

Beitrag von spider84 »

Gegeben ist ein Array(100) mit verschiedenen Helligkeitswerten als c.
Beispiel: meinArray(65)=33 -> Pixel 65 hat Helligkeit 33.

Nun habe ich in einer anderen Variable einen Wert wie 55 und suche, welcher Array-Wert am nähesten ist. Ich suche quasi das Pixel zu meiner Helligkeit.
Wenn jemand einen guten Suchalgorithmus für sowas kennt, dann her damit!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Code: Alles auswählen

minAbstand = #MAXLONG
For n = 0 To 100
 Abstand = Abs(meinArray(n)-meinWert) 
 If Abstand < minAbstand :
  minAbstand = Abstand 
  ArrayFeld = n
 EndIf
Next
Das vergleich jeden ArrayFeldWert mit deinem Wert und merkt sich den kleinsten Abstand. und am ende hast du dann dein ArrayFeld
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
spider84
Beiträge: 76
Registriert: 05.03.2008 03:06

Beitrag von spider84 »

hmm, das hat einen hohen Aufwand. danke schonmal.
vlt überlege ich mir noch ein verfahren dass mir die liste sortiert, aber dafür muss es wohl ein 2dimensionales array werden damit die indizes nicht verloren gehen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Warum ein hoher Aufwand?

Die Laufzeit ist O(n).

Aber wenn die Werte in deinem Array sortiert sind, kannst du natürlich durch
einen angepassten QuickSort den gesuchten Wert mit O(log(n)) finden.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

was rein garnichts bringen würde, weil er schließlich die sortierung nur für diese suche durchführen würde.

und sortierung + optimierte suche dauert bestimmt mindestens so lange wie normale suche
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Aber wenn die Werte in deinem Array sortiert sind
Nic meinte ja den Fall, dass die Werte schon sortiert vorliegen. Dann kann man das Verfahren auf log(n) Suchschritte beschleunigen, indem man z.B. die binäre Suche leicht modifiziert.

Das Sortieren dauert definitiv schon länger als die lineare Suche wie in stargates Beispiel.
!UD2
spider84
Beiträge: 76
Registriert: 05.03.2008 03:06

Beitrag von spider84 »

ah, da hatten wohl noch mehr leute hier informatik erstes semester.*würg*
die sache ist, dass ich für mehrere pixel die helligkeit mit dem array abgleiche - somit hätt zwar mit quicksort im besten fall O(log n) zusätzlichen aufwand zum suchen, aber 100*n ist weniger als 100*(log n).

nur so nebenbei: gibts für trackbar ein change-event bzw. irgendwelche anderen?
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

100*n > 100*(log n) für alle n>0
:wink:
Aber iss klar, was du meinst.

[edit]
Folgender Code erzeugt bei mir (unter Linux) bei jeder Änderung des Trackbars ein #PB_Event_Gadget - Event.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 300, 40, "TrackBarGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    TrackBarGadget(1, 5,  5, 290, 20, 0, 10000)
    Repeat 
    event = WaitWindowEvent()
    If event = #PB_Event_Gadget And EventGadget() = 1
     Debug "Moved"
   EndIf
   Until event = #PB_Event_CloseWindow
EndIf
[/edit]
!UD2
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Diese Art zu suchen, also das ähnlichste Element, nennt sich "Nearest Neighbour", vielleicht kannst Du mit diesem Stichwort ja irgendwo noch andere gute Ansätze finden.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

STARGÅTE hat geschrieben:

Code: Alles auswählen

minAbstand = #MAXLONG
For n = 0 To 100
 Abstand = Abs(meinArray(n)-meinWert) 
 If Abstand < minAbstand :
  minAbstand = Abstand 
  ArrayFeld = n
 EndIf
Next
Das vergleich jeden ArrayFeldWert mit deinem Wert und merkt sich den kleinsten Abstand. und am ende hast du dann dein ArrayFeld
Nicht vergessen: Wenn der Abstand sowieso =1 (minimalster abstand) oder <1 (identisch) ist, dann die SUche mit Break abbrechen, um noch mal eine ordentliche Portion Zeit zu sparen!!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten