web-dev-qa-db-fra.com

Que signifient ces notations entre crochets et parenthèses [premier1, dernier1)?

J'ai vu des tranches de nombres représentées par [first1,last1) et [first2,last2).

J'aimerais savoir ce que signifie une telle notation.

104
Nav

Un crochet signifie que la fin de la plage est inclusif - il comprend l'élément répertorié. Une parenthèse signifie que la fin est exclusif et ne contient pas l'élément indiqué. Donc pour [first1, last1), la plage commence par first1 (et l’inclut), mais se termine juste avant last1.

En supposant que les entiers:

  • (0, 5) = 1, 2, 3, 4
  • (0, 5] = 1, 2, 3, 4, 5
  • [0, 5) = 0, 1, 2, 3, 4
  • [0, 5] = 0, 1, 2, 3, 4, 5
170
Michael Mrozek

C'est un intervalle mi-ouvert .

  • Un intervalle fermé [a,b] inclut les points finaux.
  • Un intervalle ouvert (a,b) les exclut .

Dans votre cas, le point final au début de l'intervalle est inclus, mais la fin est exclue. Cela signifie donc que l'intervalle "first1 <= x <last1".

Les intervalles de demi-ouverture sont utiles en programmation car ils correspondent à l'idiome commun pour les boucles:

for (int i = 0; i < n; ++i) { ... } 

Ici, je suis dans la gamme [0, n).

32
Mark Byers

Le concept de notation d'intervalle apparaît dans both Mathematics and Computer Science. La notation mathématique [, ], (, ) Désigne le domaine (ou plage ) d'un intervalle.

  • Les crochets [ Et ] Signifient:

    1. Le numéro est inclus ,
    2. Ce côté de l'intervalle est fermé,
  • La parenthèse ( Et ) Signifie:

    1. Le nombre est exclu ,
    2. Ce côté de l'intervalle est open.

Un intervalle avec des états mixtes est appelé "semi-ouvert".

Par exemple, l'intervalle des entiers consécutifs compris entre 1 et 10 (inclus) serait noté en tant que tel:

  • [1,10]

Remarquez comment le mot inclusive a été utilisé. Si nous voulons exclure le point final mais "couvrir" la même plage, nous devons déplacer le point final:

  • [1,11)

Il existe en fait 4 permutations pour les bords gauche et droit de l'intervalle:

(1,10) =   2,3,4,5,6,7,8,9       Set has  8 elements
(1,10] =   2,3,4,5,6,7,8,9,10    Set has  9 elements
[1,10) = 1,2,3,4,5,6,7,8,9       Set has  9 elements
[1,10] = 1,2,3,4,5,6,7,8,9,10    Set has 10 elements

Quel est le lien avec les mathématiques et l'informatique?

Les index de tableaux ont tendance à utiliser un décalage différent ​​selon le champ dans lequel vous vous trouvez:

  • Les mathématiques ont tendance à être one - basées.
  • Certains langages de programmation ont tendance à être zero -, tels que C, C++, Javascript, Python, alors que d’autres langages tels que Mathematica, Fortran, Pascal sont mono-basés.

Ces différences peuvent conduire à de subtils bugs bogues de clôture, autrement dit, lors de l’implémentation d’algorithmes mathématiques, tels que des boucles for-loops.

Entiers

Si nous avons un ensemble ou un tableau, disons des premiers nombres premiers [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ], Les mathématiciens feraient référence au premier élément en tant qu'élément 1stabsol. c'est-à-dire en utilisant la notation en indice pour désigner l'index:

  • une1 = 2
  • une2 = 3
  • :
  • unedix = 29

Certains langages de programmation, contrairement à ce que l'on pourrait dire, appellent le premier élément l'élément zero'threlatif.

  • a [0] = 2
  • a [1] = 3
  • :
  • a [9] = 29

Étant donné que les index de tableau sont dans la plage [0, N-1], par souci de clarté, il serait "agréable" de conserver la même valeur numérique pour la plage 0 ... N au lieu d'ajouter du texte noise comme un biais -1.

Par exemple, en C ou en JavaScript, pour effectuer une itération sur un tableau de N éléments, un programmeur écrirait l’idiome commun de i = 0, i < N Avec l’intervalle [0, N) au lieu du légèrement plus verbeux [0, N-1. ]:

function main() {
    var output = "";
    var a = [ 2, 3, 5, 7,  11, 13, 17, 19, 23, 29 ];
    for( var i = 0; i < 10; i++ ) // [0,10)
       output += "[" + i + "]: " + a[i] + "\n";

    if (typeof window === 'undefined') // Node command line
        console.log( output )
    else
        document.getElementById('output1').innerHTML = output;
}
 <html>
     <body onload="main();">
         <pre id="output1"></pre>
     </body>
 </html>

Les mathématiciens, puisqu'ils commencent à compter à 1, utiliseraient plutôt la nomenclature i = 1, i <= N, Mais nous devons maintenant corriger le décalage du tableau dans un langage de base zéro.

par exemple.

function main() {
    var output = "";
    var a = [ 2, 3, 5, 7,  11, 13, 17, 19, 23, 29 ];
    for( var i = 1; i <= 10; i++ ) // [1,10]
       output += "[" + i + "]: " + a[i-1] + "\n";

    if (typeof window === 'undefined') // Node command line
        console.log( output )
    else
        document.getElementById( "output2" ).innerHTML = output;
}
<html>
    <body onload="main()";>
        <pre id="output2"></pre>
    </body>
</html>

De côté :

Dans les langages de programmation basés sur 0, vous aurez peut-être besoin d'un kludge d'un zéro élément fictif pour utiliser un algorithme basé sur 1 mathématique. par exemple. Début de l'index Python

Point flottant

La notation par intervalles est également importante pour les nombres à virgule flottante afin d'éviter des bugs subtils.

Lorsque vous traitez avec des nombres à virgule flottante, en particulier dans Computer Graphics (conversion des couleurs, géométrie de calcul, accélération/fusion des animations, etc.), les nombres normalisés sont souvent utilisés. C'est-à-dire des nombres entre 0.0 et 1.0.

Il est important de connaître les cas Edge si les points d'extrémité sont inclus ou exclusif:

  • (0,1) = 1e-M .. 0,999 ...
  • (0,1] = 1e-M .. 1,0
  • [0,1) = 0,0 .. 0,999 ...
  • [0,1] = 0,0 .. 1,0

Où M est un peu machine epsilon . C'est pourquoi vous pouvez parfois voir const float EPSILON = 1e-# L'idiome en code C (tel que 1e-6) Pour un nombre à virgule flottante de 32 bits. Ceci SO question Est-ce que EPSILON garantit quoi que ce soit? présente quelques détails préliminaires. Pour une réponse plus complète, voir FLT_EPSILON Et David Goldberg's Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante

Certaines implémentations d'un générateur de nombres aléatoires, random(), peuvent produire des valeurs comprises entre 0.0 ... 0.999 ... au lieu de 0.0, qui est plus pratique, 1.0. Les commentaires appropriés dans le code consigneront ceci sous la forme [0.0,1.0) ou [0.0,1.0], de sorte qu'il n'y a aucune ambiguïté quant à l'utilisation.

Exemple:

  • Vous voulez générer random() couleurs. Vous convertissez trois valeurs à virgule flottante en valeurs à 8 bits non signées pour générer un pixel de 24 bits avec des canaux rouge, vert et bleu, respectivement. Selon l'intervalle de sortie de random(), vous pouvez vous retrouver avec near-white (254,254,254) ou white (255,255,255).
     +--------+-----+
     |random()|Byte |
     |--------|-----|
     |0.999...| 254 | <-- error introduced
     |1.0     | 255 |
     +--------+-----+

Pour plus de détails sur la précision en virgule flottante et la robustesse avec intervalles, voir Christer Ericson , Détection de collision en temps réel , Chapitre 11 Robustesse numérique, Section 11.3 tilisation robuste en virgule flottante.

13
Michaelangel007

Il peut s’agir d’une convention mathématique dans la définition d’un intervalle où les crochets signifient "extrémal inclusif" et les crochets "extrémal exclusif".

1
Eddy