Che cosa significa questa parentesi quadra e notazione parentesi quadre [first1, last1)?


137

Ho visto intervalli di numeri rappresentati come [first1,last1)e [first2,last2).

Vorrei sapere cosa significa una tale notazione.


3
[first, last)è un intervallo semiaperto, come altri hanno notato. In alcuni libri di testo, anche questo è scritto come [first, last>e ha esattamente lo stesso significato, solo la sintassi è diversa.
darioo,

8
Un posto migliore per questa domanda sarebbe math.stackexchange.com (IMHO). Ma non importa! :)
xk0der

8
Come mnemonico, pensa che la parentesi quadra si agganci a quel valore, che significa "fino a e compreso". E la parentesi tonda ha un significato più morbido e meno restrittivo: "fino a ma non compreso".
Eric Leschinski,

Come programmatore ogni volta che vedo parentesi quadre mi dà sempre un ricordo della forma estesa Backus-Naur - en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
RBT

2
Consiglio di migrare questo verso math.SE
Ben Leggiero,

Risposte:


227

Una parentesi indica che la fine dell'intervallo è inclusiva - include l'elemento elencato. Una parentesi indica che end è esclusivo e non contiene l'elemento elencato. Quindi [first1, last1), l'intervallo inizia con first1(e lo include), ma termina poco prima last1.

Supponendo numeri interi:

  • (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

3
Questo si evolve dalla pre-algebra della scuola elementare, dove apprendi le funzioni f (x) e il dominio e l'intervallo della funzione, dove una funzione come f (x) = x ^ 2, avrebbe un intervallo da 0 a infinito positivo, indicato con [0, ∞).
John Merlino,

1
@Timbo ∞ non ​​è un numero.
JakeD,

2
@pycoder la tua definizione di numero sembra limitare inutilmente. en.wikipedia.org/wiki/Surreal_number
Timbo

2
@JakeD Per quanto riguarda il tuo commento iniziale, hai ragione nel dire che l'infinito non è un numero, quindi perché l'insieme [0, ∞) non lo include.
wjandrea,

1
∞ non ​​è un numero ordinale , del tipo con cui puoi fare l'aritmetica. Ma è un numero cardinale valido quando si rispondono a domande come "Quanti numeri interi ci sono?". È anche, come in questo caso, perfettamente valido come limite
Kevin Wright il

37

È un intervallo semiaperto .

  • Un intervallo chiuso [a,b] include i punti finali.
  • Un intervallo aperto li (a,b) esclude .

Nel tuo caso viene incluso il punto finale all'inizio dell'intervallo, ma la fine viene esclusa. Quindi significa l'intervallo "first1 <= x <last1".

Gli intervalli semiaperti sono utili nella programmazione perché corrispondono al linguaggio comune per il looping:

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

Eccomi nella gamma [0, n).


15

Il concetto di notazione ad intervallo emerge sia in matematica che in informatica. La notazione matematica [, ], (, )denota il dominio (o intervallo ) di un intervallo.

  • Le parentesi [e i ]mezzi:

    1. Il numero è incluso ,
    2. Questo lato dell'intervallo è chiuso ,
  • La parentesi (e )significa:

    1. Il numero è escluso ,
    2. Questo lato dell'intervallo è aperto .

Un intervallo con stati misti è chiamato "semiaperto" .

Ad esempio, l'intervallo di numeri interi consecutivi da 1 .. 10 (compreso) sarebbe notata in quanto tale:

  • [1,10]

Nota come è inclusivestata usata la parola . Se vogliamo escludere il punto finale ma "coprire" lo stesso intervallo, dobbiamo spostare il punto finale:

  • [1,11)

Per entrambi i bordi sinistro e destro dell'intervallo ci sono in realtà 4 permutazioni:

(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

In che modo ciò si collega a matematica e informatica?

Gli indici di array tendono a utilizzare un offset diverso a seconda del campo in cui ci si trova:

  • La matematica tende ad avere una base.
  • Alcuni linguaggi di programmazione tendono ad essere a base zero , come C, C ++, Javascript, Python, mentre altri linguaggi come Mathematica, Fortran, Pascal sono basati su uno.

Queste differenze possono portare a sottili errori post recinzione , ovvero bug off-by-one durante l'implementazione di algoritmi matematici come i for-loop.

Interi

Se abbiamo un set o una matrice, diciamo dei primi numeri primi [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ], i matematici farebbero riferimento al primo elemento come elemento 1st assoluto . cioè usando la notazione in pedice per indicare l'indice:

  • a 1 = 2
  • a 2 = 3
  • :
  • a 10 = 29

Alcuni linguaggi di programmazione, in contraddizione, farebbero riferimento al primo elemento come l' elemento zero'th relativo .

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

Dato che gli indici di array sono nell'intervallo [0, N-1], per motivi di chiarezza sarebbe "bello" mantenere lo stesso valore numerico per l'intervallo 0 .. N invece di aggiungere rumore testuale come un -1bias.

Ad esempio, in C o JavaScript, per scorrere su una matrice di N elementi, un programmatore scriverebbe il linguaggio comune i = 0, i < Ndell'intervallo [0, N) invece del leggermente più dettagliato [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>

I matematici, poiché iniziano a contare su 1, utilizzerebbero invece la i = 1, i <= Nnomenclatura ma ora dobbiamo correggere l'offset di array in una lingua a base zero.

per esempio

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>

A parte :

Nei linguaggi di programmazione basati su 0 potrebbe essere necessario un kludge di un elemento zero zero fittizio per utilizzare un algoritmo matematico basato su 1. ad es. Python Index Start

Virgola mobile

La notazione a intervalli è importante anche per i numeri in virgola mobile per evitare bug sottili.

Quando si ha a che fare con numeri a virgola mobile, in particolare nella Grafica computerizzata (conversione del colore, geometria computazionale, attenuazione / fusione delle animazioni, ecc.), Spesso si usano numeri normalizzati. Cioè, numeri tra 0,0 e 1,0.

È importante conoscere i casi limite se gli endpoint sono inclusivi o esclusivi :

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

Dove M è una macchina epsilon . Questo è il motivo per cui a volte potresti vedere un const float EPSILON = 1e-#linguaggio nel codice C (come 1e-6) per un numero in virgola mobile a 32 bit. Questa domanda SO EPSILON garantisce qualcosa? ha alcuni dettagli preliminari. Per una risposta vedere più completa FLT_EPSILONe di David Goldberg Ciò che ogni computer Scientist dovrebbe conoscere circa aritmetica alla virgola mobile

Alcune implementazioni di un generatore di numeri casuali, random()possono produrre valori nell'intervallo 0.0 .. 0.999 ... anziché il più conveniente 0.0 .. 1.0. I commenti corretti nel codice lo documenteranno come [0.0,1.0) o [0.0.1.0], quindi non vi è alcuna ambiguità sull'uso.

Esempio:

  • Vuoi generare random()colori. Convertire tre valori a virgola mobile in valori a 8 bit senza segno per generare un pixel a 24 bit con canali rosso, verde e blu rispettivamente. A seconda dell'intervallo in uscita, random()si può finire con near-white(254.254.254) o white(255.255.255).
     +--------+-----+
     |random()|Byte |
     |--------|-----|
     |0.999...| 254 | <-- error introduced
     |1.0     | 255 |
     +--------+-----+

Per maggiori dettagli sulla precisione e la robustezza in virgola mobile con intervalli, vedere Rilevamento delle collisioni in tempo reale di Christer Ericson , Capitolo 11 Robustezza numerica , Sezione 11.3 Uso in virgola mobile .


1

Può essere una convenzione matematica nella definizione di un intervallo in cui parentesi quadre significano "estremali inclusivi" e parentesi tonde "estremali esclusive".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.