Seite 1 von 1

Algorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 22:20
von mathman
Guten Abend :)

folgendes Problem,
ich habe ein Array welches meine X-Werte enthält also z.B.
[0,0.25,0.5,0.75,1.0,1.25 ...]

Dann habe ich einen Wert z.B. 0.6. Jetzt möchte ich die Stelle von dem X Array wissen die am nächsten dran ist. Also hier wäre es die 3. mit dem Index 2

Leider fällt mir kein Lösungsschema dafür ein, welches mit allen Werten funktionieren würde :(
Kann mir jemand einen Ansatz geben ?

Gruß

Re: Alorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 22:30
von syntor

Code: Alles auswählen

>>> werte = [0, 0.25, 0.5, 0.75, 1.0]
>>> werte.index(min(werte, key=lambda x: abs(x - 0.6)))
2

Re: Alorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 22:37
von cofi
Also bei dem Titel solltest du nochmal nacharbeiten ...

Mal als Denkanstoss (nimmt die Zahl, die am nahesten ist, ist aber steuerbar durch das lambda):

Code: Alles auswählen

In [20]: import operator

In [21]: import itertools

In [22]: cur_pos = 0.6

In [23]: a = [0,0.25,0.5,0.75,1.0,1.25]

In [24]: b = map(lambda x: abs(cur_pos - x), a)

In [25]: c = zip(b, itertools.count(0))

In [26]: min(c, key=operator.itemgetter(0))
Out[26]: (0.099999999999999978, 2)

In [27]: a[_[1]]
Out[27]: 0.5

Re: Alorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 22:43
von mushroom
Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden

0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3

Re: Alorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 23:03
von syntor
mushroom hat geschrieben:Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden

0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
Kannst du mir erlären, was du hier genau machst?

Re: Alorythmus zum Stellensuchen

Verfasst: Montag 7. März 2011, 23:10
von mushroom
syntor hat geschrieben:Kannst du mir erlären, was du hier genau machst?
Steht ja eigentlich schon da.
Die x-Werte in der Liste haben einen konstanten Abstand, hier 0.25.
Den Wert, hier 0.6, dividiere ich gerade durch diesen Abstand, ergibt 0.6/0.25 = 2.4.
Ist die erste Dezimalstelle kleiner 5, liefert Abrunden des vorigen Ergebnisses den gesuchten Index, also 4<5 -> 2.4 = 2.
Ist die erste Dezimalstelle größer/gleich 5, liefert Aufrunden den gesuchten Index. Beispiel:
0.63/0.25 = 2.52 -> 3
Hat der Wert den gleichen Abstand zu zwei benachbarten x-Werten, muß man sich natürlich entscheiden, on Auf- oder Abrunden:
0.625/0,25 = 2.5 -> 3 (nach obiger Beschreibung)


Nachtrag: Sehe gerade, daß meinem vorherigen Beitrag statt

0.3/0.25 -> 3

dies

0.63/0.25 -> 3

hätte stehen müssen.

Nachtrag 2: Dein bereits in Python umgesetzter Ansatz sieht aber auch ganz gut aus. Hatte den erst jetzt gesehen, nachdem ich meinen ersten Beitrag gepostet habe. Das kommt davon, wenn man zuviel Tabs gleichzeitig öffnet :-)
Würde jetzt aber mit meinen laienhaften Kenntnissen sagen, daß man bei deiner Umsetzung die Art der Rundung (kaufmännisch, mathematisch) nicht beeinflussen kann. Lasse mich aber gerne eines Besseren belehren.

Re: Alorythmus zum Stellensuchen

Verfasst: Dienstag 8. März 2011, 09:32
von Rekrul
Also runden willst du :wink:

Code: Alles auswählen

>>> round(0.6/0.25)
2.0
>>> round(0.63/0.25)
3.0

Re: Alorythmus zum Stellensuchen

Verfasst: Dienstag 8. März 2011, 10:27
von EyDu
Das bisect-Modul könnte hier auch hilfreich sein.

Re: Algorythmus zum Stellensuchen

Verfasst: Dienstag 8. März 2011, 18:02
von numerix
EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Was natürlich eine Ordnung der Werte voraussetzt ...
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...

Re: Algorythmus zum Stellensuchen

Verfasst: Dienstag 8. März 2011, 18:16
von EyDu
numerix hat geschrieben:
EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Was natürlich eine Ordnung der Werte voraussetzt ...
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...
Ich gehe davon aus, dass jemand die Dokumentation zu einem Modul liest, bevor er es verwendet. Dann soll der OP selber entscheiden, ob es passt oder nicht.

Re: Algorythmus zum Stellensuchen

Verfasst: Mittwoch 9. März 2011, 09:32
von mathman
Vielen Dank für die Antworten.
Die Werte sind in dem Array geordnet.
Werde nun die Lösungen aus einander nehmen um
zu schauen wie diese funktionieren :)

Re: Algorythmus zum Stellensuchen

Verfasst: Mittwoch 9. März 2011, 13:54
von numerix
Wenn nun auch die Abstände - wie in dem Beispiel - immer gleich sind, kannst du den gesuchten Wert über eine direkte Berechnung ermitteln - das wäre dann am effizientesten.
Falls die Abstände nicht gleich sind, ist der Hinweis von EyDu der entscheidende.