He visto rangos de números representados como [first1,last1)
y [first2,last2)
.
Me gustaría saber qué significa tal notación.
He visto rangos de números representados como [first1,last1)
y [first2,last2)
.
Me gustaría saber qué significa tal notación.
Respuestas:
Un paréntesis significa que el final del rango es inclusivo : incluye el elemento listado. Un paréntesis significa que el final es exclusivo y no contiene el elemento listado. Entonces [first1, last1)
, el rango comienza con first1
(y lo incluye), pero termina justo antes last1
.
Suponiendo enteros:
Eso es un intervalo medio abierto .
[a,b]
incluye los puntos finales.(a,b)
excluye .En su caso, se incluye el punto final al comienzo del intervalo, pero se excluye el final. Entonces significa el intervalo "first1 <= x <last1".
Los intervalos medio abiertos son útiles en la programación porque corresponden al idioma común para el bucle:
for (int i = 0; i < n; ++i) { ... }
Aquí estoy en el rango [0, n).
El concepto de notación de intervalos surge tanto en Matemáticas como en Ciencias de la Computación. La notación matemática [
, ]
, (
, )
denota el dominio (o rango ) de un intervalo.
Los corchetes [
y los ]
medios:
El paréntesis (
y los )
medios:
Un intervalo con estados mixtos se llama "medio abierto" .
Por ejemplo, el rango de enteros consecutivos de 1 .. 10 (inclusive) se anotaría como tal:
Observe cómo inclusive
se usó la palabra . Si queremos excluir el punto final pero "cubrir" el mismo rango, necesitamos mover el punto final:
Para los bordes izquierdo y derecho del intervalo, en realidad hay 4 permutaciones:
(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
¿Cómo se relaciona esto con las matemáticas y la informática?
Los índices de matriz tienden a usar un desplazamiento diferente según el campo en el que se encuentre:
Estas diferencias pueden dar lugar a sutiles errores poste de la cerca , también conocido como off-by-one errores en la aplicación de algoritmos matemáticos, tales como para-bucles.
Si tenemos un conjunto o matriz, digamos de los primeros números primos [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
, los matemáticos se referirían al primer elemento como el elemento 1st
absoluto . es decir, usar la notación de subíndice para denotar el índice:
Algunos lenguajes de programación, en contraste, se referirían al primer elemento como el elemento zero'th
relativo .
Dado que los índices de la matriz están en el rango [0, N-1], entonces, por razones de claridad, sería "bueno" mantener el mismo valor numérico para el rango 0 .. N en lugar de agregar ruido textual como un-1
sesgo.
Por ejemplo, en C o JavaScript, para iterar sobre una matriz de N elementos, un programador escribiría el idioma común i = 0, i < N
con el intervalo [0, N) en lugar del ligeramente más detallado [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>
Los matemáticos, dado que comienzan a contar en 1, en su lugar usarían la i = 1, i <= N
nomenclatura, pero ahora necesitamos corregir el desplazamiento de la matriz en un lenguaje basado en cero.
p.ej
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>
Aparte :
En los lenguajes de programación basados en 0, es posible que necesite un kludge de un elemento ficticio cero para usar un algoritmo matemático basado en 1. por ejemplo , inicio de índice de Python
La notación de intervalo también es importante para los números de punto flotante para evitar errores sutiles.
Cuando se trata de números de punto flotante, especialmente en Gráficos por computadora (conversión de color, geometría computacional, suavizado / fusión de animación, etc.) a menudo se usan números normalizados. Es decir, números entre 0.0 y 1.0.
Es importante conocer los casos límite si los puntos finales son inclusivos o exclusivos :
Donde M es alguna máquina épsilon . Es por eso que a veces puede ver const float EPSILON = 1e-#
modismos en el código C (como 1e-6
) para un número de coma flotante de 32 bits. Esta pregunta SO ¿EPSILON garantiza algo? Tiene algunos detalles preliminares. Para obtener una respuesta más completa, consulte el artículo de FLT_EPSILON
David Goldberg Lo que todo informático debe saber sobre la aritmética de coma flotante.
Algunas implementaciones de un generador de números aleatorios random()
pueden producir valores en el rango 0.0 .. 0.999 ... en lugar del más conveniente 0.0 .. 1.0. Los comentarios correctos en el código documentarán esto como [0.0,1.0) o [0.0,1.0] para que no haya ambigüedad en cuanto al uso.
Ejemplo:
random()
colores. Convierte tres valores de coma flotante en valores de 8 bits sin signo para generar un píxel de 24 bits con canales rojo, verde y azul, respectivamente. Dependiendo del intervalo de salida por el random()
que puede terminar con near-white
(254,254,254) o white
(255,255,255). +--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
Para obtener más detalles sobre la precisión de punto flotante y la robustez con intervalos, consulte Detección de colisión en tiempo real de Christer Ericson , Capítulo 11 Robustez numérica , Sección 11.3 Uso robusto de punto flotante .
[first, last)
es un intervalo medio abierto como otros han notado. En algunos libros de texto, esto también se escribe[first, last>
y tiene exactamente el mismo significado, solo que la sintaxis es diferente.