Si vous êtes un créateur de programme, il est peu probable que vous n'utilisiez pas la comparaison de taille. Parmi eux, il est courant de juger "La valeur $ c $ est-elle comprise entre $ a $ et $ b $?".
Lorsque la relation de grandeur entre $ a $ et $ b $ est inconnue, comment résolvez-vous le problème ci-dessus?
La méthode la plus sensée consiste d'abord à comprendre la relation de grandeur entre $ a $ et $ b $, puis à la comparer avec $ c $.
if a < b:
a < c < b
else:
b < c < a
Eh bien, ce n'est pas très beau. Je ne veux pas utiliser 4 lignes pour cela ...
En regardant ce qui précède, nous pouvons voir que $ c $ est compris entre $ a $ et $ b $ si $ b <c <a $ ou $ a <c <b $ tient. En d'autres termes, si vous l'appelez comme suit, il tiendra sur une seule ligne.
(a < c < b) or (b < c < a)
Ça s'améliore. Cependant, cela a également $ a, b, c $ apparaissant une fois, et cela semble un peu redondant. Avec python, vous pouvez l'écrire si bien, mais avec le langage C, vous devez l'écrire comme suit.
((a < c) && (c < b)) || ((b < c) && (c < a))
Après tout, ce n'est pas beau ...
Alors, j'ai trouvé un moyen d'écrire comme suit.
(a < c) ^ (b < c)
«^» peut ne pas être beaucoup utilisé, mais c'est une somme logique exclusive. Les deux sont True, les deux sont False lorsqu'ils sont False et True lorsque les deux sont True et False.
Cependant, cela a ses inconvénients. La formule ci-dessus est synonyme de la suivante.
(a < c <= b) or (b < c <= a)
Cela ne peut pas être fait comme ʻa <c <b en changeant
<en
> ʻou <=
.
Au fait,
(a <= c) ^ (b <= c)
(a > c) ^ (b > c)
Deux de
(a <= c < b) or (b <= c < a)
Est synonyme de
Je me suis demandé si je pouvais faire ʻa <c <b ou ʻa <= c <= b
, mais j'y ai pensé, mais la méthode suivante est peut-être la plus élégante.
(a - c) * (b - c) < 0
(a - c) * (b - c) <= 0
La première ligne est ʻa <c <b et la deuxième ligne est ʻa <= c <= b
.
Si la valeur est grande, il peut être possible de prendre une fonction de code (bien que le temps de calcul semble être considérablement lent).
J'ai mesuré le temps de calcul de chaque méthode. Le programme a utilisé ce qui suit.
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)
Résultat du calcul
Méthode | Temps de calcul |
---|---|
Méthode 1 | 0.547s |
Méthode 2 | 0.458s |
Méthode 3 | 0.370s |
Méthode 4 | 0.786s |
……。
(a --c) * (b --c) <0
est le résultat le plus lent.
Qu'est-ce qui est plus lent que la méthode 1 ... N'est-ce pas juste magnifique?
Je l'ai essayé plusieurs fois, mais le classement n'a pas changé. Eh bien, après tout, il semble que la multiplication prend du temps. Une autre raison est que et et ou ont la caractéristique d'ignorer les opérations suivantes lorsque False ou True apparaît au milieu.
Je suis déçu que ce soit tout, j'ai donc également vérifié le calcul de l'ensemble du tableau numpy.
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)
Dans numpy, vous ne pouvez pas écrire comme ʻa <c <b. De plus, comme il n'y a pas et, ou, il est nécessaire d'utiliser les opérations logiques
&et
|`.
Le temps de calcul est le suivant.
Méthode | Temps de calcul |
---|---|
Méthode 2 | 0.037s |
Méthode 3 | 0.017s |
Méthode 4 | 0.031s |
Dans ce cas, le résultat était que la multiplication était plus rapide. J'ai réussi à garder mon visage ...
Pour déterminer si c est compris entre a et b, utilisez l'équation suivante.
** Pour une comparaison un par un **
## a < c < b or b < c <Dans le cas d'un
a < c < b or b < c < a
##Quand a ≤ c ≤ b ou b ≤ c ≤ a
a <= c <= b or b <= c <= a
## a < c ≦ b or b <Lorsque c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Dans le cas d'un
(a > c) ^ (b > c)
** Pour le tableau numpy **
## a < c < b or b < c <Dans le cas d'un
(a - c) * (b - c) < 0
##Quand a ≤ c ≤ b ou b ≤ c ≤ a
(a - c) * (b - c) <= 0
## a < c ≦ b or b <Lorsque c ≤ a
(a < c) ^ (b < c)
## a ≦ c < b or b ≦ c <Dans le cas d'un
(a > c) ^ (b > c)
Recommended Posts