Вверх ↑
Ответов: 2059
Рейтинг: 132
#1: 2014-02-12 17:31:06 ЛС | профиль | цитата
Хеш-таблицы - для чего нужны и с чем их едят?
http://ru.wikipedia.org/wiki/%D5%E5%F8-%F2%E0%E1%EB%E8%F6%E0

В интернете есть куча описаний ещё более мудрёных и не дающих ответа, - "а нафига?".
Хеш-таблицы придуманы для быстрого поиска нужного значения в массиве.
Они ускоряют этот процесс в сотни и тысячи раз.
Пример:
Есть текст на русском - весом 1 мегабайт и есть русско-английский словарь в сотню тысяч и более слов.
Надо перевести текст на английский.
Если решать задачу в лоб, т.е. искать каждое русское слово и соответствующее ему импортное в массиве словаря методом сравнения сток, то затратим десятки минут. Используя хеш-таблицу, затраченное время будет меньше секунды.
Понятно, что при небольших массивах не стоит этим морочить себе мозги.
Это компонент http://yadi.sk/d/M5JqCyjwHzpqC.
Добавление и удаление + изменение строк уже реализовано.

Интерфейс для такого компонента не очевиден.
Ниже приведены вопросы + ваши хотелки и советы.
Надо учитывать временные затраты на те или иные функции, - компонент то, по определению, для скорости.

1. Необходимо ли добавление и удаление строк, или ограничиться загрузкой файла?
Изменение значений массива и изменение количества строк на выборку не влияют, а пересчет таблицы достаточно быстрый, то имеет смысл. Так что пересчет можно делать после каждого изменения.
2. Нет смысла в сортировке.
Единственное при записи...
Мне вообще нужна такая сортировка:

ВВС=ВэВээС
ВДВ=Вэ Дэ Вэ
ВИП=вип
ВКС=ВэКаэС
ВМС=ВэМээС
ВМФ=ВэМэ эФ
ВЧК=ВэЧэ-Ка
В1=бэ1
В2=Вэ2
В5=Вэ5
ВР=Вэ-эР
ВЧ=Вэ-Че
входите в ту же организацию=вхо`дите в ту же организацию
в их число не входите=в их число не вхо`дите
вид у * был чудной=вид у * был чудно`й
вы мне не подходите=вы мне не подхо`дите
время * *му пошло=время * *му пошло`
воды в рот набрал=воды` в рот набрал
все новые и новые=всё новые и новые
в * раза большим=в * раза бо`льшим
в связи с этим,=в связи` с этим,
в чем их вина?=в чём их вина`?
вот мы и дома=вот мы и до`ма
в этом * аду=в этом * аду`
во время сориентировался=во`время сориентировался
вкалывал как проклятый=вкалывал как про`клятый
в переносном смысле=в перено`сном смысле
вы хорошо держитесь=вы хорошо де`ржитесь
в приподнятом *нии=в припо`днятом *нии
в чудовищное жерло=в чудовищное же`рло
в жарку=в жа`рку
в жилой=в жило`й
в карму=в карму`
в клещи=в кле`щи
высокопревосходительство=высо`ко-превосходи`тельство
высокопревосходительству=высо`ко-превосходи`тельству
высококвалифицирован*=высо`ко-квалифици`рован
выведем=вы`ведем
вырыв=вы`рыв
+ по алфавиту, только по первой литере.
Думаю, что все дела можно сделать на стороне.

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

4. Когда ключ в виде простой строки - проблем нет.
Когда ключ в виде маски - чуть сложнее, но не напрягает.
Увеличивается колличество дубликатов,но на скорости практически не отражается.
Поэтому нужно увеличивать вспомогательную таблицу.
Допустим для 1000 строк нужен кусок памяти 1300 -1500 * 4 байт, в случае с маской 2 * 4 килобайта.
Другое дело выделение из текста строки для ключа под маску типа " *ид у * был чудно* ".
Поэтому:
а) Сделать две входные точки с маской и без и две функции расчета таблицы - скорости создания таблиц немного отличаются.
б) Встроить функцию парсинга текста,
в) Нарисовать отдельный IC для примера и использования,
г) Каждый сам знает, что ему нужно.
Наверняка чего то упустил.

карма: 6

0