Wenn Sie ein Programmierer sind, ist es unwahrscheinlich, dass Sie keinen Größenvergleich verwenden. Unter ihnen ist es üblich zu beurteilen, ob der Wert $ c $ zwischen $ a $ und $ b $ liegt.
Wie lösen Sie das obige Problem, wenn die Größenbeziehung zwischen $ a $ und $ b $ unbekannt ist?
Die sinnvollste Methode besteht darin, zuerst die Größenbeziehung zwischen $ a $ und $ b $ zu verstehen und sie dann mit $ c $ zu vergleichen.
if a < b:
a < c < b
else:
b < c < a
Nun, es ist nicht sehr schön. Ich möchte dafür keine 4 Zeilen verwenden ...
Wenn wir uns das Obige ansehen, können wir sehen, dass $ c $ zwischen $ a $ und $ b $ liegt, wenn entweder $ b <c <a $ oder $ a <c <b $ gilt. Mit anderen Worten, wenn Sie es wie folgt aufrufen, passt es in eine Zeile.
(a < c < b) or (b < c < a)
Es wird besser. Dies hat jedoch auch $ a, b, c $ einmal und es fühlt sich ein bisschen überflüssig. Mit Python können Sie es so schön schreiben, aber mit C-Sprache müssen Sie es wie folgt schreiben.
((a < c) && (c < b)) || ((b < c) && (c < a))
Immerhin ist es nicht schön ...
Also habe ich mir eine Möglichkeit ausgedacht, wie folgt zu schreiben.
(a < c) ^ (b < c)
^
kann nicht viel verwendet werden, aber es ist eine exklusive logische Summe.
Beide sind wahr, beide sind falsch, wenn sie falsch sind, und wahr, wenn die beiden wahr und falsch sind.
Dies hat jedoch seine Nachteile. Die obige Formel ist gleichbedeutend mit der folgenden.
(a < c <= b) or (b < c <= a)
Dies kann nicht wie "a <c <b" durch Ändern von "<" in ">" oder "<=" erfolgen.
Apropos,
(a <= c) ^ (b <= c)
(a > c) ^ (b > c)
Zwei von
(a <= c < b) or (b <= c < a)
Ist gleichbedeutend mit
Ich fragte mich, ob ich irgendwie "a <c <b" oder "a <= c <= b" machen könnte, aber ich dachte darüber nach, aber die folgende Methode könnte die eleganteste sein.
(a - c) * (b - c) < 0
(a - c) * (b - c) <= 0
Die erste Zeile ist "a <c <b" und die zweite Zeile ist "a <= c <= b". Wenn der Wert groß ist, kann möglicherweise eine Codefunktion verwendet werden (obwohl die Berechnungszeit erheblich langsam zu sein scheint).
Ich habe die Berechnungszeit jeder Methode gemessen. Das Programm verwendete Folgendes.
import time
import numpy as np
n = 100
number1 = np.random.rand(n)
number2 = np.random.rand(n)
t1 = time.time()
for j in range(10000):
for i in range(n):
if number1[i] < number2[i]:
x = number1[i] < 0.5 < number2[i]
else:
x = number1[i] < 0.5 < number2[i]
t2 = time.time()
t = t2-t1
print(t)
t1 = time.time()
for j in range(10000):
for i in range(n):
x = (number1[i] < 0.5 < number2[i]) or (number1[i] < 0.5 < number2[i])
t2 = time.time()
t = t2-t1
print(t)
t1 = time.time()
for j in range(10000):
for i in range(n):
x = (number1[i] < 0.5) ^ (number2[i] < 0.5)
t2 = time.time()
t = t2-t1
print(t)
t1 = time.time()
for j in range(10000):
for i in range(n):
x = (number1[i] - 0.5) * (number2[i] - 0.5) < 0
t2 = time.time()
t = t2-t1
print(t)
Berechnungsergebnis
Methode | Berechnungszeit |
---|---|
Methode 1 | 0.547s |
Methode 2 | 0.458s |
Methode 3 | 0.370s |
Methode 4 | 0.786s |
……。
(a - c) * (b - c) <0
ist das langsamste Ergebnis.
Was ist langsamer als Methode 1 ... Ist es nicht einfach schön?
Ich habe es mehrmals versucht, aber das Ranking hat sich nicht geändert. Schließlich scheint die Multiplikation Zeit zu brauchen. Ein weiterer Grund ist, dass und und oder die Eigenschaft haben, nachfolgende Operationen zu ignorieren, wenn False oder True in der Mitte erscheint.
Ich bin enttäuscht, dass dies alles ist, deshalb habe ich auch die Berechnung des gesamten Numpy-Arrays überprüft.
import time
import numpy as np
n = 100
number1 = np.random.rand(n)
number2 = np.random.rand(n)
t1 = time.time()
for j in range(10000):
x = ((number1 < 0.5) & ( 0.5 < number2)) | ((number1 < 0.5) & (0.5 < number2))
t2 = time.time()
t = t2-t1
print(t)
t1 = time.time()
for j in range(10000):
x = (number1 < 0.5) ^ (number2 < 0.5)
t2 = time.time()
t = t2-t1
print(t)
t1 = time.time()
for j in range(10000):
x = ((number1 - 0.5) * (number2 < 0.5) < 0)
t2 = time.time()
t = t2-t1
print(t)
In numpy können Sie nicht wie "a <c <b" schreiben. Da es kein und oder gibt, müssen die logischen Operationen &
und|
verwendet werden.
Die Berechnungszeit ist wie folgt.
Methode | Berechnungszeit |
---|---|
Methode 2 | 0.037s |
Methode 3 | 0.017s |
Methode 4 | 0.031s |
In diesem Fall war das Ergebnis, dass die Multiplikation schneller war. Ich habe es geschafft, mein Gesicht zu behalten ...
Verwenden Sie die folgende Gleichung, um festzustellen, ob c zwischen a und b liegt.
** Zum Einzelvergleich **
## a < c < b or b < c <Im Fall von a
a < c < b or b < c < a
##Wenn a ≤ c ≤ b oder b ≤ c ≤ a ist
a <= c <= b or b <= c <= a
## a < c ≦ b or b <Wenn c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Im Fall von a
(a > c) ^ (b > c)
** Für numpy Arrays **
## a < c < b or b < c <Im Fall von a
(a - c) * (b - c) < 0
##Wenn a ≤ c ≤ b oder b ≤ c ≤ a ist
(a - c) * (b - c) <= 0
## a < c ≦ b or b <Wenn c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Im Fall von a
(a > c) ^ (b > c)
Recommended Posts