2014-02-20 4 views
1

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

Однако, разве это не означает, что массивы - это всего лишь тип хеша, который использует числовой ключ? Поскольку нет оснований полагать, что реализация массива будет автоматически поддерживать последовательный характер индексов массива (когда вы удаляете или вставляете элементы, например), есть ли какая-либо большая разница, чем встроенный порядок массива?

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

Я пришел к этому вопросу, узнав о массивах и хэшах в Ruby on Rails, но это общий вопрос.

ответ

0

Хеш - это по существу массив. У хэш-клавиш есть некоторая функция преобразования, чтобы перевести объект другого типа (или целочисленный набор других значений) в целочисленный индекс массива. И наоборот, массив - это хэш, который не переводит ключи в отдельный тип или значение индекса. Однако при вызове массива Hash подразумевает дополнительный уровень функциональности, которого не существует, поскольку преобразование ключа отсутствует.

По определению объекты массива хранятся в последовательных местах в памяти, доступных по индексу.

Даже если использовать любой тип структуры данных, одно преимущество использования хэшей с ключами Integer заключается в том, что большее разброс целых чисел может быть сохранен в меньшем количестве ковшей. Например, если ваши числовые клавиши имеют 5 целых чисел около 1, 10, 100, 1000 и 10000, вам не нужны ведра 10K, чтобы иметь хэш из этих 5 элементов, но для этого вам нужно много, если вы используете прямолинейный массив. Хэш-функции, как правило, пересчитываются, и больше памяти перераспределяется по мере роста хэша, и преимущество использования массива состоит в том, что его размер можно более легко контролировать и может оставаться фиксированным.

+1

Хорошо, так что выгода от наличия отдельных реализаций массивов и хешей является одним из сложности? Другими словами, иногда массив делает все необходимое, поэтому использование хэша с числовым ключом происходит от массива, до хэша, обратно в массив (из-за того, что вы делали о преобразовании ключей в целые числа), обратно в хеш , которые вы затем вынуждаете вести себя как массив!Должен ли я думать о хэшах как о добавлении некоторой функциональности в структуру данных массива, а в том, что массив является особым случаем хэш-структуры данных? – NectarSoft

+0

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

+1

Хорошо, спасибо. Хотя они кажутся одинаковыми или очень похожими, я думаю, что они, по сути, разные звери. Мне кажется, что всякий раз, когда это необходимо, массив должен быть предпочтительным. Хэши предназначены для разных ситуаций, когда целью является не просто хранить диапазон данных, но когда важно, что такое ключ массива. Спасибо за объяснение @ La-comadreja. – NectarSoft

0

Вот как это описывает декларативное программирование.
Difference between Declarative and Procedural Programming?
http://en.wikipedia.org/wiki/Procedural_programming
http://en.wikipedia.org/wiki/Declarative_programming

Есть примитивные, композит, и абстрактные структуры данных.
- Массив композитный.
- Хэш абстрактный.

У нас есть и то, и другое, потому что они принципиально разные. Например, вы не можете поп/push примитивов в хеш, как вы можете, с помощью массива, потому что хэш использует неупорядоченные значения ключа, в то время как массив имеет индекс.

http://en.m.wikipedia.org/wiki/List_of_data_structures

+0

Спасибо за ссылку, но я не уверен, что это правильно. Абстрактный тип данных - это описание типа данных, заданного исключительно по функциональности. Поскольку вы можете описать массив математически как тип данных двух действий (get (A, i) и set (A, i, V)), так что get возвращает элемент в позиции «i» и устанавливает множество элементов в позиции «i» 'to' V ', так что get (set (A, i, V), i) = V, массив также может быть абстрактным типом данных. Я полагаю, что они представляют собой разные типы данных, как указано в комментариях выше, но я оспариваю, что это потому, что они принадлежат к разным категориям. – NectarSoft

+0

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

+0

Отличное объяснение этого на SO: http://stackoverflow.com/questions/1619834/difference-between-declarative-and-procedural-programming – wurde

Смежные вопросы