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

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

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

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

Источник

Мартин Ричардс, создатель BCPL язык (предшественник C ), спроектировал массивы, начинающиеся с 0, как естественную позицию для начала доступа к содержимому массива на языке, поскольку значение a указатель п используется как адрес для доступа к позиции п + 0 в памяти.[2][3] Канадский системный аналитик Майк Хой спросил Ричардса о причинах выбора этого соглашения. BCPL был впервые скомпилирован для IBM 7094; язык введен нет косвенный поиск в время выполнения, поэтому во время компиляции использовалась косвенная оптимизация, обеспечиваемая этими массивами.[3] Тем не менее оптимизация была важна.[3][4]

Эдсгер В. Дейкстра позже написал соответствующую заметку Почему нумерация должна начинаться с нуля[5] в 1982 году, анализируя возможные конструкции индексов массивов, заключая их в цепочку неравенств, комбинируя резкие и стандартные неравенства с четырьмя возможностями, демонстрируя, что, по его убеждению, массивы с нулевым отсчетом лучше всего представлены неперекрывающимися диапазонами индексов, которые начинаются с нуля. , ссылаясь на открытые, полуоткрытые и закрытые интервалы как с реальными числами. Критерии Дейкстры для предпочтения этого соглашения в деталях заключаются в том, что оно представляет пустые последовательности более естественным образом (ая < а ?) чем закрытые "интервалы" (ая ≤ (а−1)?), И что с полуоткрытыми "интервалами" натуральных чисел длина подпоследовательности равна верхней минус нижней границе (ая < б дает (ба) возможные значения для я, с а, б, я все натуральные).

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

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

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

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

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

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

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

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

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

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

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

а + s × (я − 1)

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

а + s × я

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

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

а′ + s × я

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

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

  • Нуль-основанные индексы
    Икс
    у
    012....89
    00001020809
    11011121819
    22021222829
    ..
    ..
    88081828889
    99091929899
    Содержимое таблицы представляет собой индекс р
  •    
  • Один-основанные индексы
    Икс'
    y '
    123....910
    10102030910
    21112131920
    32122232930
    ..
    ..
    98182838990
    1091929399100
    Содержимое таблицы представляет собой индекс р'

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

Наука

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

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

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

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

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

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

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

Другие поля

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

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

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

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

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

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

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

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

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

Иногда используется ноль в почтовых адресах, особенно в схемах, где четные числа находятся на одной стороне улицы, а нечетные - на другой. Показательный пример - ориентир Крайст-Черч Кембридж на Кембридж, Массачусетс с Гарвардская площадь Адрес: 0 Garden Street.

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

Хронологический приквел сериала может иметь номер 0, например Кольцо 0: День рождения или же Зорк Зеро.

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

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

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

Рекомендации

  1. ^ М. Сид, Грэм (1965). Введение в объектно-ориентированное программирование на C ++ с приложениями в компьютерной графике (2-е изд.). Британская библиотека: Спрингер. п. 391. ISBN  1852334509. Получено 11 февраля 2020.
  2. ^ Мартин Ричардс (1967). Справочное руководство BCPL (PDF). Массачусетский Институт Технологий. п. 11.
  3. ^ а б c Майк Хой. "Нужна цитата". Получено 28 января 2014.
  4. ^ Том Ван Влек (1995). «IBM 7094 и CTSS». Получено 28 января 2014.
  5. ^ а б Дейкстра, Эдсгер Вайбе (2 мая 2008 г.). «Почему нумерация должна начинаться с нуля (EWD 831)». Архив Э. В. Дейкстры. Техасский университет в Остине. Получено 2011-03-16.
  6. ^ Браун, Джим (декабрь 1978 г.). «В защиту происхождения индекса 0». ACM SIGAPL APL Quote Quad. 9 (2): 7. Дои:10.1145/586050.586053. S2CID  40187000.
  7. ^ Хуэй, Роджер. "Является ли начало индекса 0 помехой?". jsoftware.com. JSoftware. Получено 19 января 2015.
  8. ^ Программирование Microsoft® Visual C #® 2005, Донис Маршалл
  9. ^ Сал Хан. 1 класс по математике / значение места / числовая сетка. Ханская академия. Получено 28 июля, 2018. Название на YouTube: Сетка чисел / Счет / Ранняя математика / Академия Хана
  10. ^ Бирн, Ричард В. «Думающая обезьяна: эволюционное происхождение интеллекта». Получено 2010-05-18.
  11. ^ Данбар, Робин. «Человеческая история - новая история эволюции человечества». Получено 2010-05-18.