Одна из вещей, которую мне не хватает при написании программ на C, - это структура данных словаря. Какой самый удобный способ реализовать его на C? Я ищу не производительность, а простоту написания кода с нуля. Я тоже не хочу, чтобы он был универсальным - подойдет что-то вроде string-> int. Но я действительно хочу, чтобы он мог хранить произвольное количество элементов.
Это больше задумано как упражнение. Я знаю, что есть сторонние библиотеки, которые можно использовать. Но подумайте на мгновение, что их не существует. В такой ситуации самый быстрый способ реализовать словарь, удовлетворяющий указанным выше требованиям.
c
data-structures
dictionary
Рохит
источник
источник
Ответы:
В разделе 6.6 языка программирования C представлена простая структура данных словаря (хеш-таблицы). Я не думаю, что полезная реализация словаря могла бы быть проще, чем эта. Для вашего удобства я воспроизвожу код здесь.
Обратите внимание, что если хэши двух строк сталкиваются, это может привести к увеличению
O(n)
времени поиска. Вы можете уменьшить вероятность столкновений, увеличив значениеHASHSIZE
. Полное обсуждение структуры данных см. В книге.источник
hashval = *s + 31 * hashval;
именно 31 и больше ничего?Самый быстрый способ - использовать уже существующую реализацию, например uthash .
И, если вы действительно хотите кодировать его самостоятельно, алгоритмы
uthash
можно изучить и использовать повторно. Он имеет лицензию BSD, поэтому, кроме требования об авторском праве, у вас есть довольно много ограничений в том, что вы можете с ним делать.источник
Для простоты реализации сложно превзойти наивный поиск по массиву. Если не считать проверки на ошибки, это полная реализация (непроверенная).
источник
Создайте простую хеш-функцию и несколько связанных списков структур, в зависимости от хеша, назначьте связанный список, в который нужно вставить значение. Используйте хэш для его получения.
Некоторое время назад я сделал простую реализацию:
источник
GLib и гнулиб
Это ваш лучший выбор, если у вас нет более конкретных требований, поскольку они широко доступны, портативны и, вероятно, эффективны.
GLib: https://developer.gnome.org/glib/ от проекта GNOME. Несколько контейнеров задокументированы по адресу: https://developer.gnome.org/glib/stable/glib-data-types.html, включая «Хеш-таблицы» и «Сбалансированные двоичные деревья». Лицензия: LGPL
gnulib: https://www.gnu.org/software/gnulib/ от проекта GNU. Вы должны скопировать и вставить исходный код в свой код. Несколько контейнеров, задокументированных по адресу: https://www.gnu.org/software/gnulib/MODULES.html#ansic_ext_container, включая «rbtree-list», «connectedhash-list» и «rbtreehash-list». Лицензия GPL.
См. Также: Существуют ли библиотеки C с открытым исходным кодом с общими структурами данных?
источник
вот быстрый способ, я использовал его, чтобы получить «матрицу» (sruct) из строки. вы можете иметь больший массив и также изменять его значения при запуске:
источник
Я удивлен, что никто не упомянул набор библиотек hsearch / hcreate, который, хотя и недоступен в Windows, но обязателен POSIX и, следовательно, доступен в системах Linux / GNU.
Ссылка содержит простой и полный базовый пример, который очень хорошо объясняет ее использование.
У него даже есть потокобезопасный вариант, он прост в использовании и очень производительный.
источник
Хеш-таблица - это традиционная реализация простого «Словаря». Если вам не важны скорость или размер, просто погуглите . Есть много свободно доступных реализаций.
вот первый, который я увидел - на первый взгляд, мне кажется, что это нормально. (это довольно просто. Если вы действительно хотите, чтобы он содержал неограниченное количество данных, вам нужно добавить некоторую логику для «перераспределения» памяти таблицы по мере ее роста.)
удачи!
источник
Хеширование - это ключ. Я думаю, что для этого нужно использовать таблицу поиска и ключ хеширования. Вы можете найти множество функций хеширования в Интернете.
источник
Самый быстрый способ - использовать двоичное дерево. Его худший случай также только O (logn).
источник