Ho visto intervalli di numeri rappresentati come [first1,last1)
e [first2,last2)
.
Vorrei sapere cosa significa una tale notazione.
Ho visto intervalli di numeri rappresentati come [first1,last1)
e [first2,last2)
.
Vorrei sapere cosa significa una tale notazione.
Risposte:
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:
È un intervallo semiaperto .
[a,b]
include i punti finali.(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).
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:
La parentesi (
e )
significa:
Un intervallo con stati misti è chiamato "semiaperto" .
Ad esempio, l'intervallo di numeri interi consecutivi da 1 .. 10 (compreso) sarebbe notata in quanto tale:
Nota come è inclusive
stata usata la parola . Se vogliamo escludere il punto finale ma "coprire" lo stesso intervallo, dobbiamo spostare il punto finale:
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:
Queste differenze possono portare a sottili errori post recinzione , ovvero bug off-by-one durante l'implementazione di algoritmi matematici come i for-loop.
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:
Alcuni linguaggi di programmazione, in contraddizione, farebbero riferimento al primo elemento come l' elemento zero'th
relativo .
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 -1
bias.
Ad esempio, in C o JavaScript, per scorrere su una matrice di N elementi, un programmatore scriverebbe il linguaggio comune i = 0, i < N
dell'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 <= N
nomenclatura 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
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 :
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_EPSILON
e 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:
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 .
[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.