32 votos

¿Qué significa esta notación de corchetes cuadrados y paréntesis [primero1, último1)?

He visto intervalos de números representados como [first1, last1) y [first2, last2).

Me gustaría saber qué significa esta notación.

60voto

Michael Mrozek Puntos 44120

Un corchete - [ o ] - significa que el final del rango es inclusivo -- incluye al elemento listado. Un paréntesis - ( o ) - significa que el final es exclusivo y no incluye el elemento listado. Por lo tanto, para [first1, last1), el rango comienza con first1 (y lo incluye), pero termina justo antes de last1.

Suponiendo números enteros:

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

23voto

Mark Byers Puntos 318575

Eso es un intervalo semiabierto.

  • Un intervalo cerrado [a,b] incluye los puntos finales.
  • Un intervalo abierto (a,b) los excluye.

En tu caso, el punto final al inicio del intervalo está incluido, pero el final está excluido. Esto significa que el intervalo es "primero1 <= x < último1".

Los intervalos semiabiertos son útiles en programación porque corresponden al común idioma para hacer bucles:

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

En este caso i está en el rango [0, n).

20voto

Michaelangel007 Puntos 2171

El concepto de notación de intervalo aparece 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 ] significan:

    1. El número está incluido,
    2. Este lado del intervalo está cerrado,
  • Los paréntesis ( y ) significan:

    1. El número está excluido,
    2. Este lado del intervalo está abierto.

Un intervalo con estados mixtos se llama "semicerrado".

Por ejemplo, el rango de enteros consecutivos de 1 a 10 (inclusive) se notaría así:

  • [1,10]

Observa cómo se usó la palabra inclusive. Si queremos excluir el punto final pero "cubrir" el mismo rango debemos mover el punto final:

  • [1,11)

Para ambos extremos izquierdo y derecho del intervalo, en realidad hay 4 permutaciones:

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

¿Cómo se relaciona esto con Matemáticas y Ciencias de la Computación?

Los índices de los arreglos tienden a utilizar un diferente desplazamiento dependiendo del campo en el que te encuentres:

  • Las Matemáticas tienden a ser basadas en uno.
  • Ciertos lenguajes de programación tienden a ser basados en cero, como C, C++, Javascript, Python, mientras que otros lenguajes como Mathematica, Fortran, Pascal son basados en uno.

Estas diferencias pueden llevar a errores sutiles de "cerca del poste", también conocidos como errores fuera de por uno al implementar algoritmos Matemáticos como los bucles for.

Enteros

Si tenemos un conjunto o arreglo, como los primeros primos [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ], los Matemáticos se referirían al primer elemento como el 1er elemento absoluto. es decir, Usando la notación de subíndice para denotar el índice:

  • a1 = 2
  • a2 = 3
  • :
  • a10 = 29

Algunos lenguajes de programación, en contraste, se referirían al primer elemento como el 0-ésimo elemento relativo.

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

Dado que los índices de los arreglos están en el rango [0,N-1], para claridad sería "bueno" mantener el mismo valor numérico para el rango 0 .. N en lugar de agregar ruido textual como un sesgo de -1.

Por ejemplo, en C o JavaScript, para iterar sobre un arreglo de N elementos un programador escribiría el idiom común de i = 0, i < N con el intervalo [0,N) en lugar del ligeramente más largo [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') // Comando Node
        console.log( output )
    else
        document.getElementById('output1').innerHTML = output;
}

Los Matemáticos, dado que empiezan a contar en 1, usarían la nomenclatura i = 1, i <= N pero ahora necesitamos corregir el desplazamiento del arreglo en un lenguaje basado en cero.

por ejemplo

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') // Comando Node
        console.log( output )
    else
        document.getElementById( "output2" ).innerHTML = output;
}

Aparte:

En lenguajes de programación que son basados en cero puedes necesitar un apaño de un elemento ficticio de cero para usar un algoritmo Matemático basado en uno. por ejemplo, Comienzo de Índice en Python

Punto Flotante

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, interpolación / mezcla 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 extremos están inclusivos o exclusivos:

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

Donde M es algún épsilon de máquina. Por eso a veces verás el idiom de const float ÉPSILON = 1e-# en código C (como 1e-6) para un número de punto flotante de 32 bits. Esta pregunta en SO El uso de la variable épsilon tiene algunos detalles preliminares. para una respuesta más completa, mira FLT_ÉPSILON y el artículo de David Goldberg Lo que Todo Informático Debería Saber Sobre Aritmética de Punto Flotante

Algunas implementaciones de un generador de números aleatorios, aleatorio() pueden producir valores en el rango 0.0 .. 0.999... en lugar del más conveniente 0.0 .. 1.0. Comentarios adecuados en el código documentarán esto como [0.0,1.0) o [0.0,1.0] para evitar ambigüedades en el uso.

Ejemplo:

  • Quieres generar colores aleatorios(). Conviertes tres valores de punto flotante en valores sin signo de 8 bits para generar un píxel de 24 bits con canales rojo, verde y azul respectivamente. Dependiendo del intervalo de salida por aleatorio() podrías terminar con cerca del blanco (254,254,254) o blanco (255,255,255).

    +--------+-----+ aleatorio() Byte
    0.999... 254 <-- error introducido
    1.0 255

    +--------+-----+

para más detalles sobre la precisión y robustez de los números de punto flotante con intervalos ve el libro de Christer Ericson Detección de Colisiones en Tiempo Real, Capítulo 11 Robustez Numérica, Sección 11.3 Uso Robusto de Punto Flotante.

1voto

Eddy Puntos 320

Puede ser una convención matemática en la definición de un intervalo donde los corchetes cuadrados significan "extremo inclusivo" y los paréntesis redondos "extremo exclusivo".

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X