Хэш-таблицы VS ассоциативные массивы

недавно я прочитал о хэш-таблицы в очень известной книги "введение в алгоритмы". Я еще не использовал их в каких-либо реальных приложениях, но хочу. Но я не знаю, с чего начать.
Может ли кто-нибудь дать мне несколько примеров его использования, например, как реализовать словарное приложение (например, ABBYY Lingvo) с помощью хэш-таблиц?
И, наконец, я хотел бы знать, в чем разница между хэш-таблицами и ассоциативными массивами в PHP, я имею в виду какую технологию следует использовать и в каких ситуациях?
Если я ошибаюсь (прошу прощения), пожалуйста, поправьте меня, потому что на самом деле я начинаю с хэш-таблиц, и у меня есть только базовые (теоретические) знания о них.
Большое спасибо.

5 ответов


в PHP ассоциативные массивы реализуются как хэш-таблицы с некоторой дополнительной функциональностью.

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

например, вы можете выполнить цикл через ассоциативный массив, используя цикл for, что вы не можете сделать с хеш-таблице.

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

примеры кода:

использование ассоциативного массива в качестве хэш-таблицы:

$favoriteColor = array();
$favoriteColor['bob']='blue';
$favoriteColor['Peter']='red';
$favoriteColor['Sally']='pink';
echo 'bob likes: '.$favoriteColor['bob']."\n";
echo 'Sally likes: '.$favoriteColor['Sally']."\n";
//output: bob likes blue
//        Sally likes pink

петля через ассоциативный массив:

$idTable=array();
$idTable['Tyler']=1;
$idTable['Bill']=20;
$idTable['Marc']=4;
//up until here, we're using the array as a hashtable.

//now we loop through the array - you can't do this with a hashtable:
foreach($idTable as $person=>$id)
    echo 'id: '.$id.' | person: '.$person."\n";

//output: id: 1 | person: Tyler
//        id: 20 | person: Bill
//        id: 4 | person: Marc

Примечание. особенно, как во втором примере поддерживается порядок каждого элемента (Тайлер, Билл Марк) на основе порядка, в котором они были введены в массив. Это основное различие между ассоциативными массивами и хэш-таблицами. Хэш-таблица не поддерживает связи между элементами, которые она содержит, в то время как ассоциативный массив PHP делает (вы даже можете сортировать ассоциативный массив PHP).


PHP массивы в основном хэш-таблицы


разница между ассоциативным массивом и хэш-таблицей заключается в том, что ассоциативный массив является типом данных, а хэш-таблица-реализацией данных. Очевидно, что ассоциативный тип массива очень важен во многих текущих языках программирования: Perl, Python, PHP и т. д. Хэш-таблица-это основной способ реализации ассоциативного массива, но не единственный способ. И ассоциативные массивы являются основным использованием хэш-таблиц,но не единственным. Это не значит, что они одинаковы, но если у вас уже есть ассоциативные массивы, то вам обычно не стоит беспокоиться о разнице.

по соображениям производительности может быть важно знать, что ваши ассоциативные массивы на вашем любимом языке реализованы как хэши. И может быть важно иметь некоторое представление о накладных расходах на эту реализацию. Хэш-таблицы медленнее и используют больше памяти, чем линейные массивы, как вы видите их в C.

Perl объединяет два понятия вместе, вызывая ассоциативный массивы "хэши". Как и ряд функций Perl, это не совсем неправильно, но это небрежно.


массив в PHP на самом деле является упорядоченной картой, а не хэш-таблицей. Основное различие между map и hashtable заключается в невозможности запомнить порядок, в котором были добавлены элементы. С другой стороны, хэш-таблицы намного быстрее, чем карты. Сложность извлечения элемента из карты-O(nlogn), а из hashtable-O (1).


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

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