Нумерация с нуля - Zero-based numbering

Нумерация с нуля - это способ нумерации, при котором начальному элементу последовательности присваивается индекс 0, а не 1, как это обычно бывает в повседневных нематематических или непрограммируемых условиях. При нумерации с отсчетом от нуля начальный элемент иногда называют нулевым элементом, а не первым элементом; Нулевое является придуман порядковый номер , соответствующий номеру нулевой . В некоторых случаях объект или значение, которые (изначально) не принадлежат заданной последовательности, но которые естественным образом могут быть помещены перед ее начальным элементом, можно назвать нулевым элементом. Нет широкого согласия относительно правильности использования нуля в качестве порядкового номера (или относительно использования термина « ноль» ), поскольку это создает неоднозначность для всех последующих элементов последовательности при отсутствии контекста.

Нумерация последовательности , начиная с 0 является довольно распространенным явлением в математике нотации, в частности , в комбинаторике , хотя языки программирования для математики обычно индекса с 1. В информатике , массив индексов обычно начинаются с 0 в современных языках программирования, поэтому программисты могут использовать Нулевое в ситуациях где другие могут использовать в первую очередь , и так далее. В некоторых математических контекстах нуля нумерация может быть использована без путаницы, когда порядковые формы имеют хорошо закрепленное значение с очевидным кандидатом прийти прежде , чем первый ; например, нулевая производная функции - это сама функция, полученная нулевым дифференцированием . Такое использование соответствует названию элемента, который не принадлежит последовательности, но предшествует ей: нулевая производная на самом деле вообще не является производной. Однако, как первая производная предшествует второй производной , так и нулевая производная (или сама исходная функция) предшествует первой производной .

Компьютерное программирование

Источник

Мартин Ричардс , создатель языка BCPL (предшественник C ), разработал массивы, начинающиеся с 0, как естественную позицию для начала доступа к содержимому массива на языке, поскольку значение указателя p, используемого в качестве адреса, обращается к позиции p + 0 в памяти. BCPL был впервые скомпилирован для IBM 7094 ; в языке не было косвенного поиска во время выполнения , поэтому оптимизация косвенного обращения, обеспечиваемая этими массивами, была выполнена во время компиляции. Тем не менее оптимизация была важна.

Эдсгер В. Дейкстра позже написал соответствующую заметку, почему нумерация должна начинаться с нуля в 1982 году, проанализировав возможные конструкции индексов массивов, заключив их в цепное неравенство, объединив резкие и стандартные неравенства с четырьмя возможностями, продемонстрировав, что, по его убеждению, основано на нуле. массивы лучше всего представлены неперекрывающимися диапазонами индексов, которые начинаются с нуля, имея в виду открытые, полуоткрытые и закрытые интервалы, как и действительные числа. Критерии Дейкстры для предпочтения этого соглашения в деталях заключаются в том, что оно представляет пустые последовательности более естественным образом ( ai < a  ?), Чем закрытые «интервалы» ( ai ≤ ( a −1)?), И что с полу- открытых "интервалов" натуральных чисел , длина подпоследовательности равна верхнему минус нижняя граница ( ai < b дает ( b - a ) возможные значения для i , где a , b , i все целые числа).

Использование в языках программирования

Такое использование следует из выбора дизайна, встроенного во многие влиятельные языки программирования , включая C , Java и Lisp . В этих трех типах последовательностей (массивы C, массивы и списки Java, списки и векторы Lisp) индексируются, начиная с нулевого нижнего индекса. В частности, в C, где массивы тесно связаны с арифметикой указателей , это упрощает реализацию: нижний индекс относится к смещению от начальной позиции массива, поэтому первый элемент имеет нулевое смещение.

Обращение к памяти по адресу и смещению представлено непосредственно в компьютерном оборудовании практически на всех компьютерных архитектурах, поэтому эта деталь конструкции в C упрощает компиляцию за счет некоторых человеческих факторов. В этом контексте использование «нуля» в качестве порядкового номера не совсем правильно, но это широко распространенная привычка в этой профессии. Другие языки программирования, такие как Fortran или COBOL , имеют индексы массива, начинающиеся с единицы, потому что они предназначались как языки программирования высокого уровня , и, как таковые, они должны были соответствовать обычным порядковым номерам, которые предшествовали изобретению нуля . долгое время.

Паскаль позволяет диапазону массива быть любого порядкового типа (включая перечислимые типы). APL позволяет программно установить источник индекса на 0 или 1 во время выполнения. Некоторые недавние языки, такие как Lua и Visual Basic , приняли такое же соглашение по той же причине.

Ноль - это наименьшее целое число без знака, один из самых фундаментальных типов в программировании и проектировании оборудования. Таким образом, в информатике ноль часто используется как базовый случай для многих видов числовой рекурсии . Доказательства и другие виды математических рассуждений в информатике часто начинаются с нуля. По этим причинам в информатике нет ничего необычного в том, чтобы считать с нуля, а не с единицы.

Хакеры и компьютерщики часто любят называть первую главу публикации «Главой 0», особенно если она носит вводный характер. Один из классических примеров был в первом издании K&R . В последние годы эта черта также наблюдалась среди многих чистых математиков , где многие конструкции нумеруются с 0.

Если для представления цикла используется массив, удобно получить индекс с помощью функции по модулю , которая может привести к нулю.

Числовые свойства

При нумерации с отсчетом от нуля диапазон может быть выражен как полуоткрытый интервал , [0, n ), в отличие от закрытого интервала, [1, n ]. Пустые диапазоны, которые часто встречаются в алгоритмах, сложно выразить через закрытый интервал, не прибегая к тупым соглашениям вроде [1,0]. Благодаря этому свойству индексирование с нуля потенциально сокращает количество ошибок, связанных с разницей в единицу и заборной стойкой . С другой стороны, количество повторений n вычисляется заранее, что делает использование подсчета от 0 до n -1 (включительно) менее интуитивным. Некоторые авторы предпочитают индексирование на основе одного, поскольку оно более соответствует тому, как объекты индексируются в других контекстах.

Еще одно свойство этого соглашения - использование модульной арифметики, реализованной в современных компьютерах. Обычно функция по модулю отображает любое целое число по модулю N в одно из чисел 0, 1, 2, ..., N - 1 , где N ≥ 1 . Из-за этого многие формулы в алгоритмах (например, для вычисления индексов хеш-таблицы) могут быть элегантно выражены в коде с помощью операции по модулю, когда индексы массива начинаются с нуля.

Операции с указателями также могут быть более элегантно выражены в индексе, начинающемся с нуля, благодаря базовой логике адреса / смещения, упомянутой выше. Для иллюстрации предположим, что a - это адрес памяти первого элемента массива, а i - это индекс желаемого элемента. Чтобы вычислить адрес желаемого элемента, если номера индекса отсчитываются от 1, желаемый адрес вычисляется с помощью этого выражения:

а + s × ( я - 1)

где s - размер каждого элемента. Напротив, если порядковые номера отсчитывают от 0, выражение становится:

а + с × я

Это более простое выражение эффективнее вычислять во время выполнения .

Однако язык, желающий индексировать массивы от 1, мог бы принять соглашение, согласно которому каждый адрес массива представлен как a ′ = a - s ; то есть вместо использования адреса первого элемента массива такой язык будет использовать адрес вымышленного элемента, расположенного непосредственно перед первым фактическим элементом. Выражение индексации для индекса, отсчитываемого от 1, тогда будет:

а '+ s × я

Следовательно, повышение эффективности во время выполнения индексирования с нулевым отсчетом не является неотъемлемым, а является артефактом решения представить массив с адресом его первого элемента, а не с адресом фиктивного нулевого элемента. Однако адрес этого фиктивного элемента вполне может быть адресом какого-либо другого элемента в памяти, не связанного с массивом.

На первый взгляд фиктивный элемент плохо масштабируется для многомерных массивов. При индексировании многомерных массивов с нуля наивное (непрерывное) преобразование в линейное адресное пространство (систематическое изменение одного индекса за другим) выглядит проще, чем при индексировании с одного. Например, при отображении трехмерного массива на линейный массив L [ M⋅N⋅P ], оба с элементами M⋅N⋅P , индекс r в линейном массиве для доступа к определенному элементу с L [ r ] = A [ z ] [ y ] [ x ] при индексировании с нуля, то есть [0 ≤ x < P ], [0 ≤ y < N ], [0 ≤ z < M ] и [0 ≤ r < M⋅N ⋅P ], вычисляется по формуле r = zMN + yM + x . Организация всех массивов с индексами на основе 1 ([1 ≤ x ′P ], [1 ≤ y ′N ], [1 ≤ z ′M ], [1 ≤ r ′M⋅N⋅P ]), и, предполагая аналогичное расположение элементов, дает r ′ = ( z ′ - 1) ⋅ MN + ( y ′ - 1) ⋅ M + ( x ′ - 0) для доступа к тому же элементу, что, возможно, выглядит более сложным . Конечно, r ' = r + 1, поскольку [ z = z ′ - 1], [ y = y ′ - 1] и [ x = x ′ - 1]. Простой и повседневный пример - позиционная система обозначений, которая стала возможной с изобретением нуля. В позиционном обозначении десятки, сотни, тысячи и все остальные цифры начинаются с нуля, только единицы начинаются с единицы.

  • Индексы на основе нуля
    Икс
    у
    0 1 2 .. .. 8 9
    0 0 0 0 1 0 2 0 8 0 9
    1 10 11 12 18 19
    2 20 21 год 22 28 год 29
    ..
    ..
    8 80 81 год 82 88 89
    9 90 91 92 98 99
    Содержимое таблицы представляет собой индекс r
  •    
  • Индексы на основе одной
    Икс'
    y '
    1 2 3 .. .. 9 10
    1 0 1 0 2 0 3 0 9 10
    2 11 12 13 19 20
    3 21 год 22 23 29 30
    ..
    ..
    9 81 год 82 83 89 90
    10 91 92 93 99 100
    Содержимое таблицы представляет собой индекс r ′

Эта ситуация может привести к некоторой путанице в терминологии. В схеме индексации с отсчетом от нуля первым элементом является «элемент с нулевым номером»; аналогично, двенадцатый элемент - это «элемент номер одиннадцать». Таким образом, появляется аналогия порядковых номеров количеству пронумерованных объектов; наивысший индекс из n объектов будет n - 1 и относится к n- му элементу. По этой причине первый элемент иногда называют нулевым элементом, чтобы избежать путаницы.

Наука

В математике , много последовательностей чисел или из многочленов индексируются неотрицательными целыми числами, например, числа Бернулли и номер Bell .

И в механике, и в статистике определяется нулевой момент , представляющий полную массу в случае физической плотности или полную вероятность, то есть единицу, для распределения вероятностей .

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

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

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

В геномике для координат генома используются как системы на основе 0, так и системы на основе 1.

Нулевой пациент (или индексный случай ) является первоначальным пациентом в выборке населения для эпидемиологического расследования.

Другие поля

Год ноль не существует в широко используемом григорианском календаре или в его предшественника, юлианскому календарю . В этих системах, год 1 BC следуют 1 AD . Однако есть нулевой год в астрономической нумерации (где он совпадает с юлианским годом 1 до н.э.) и в ISO 8601: 2004 (где он совпадает с григорианским годом 1 до н.э.), а также во всех буддийских и индуистских календарях .

Во многих странах первый этаж в зданиях считается этажом с номером 0, а не «1-м этажом», как принято в Соединенных Штатах Америки. Это составляет единый набор с подземными этажами, отмеченными отрицательными числами.

Хотя порядковый номер 0 в основном используется в сообществах, непосредственно связанных с математикой, физикой и информатикой, есть примеры и в классической музыке. Композитор Антон Брукнер считал свою раннюю симфонию ре минор недостойной включения в канон своих произведений и написал на партитуре и круге с перекладиной «позолоченный никт», подразумевая, что это «недействительно». Но посмертно это произведение стало известно как Симфония № 0 ре минор , хотя на самом деле оно было написано после Симфонии № 1 до минор . Есть еще более ранняя Симфония фа минор Брукнера, которую иногда называют № 00 . Русский композитор Альфред Шнитке также написал Симфонию № 0 .

В некоторых университетах, включая Оксфорд и Кембридж, «неделя 0» или иногда «нулевая неделя» относится к неделе перед первой неделей лекций в семестре. В Австралии некоторые университеты называют это «неделей О», что означает « ориентационную неделю ». Параллельно с этим вводные недели университетского образования в Швеции обычно называют «nollning» (обнуление).

Военно- воздушные силы США начинают базовую подготовку каждую среду, а первая неделя (из восьми) считается началом следующего воскресенья. Четыре дня до этого воскресенья часто называют «нулевой неделей».

24-часовые часы и международный стандарт ISO 8601 используют 0 для обозначения первого (нулевого) часа дня.

Станции Кингс-Кросс в Лондоне, Эдинбург-Хеймаркет и станции в Уппсале , Йонаго , Стокпорте и Кардиффе имеют платформу 0 .

Рисунки Роберта Крамба для первого выпуска Zap Comix были украдены, поэтому он нарисовал совершенно новый выпуск, который был опубликован как выпуск 1. Позже он перекрасил свои фотокопии украденных иллюстраций и опубликовал его как выпуск 0.

Брюссель кольцевая дорога в Бельгии пронумерована R0. Он был построен после кольцевой дороги вокруг Антверпена , но Брюссель (будучи столицей) считался заслуживающим более простого числа. Точно так же (незавершенная) орбитальная автомагистраль вокруг Будапешта в Венгрии называется M0 .

Ноль иногда используется в уличных адресах , особенно в схемах, где четные числа находятся на одной стороне улицы, а нечетные - на другой. В качестве примера можно привести церковь Христа на Гарвардской площади , адрес которой - 0 Garden Street.

В Формуле-1, когда действующий чемпион мира не участвует в соревнованиях в следующем сезоне, номер 1 не присваивается ни одному гонщику, но один гонщик из команды чемпиона мира будет иметь номер 0, а другой - номер 2. Это произошло. Это произошло как в 1993, так и в 1994 году, когда Дэймон Хилл был под номером 0 в обоих сезонах, так как действующий чемпион Найджел Мэнселл ушел после 1992 года, а действующий чемпион Ален Прост ушел после 1993 года.

Хронологический приквел серии может иметь номер 0, например Ring 0: Birthday или Zork Zero .

Швейцарские федеральные железные дороги номер определенных классов подвижного состава от нуля, например, Re 460 000 до 118.

В области художественной литературы Айзек Азимов в конце концов добавил нулевой закон к своим « трем законам робототехники» , по сути сделав их четырьмя законами.

Смотрите также

использованная литература

  • Эта статья включает в себя материал, взятый с нуля в Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенный в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.