Почему доступ к любому элементу в массиве осуществляется в постоянное время (O (1)?

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

для меня то, что происходит за кулисами, вероятно, выглядит примерно так:

a) поиск выполняется линейно (например, я хочу получить доступ к элементу 5. Я начинаю поиск с индекса 0, если он не равен 5, я иду к индексу 1 и т. д.) Это O (n) -- где n-длина массива

b) Если массив хранится как B-дерево, это даст O (log n)

Я не вижу другого подхода.

может кто-нибудь объяснить, почему и как это делается в O(1)?

5 ответов


массив начинается с определенного адреса памяти start. Каждый элемент занимает одинаковое количество байт element_size. Элементы массива расположены один за другим в памяти от начального адреса. Таким образом, вы можете вычислить адрес памяти элемента i С start + i * element_size. Это вычисление не зависит от размера массива и поэтому O(1).


теоретически элементы массива имеют одинаковый известный размер и расположены в непрерывной части памяти, поэтому, если начало массива расположено в A адрес в памяти, если вы хотите получить доступ к любому элементу, вы должны вычислить его адрес такой:

A + item_size*index так это постоянное время работы.


доступ к одному элементу не находит элемент, значение которого x.

доступ к элементу i означает получение элемента в i-й позиции массива.

это делается в O(1) потому что это довольно просто (постоянное количество математических вычислений), где элемент находится с учетом индекса, начала массива и размера каждого элемента.

оперативная память предлагает постоянное время (или, точнее, ограниченное время) чтобы получить доступ к каждому адресу в ОЗУ, и так как поиск адреса O(1), а получение элемента в нем также O (1), это дает вам в общей сложности O(1).

Поиск, если элемент, значение которого x на самом деле Omega(n) проблема, если нет дополнительной информации о массиве (сортируется, например).


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


Если у вас есть массив Int. Каждый int 32 бит в java . Если у вас есть, например, 10 целых чисел в java, это означает, что вы выделяете память 320 бит. Тогда компьютер знает

0-индекс находится в памяти, например-39200

последний индекс находится в памяти 39200 + общая память вашего массива = 39200+320= 39520

Итак, если вы хотите получить доступ к индексу 3. Тогда это 39200 + 32*3 = 39296.

все зависит от того, сколько памяти занимает объект, который вы хранить в массиве. Просто помните, что массивы занимают целый блок памяти.