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



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

Может ли кто-нибудь дать мне некоторые примеры его использования, например, как реализовать приложение словаря (например, ABBYY Lingvo) с использованием хэш-таблиц?

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

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

Большое спасибо.

845   5  

5 ответов:

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.