Что означают эта квадратная скобка и обозначение скобок [first1, last1)?


137

Я видел диапазоны номеров, представленные как [first1,last1)и [first2,last2).

Хотелось бы знать, что означает такое обозначение.


3
[first, last)это полуоткрытый интервал, как отмечали другие. В некоторых учебниках это также пишется как [first, last>и имеет точно такое же значение, только синтаксис отличается.
darioo

8
Лучшим местом для этого вопроса было бы math.stackexchange.com (IMHO). Но не бери в голову! :)
xk0der

8
В качестве мнемоники подумайте, что квадратная скобка цепляется за это значение, означающее «до включительно». А круглые скобки имеют более мягкий и менее ограничительный смысл: «до, но не включая».
Эрик Лещински

Как программист всякий раз, когда я вижу квадратные скобки, я всегда вспоминаю расширенную форму Бэкуса-Наура - en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
RBT

2
Я рекомендую перенести это на math.SE
Ben Leggiero

Ответы:


227

Скобка означает, что конец диапазона является включающим - он включает указанный элемент. Скобка означает, что конец является исключающим и не содержит указанного элемента. Итак [first1, last1), диапазон начинается с first1(и включает его), но заканчивается непосредственно перед ним last1.

Предполагая целые числа:

  • (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
Это происходит от предалгебры начальной школы, где вы изучаете функции f (x), а также область определения и диапазон функции, где такая функция, как f (x) = x ^ 2, будет иметь диапазон от 0 до положительной бесконечности, обозначенный [0, ∞).
JohnMerlino

1
@Timbo ∞ не является числом.
JakeD

2
@pycoder ваше определение числа кажется излишне ограничивающим. en.wikipedia.org/wiki/Surreal_number
Тимбо

2
@JakeD Что касается вашего первоначального комментария, вы правы в том, что бесконечность не является числом, поэтому набор [0, ∞) не включает его.
wjandrea

1
∞ не является порядковым числом из тех, с которыми вы можете выполнять арифметические операции. Но это действительное кардинальное число, когда вы отвечаете на такие вопросы, как «Сколько здесь целых чисел?». Это также, как и в данном случае, вполне допустимо как предел
Кевин Райт

37

Это полуоткрытый интервал .

  • Закрытый интервал [a,b] включает конечные точки.
  • Открытый интервал их (a,b) исключает .

В вашем случае конечная точка в начале интервала включена, но конец исключен. Это означает интервал «first1 <= x <last1».

Полуоткрытые интервалы полезны в программировании, потому что они соответствуют общепринятой идиоме зацикливания:

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

Здесь i находится в диапазоне [0, n).


15

Понятие интервальной записи встречается как в математике, так и в информатике. Математические обозначения [, ], (, )обозначают домен (или диапазон ) интервал.

  • Скобки [и ]средства:

    1. Номер включен ,
    2. Эта сторона интервала закрыта ,
  • Скобка (и )означает:

    1. Число исключено ,
    2. Эта сторона интервала открыта .

Интервал со смешанными состояниями называется «полуоткрытым». .

Например, диапазон последовательных целых чисел от 1 до 10 (включительно) будет обозначен как таковой:

  • [1,10]

Обратите внимание, как inclusiveбыло использовано это слово . Если мы хотим исключить конечную точку, но «покрыть» тот же диапазон, нам нужно переместить конечную точку:

  • [1,11)

И для левого, и для правого края интервала на самом деле есть 4 перестановки:

(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, C ++, Javascript, Python, в то время как другие языки, такие как Mathematica, Fortran, Pascal, основаны на единице.

Эти различия могут привести к незначительным ошибкам столбов забора , иначе говоря, по одному. ошибок при реализации математических алгоритмов , таких как для-петли.

Целые

Если у нас есть набор или массив, скажем, из первых нескольких простых чисел [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ], математики будут называть первый элемент 1st абсолютным элементом. т.е. использование нижнего индекса для обозначения индекса:

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

Некоторые языки программирования, в отличие от этого, будут называть первый элемент zero'th относительным элементом.

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

Поскольку индексы массива находятся в диапазоне [0, N-1], то для ясности было бы "неплохо" сохранить такое же числовое значение для диапазона 0 .. N вместо добавления текстового шума, такого как-1 смещение.

Например, в C или JavaScript, чтобы перебирать массив из N элементов, программист должен написать обычную идиому i = 0, i < Nс интервалом [0, N) вместо более подробного [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>

Математики, поскольку они начинают считать с 1, вместо этого использовали бы i = 1, i <= Nноменклатуру, но теперь нам нужно исправить смещение массива на языке с нулевым отсчетом.

например

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>

Помимо :

В языках программирования, которые 0 основанных вам может понадобиться кладж манекен zero'th элемента для использования алгоритма математического 1 на основе. например, начало индекса Python

Плавающая точка

Нотация интервалов также важна для чисел с плавающей запятой, чтобы избежать мелких ошибок.

При работе с числами с плавающей запятой, особенно в компьютерной графике (преобразование цвета, вычислительная геометрия, замедление / смешение анимации и т. Д.), Часто используются нормализованные числа. То есть числа от 0,0 до 1,0.

Если конечные точки являются включающими или исключающими, важно знать крайние случаи :

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

Где M - это какой-то машинный эпсилон . Вот почему вы иногда можете увидеть const float EPSILON = 1e-#идиому в коде C (например, 1e-6) для 32-битного числа с плавающей запятой. Этот ТАК вопрос Гарантирует ли EPSILON что-нибудь? есть некоторые предварительные детали. Более подробный ответ см. В FLT_EPSILONкниге Дэвида Голдберга. Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой».

Некоторые реализации генератора случайных чисел random()могут выдавать значения в диапазоне 0,0 .. 0,999 ... вместо более удобного 0,0 .. 1,0. Правильные комментарии в коде документируют это как [0.0,1.0) или [0.0,1.0], поэтому нет двусмысленности в использовании.

Пример:

  • Вы хотите создать random()цвета. Вы конвертируете три значения с плавающей запятой в беззнаковые 8-битные значения, чтобы сгенерировать 24-битный пиксель с красным, зеленым и синим каналами соответственно. В зависимости от выходного интервала random()вы можете получить near-white(254,254,254) или white(255,255,255).
     +--------+-----+
     |random()|Byte |
     |--------|-----|
     |0.999...| 254 | <-- error introduced
     |1.0     | 255 |
     +--------+-----+

Для получения дополнительных сведений о точности с плавающей запятой и устойчивости с интервалами см. « Обнаружение столкновений в реальном времени» Кристера Эриксона , глава 11 « Числовая устойчивость» , раздел 11.3 « Надежное использование с плавающей запятой» .


1

Это может быть математическое соглашение при определении интервала, где квадратные скобки означают «экстремальный включающий», а круглые скобки «экстремальный исключающий».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.