какие другие структуры данных, кроме массива, поддерживают произвольный доступ?

Я пытаюсь подумать, есть ли какая-либо другая структура данных, поддерживающая произвольный доступ (т.е. постоянная временная сложность). Мне кажется, что таким образом строится только массив.

Примечание: вы не можете построить структуру данных поверх массива.


person Community    schedule 04.09.2011    source источник
comment
Может ли это включать структуры данных, построенные поверх массивов? Большинство будет построено с использованием массива, например хеш-таблицы.   -  person Chris S    schedule 04.09.2011
comment
Нет, вы не можете строить поверх массива - я редактировал;)   -  person    schedule 04.09.2011
comment
Означает ли поддержка временную сложность O(1) для произвольного доступа? Я могу сделать так, чтобы бинарное дерево разрешало произвольный доступ, но это не будет O(1)   -  person Flexo    schedule 04.09.2011


Ответы (3)


Хэш-таблицы также допускают произвольный доступ по ключу. Таким образом, в отличие от массивов, они основаны на ключах, а не на индексах, но все же допускают доступ O (1) к данному элементу.

person Darin Dimitrov    schedule 04.09.2011
comment
Да, но они обычно реализуются с использованием массива хешированных ключей. - person Matteo; 04.09.2011
comment
добавить циклический буфер к построенному с использованием массивов со списком произвольного доступа O (1) - person Flexo; 04.09.2011
comment
Разве ключ не является просто индексом массива с использованием хеша и модуля? - person Chris S; 05.09.2011

В конце концов, это зависит от того, что вы подразумеваете под «массивом». Я скажу вам, что ОЗУ представляет собой большой массив байтов (технически большой массив байтов плюс некоторые перегруженные методы для их чтения блоками по 1, 2, (почти всегда) 4 и (иногда) 8 байт, которые не всегда работают. ну (или не работает точка), если вы попытаетесь прочитать, начиная с байта, «не выровненного» с этим номером). Итак, все построено поверх массива.

Если под «массивом» вы имеете в виду только «структура языка, который я использую, вызывает массив и все структуры этого языка, основанные на этом массиве», тогда я мог бы просто (в коде C) malloc блок памяти и использовать его в способ, похожий на массив (и, возможно, построить поверх него хеш-таблицу). Ключевое слово "похожие".

При наличии достаточного виртуального адресного пространства вы можете использовать VirtualAlloc (в Windows, mmap в Linux) для эмуляции хеш-таблицы с использованием MMU вашего компьютера. Это было бы довольно дорого и бесполезно :-) И я бы все равно считал, что это массив с другим именем («разреженный» массив).

person xanatos    schedule 04.09.2011

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

person Junaid Qadir Shekhanzai    schedule 04.09.2011