Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Сверхбыстрый поиск

Ответить
Настройки темы
Теория - Сверхбыстрый поиск

Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Изменения
Автор: ManHack
Дата: 24-02-2010
Добрый вечер!
Мне нужно реализовать очень быстрый поиск в маленькой таблице из сорока элементов.
Поиск по таблице будет прогоняться десятки-сотни тысяч раз подряд, поэтому нужен быстрый алгоритм.
Пораскинув мозгами я пришёл к выводу, что без хэш-таблицы тут не обойтись... (к правильному выводу пришёл я?)
Каков наиболее быстрый алгоритм поиска в хэш-таблице? Что мне использовать?
Или же есть что-то, работающее быстрее в данной ситуации, чем хэш-поиск.

Таблица фиксированная, в процессе поиска меняться не будет, её можно изначально упорядочить наиболее удобным образом (рекомендации?).

Отправлено: 18:36, 24-02-2010

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 995

Профиль | Сайт | Отправить PM | Цитировать


Цитата ManHack:
рекомендации? »
Зависят от типа данных по которому идет поиск.
Приведи пример записи таблицы.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 20:52, 24-02-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


В таблице два поля: строка и множество (паскалевский перечислимый тип).
Т.е. одна запись таблицы выглядит, например, так:
DEFENITION | ccDef
где DEFENITION - строка - ключ, по которой ведётся поиска, а ccDef - элемент множетства ( ccDef, ccTor, {...} , ccAss, ccOp ) - данные, которые мы ищем по ключу.

Отправлено: 17:54, 25-02-2010 | #3


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить PM | Цитировать


ManHack, думаю хэшь стоит использовать если строки большого размера.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Отправлено: 19:27, 25-02-2010 | #4


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Строки маленькие, до десяти символов.
Что можно сделать, чтобы не возникало коллизий?

ganselo, а раз не хэш, тогда что? что будет работать быстрее поиска по хэш-таблице в такой ситуации?

Отправлено: 01:04, 26-02-2010 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


кажись только хеш по самому различаемому (из 40 статичных строчек) символу + длина строчки (если различается)

Отправлено: 00:02, 28-02-2010 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата ManHack:
Пораскинув мозгами я пришёл к выводу, что без хэш-таблицы тут не обойтись... (к правильному выводу пришёл я?) »
Как вы связываете зрение и слух - Если уши отрезать, папаха на глаза упадёт ;-)
По хэшу тоже надо как-то искать - т.е. это не ответ на вопрос об алгоритме поиска. Тем более, хэш надо вычислять на каждом шаге. Есть большое подозрение, что на таком небольшом количестве данных тупой перебор со сравненим окажется самым выгодным.

Отправлено: 11:47, 03-03-2010 | #7


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Нужно придумать идеальную хеш-функцию для слов ARRAY, BY, BEGIN, CASE далее по списку (чтобы значения хеш-функции для различных слов из списка не совпадали)
Цитата:
EnterKW('ARRAY', lexNone);
EnterKW('BY', lexNone);
EnterKW('BEGIN', lexBEGIN);
EnterKW('CASE', lexNone);
EnterKW('CONST', lexCONST);
EnterKW('DIV', lexDIV);
EnterKW('DO', lexDO);
EnterKW('ELSE', lexELSE);
EnterKW('ELSIF', lexELSIF);
EnterKW('END', lexEND);
EnterKW('EXIT', lexNone);
EnterKW('FOR', lexNone);
EnterKW('IF', lexIF);
EnterKW('IMPORT', lexIMPORT);
EnterKW('IN', lexNone);
EnterKW('IS', lexNone);
EnterKW('LOOP', lexNone);
EnterKW('MOD', lexMOD);
EnterKW('MODULE', lexMODULE);
EnterKW('NIL', lexNone);
EnterKW('OF', lexNone);
EnterKW('OR', lexNone);
EnterKW('POINTER', lexNone);
EnterKW('PROCEDURE', lexNone);
EnterKW('RECORD', lexNone);
EnterKW('REPEAT', lexNone);
EnterKW('RETURN', lexNone);
EnterKW('THEN', lexTHEN);
EnterKW('TO', lexNone);
EnterKW('TYPE', lexNone);
EnterKW('UNTIL', lexNone);
EnterKW('VAR', lexVAR);
EnterKW('WHILE', lexWHILE);
EnterKW('WITH', lexNone);
Я придумал так:
for i := 1 to length (Stroka) do
result := result + Stroka[i]*31; (символы строки складываются и каждый раз домножается на 31)
hash := result mod SizeOfHashTable;

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

Как использовать повторное хеширование?

Последний раз редактировалось ManHack, 04-03-2010 в 23:44.


Отправлено: 23:23, 04-03-2010 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


ИМХО первая буква XOR вторая
а сочетание {первая, втроая, последняя} - вобще уникальное

Отправлено: 07:56, 05-03-2010 | #9


Аватара для ManHack

Старожил


Сообщения: 361
Благодарности: 6

Профиль | Отправить PM | Цитировать


Цитата pva:
ИМХО первая буква XOR вторая
а сочетание {первая, втроая, последняя} - вобще уникальное »
первая XOR вторая - не подходит, т.к. REPEAT и RECORD, например.
первая XOR последняя, первая XOR вторая XOR последняя, длина слова XOR первая XOR последняя, длина слова XOR вторая XOR последняя, XOR всех букв - все они дают коллизии на данном множестве из 34 слов.
Пишу так:
Код: Выделить весь код
hash := ord(Name[1]) XOR ord(Name[length(Name)]);
Какие ещё будут идеи?

Отправлено: 12:33, 06-03-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Теория - Сверхбыстрый поиск

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
IBM представляет сверхбыстрый процессор на графеновых транзисторах OSZone News Новости железа 0 06-02-2010 04:30
Поиск в IE Guest Хочу все знать 21 03-03-2004 09:52




 
Переход