![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Святогор |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 9.8.2006 Репутация: нет Всего: нет |
Приветствую всех!
Появилась идея создать структуру с самым быстрым поиском. Вот допустим, как обычно создаются структуры, допустим для проверки некоторых слов в тексте:
Создается обычный массив записей. И каждое слово в тексте сравнивается с полем item. И при совпадении вызывается некоторый обработчик. Сложность в том, что скорость поиска данного решения очень низкая, особенно если текст большой и словарь на 100 тыс. слов. Пойдем другим путем. Заведем список для слов (item) и все ту же структуру, только без поля item.
Не важно, в каком виде все это дело храниться на диске (текстовый файл, БД). Список слов, заведомо отсортирован. При заполнении данного списка происходит следующий процесс: 1. В список TItems добавляются слова 2. Структура заполняется в соответствии с номерами, т.е. если слово "интеллект" в списке под номером 1567, то в массиве ItemAttr аттрибуты этого слова также храняться под этим номером. В итоге получается, что между списком и массивом записей существует связь, через номер. Теперь, для того что бы найти какое-либо слово в нашей структуре 1. Обращаемся к методу списка Find который очень быстро(за миллисекунды в огромных списках) находит нужное слово. 2. Зная позицию найденного слова, обращаемся к массиву. Это лишь моё предложение. Мне просто нужно быстро находить нужные слова. Подскажите, пожалуйста, подходит ли подобное решение и насколько оно оптимально. Или посоветуйте более лучший и удобный подход. Спасибо заранее! |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Используй не массив, а TStringList.
Присвой ему аттрибут Sorted и ищи через Find - быстрее не придумаешь Для добавления итемов используй sl.AddObject('слово', pointer(item)); Для поиска if sl.Find('слово', pointer(item)) then |
|||
|
||||
| Святогор |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 9.8.2006 Репутация: нет Всего: нет |
||||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
При добавлении в лист, тебе фообще массив не нужен.
Добавляй сразу указатель на свою структуру. Хотя, чтобы меньше перебелывать, можешь оставить и массив. Тогда добавляй не указатель, а индекс: Wordlist.AddObject('слово', pointer(i)); Получить индекс
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |