Почему доступ к любому элементу в массиве осуществляется в постоянное время (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.
все зависит от того, сколько памяти занимает объект, который вы хранить в массиве. Просто помните, что массивы занимают целый блок памяти.