![]() |
|
![]() ![]() ![]() |
|
Yura_Matsuk |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 16.5.2004 Репутация: нет Всего: нет |
Доброе время суток, коллеги. Я начинающий программист. Пишу на Дельфи. Столкнулся с такой алгоритмической задачей:
Что дано: Есть текстовый файл, содержащий большое кол-во строк (до 10000). Строки состоят из слов, которых может быть до 7 в строке. Для удобства слова будем обозначать английскими буквами. Что нужно получить: Список строк по следующему принципу. 1. Берем строку, состоящую из 1 слова, например, 'a', выводим ее. 2. Ищем все строки, состоящие из 2 слов и содержащие 'a'. 3. Далее для всех найденных на шаге 2 строк ищем строки, состоящие из 3 слов, содержащие оба слова исходной строки, выводим их. 4. Аналогично, ищем 4-словники, содержащие все слова любого из найденных 3-словников, выводим их. И так далее, пока строки будут находиться. 5. Когда подходящих строк уже не оказывается, мы выбираем другую строку из 1 слова, т. е. переходим к шагу 1. Уточнения: Любая строка обрабатывается не более одного раза. Порядок слов в строке при поиске значения не имеет. Что уже сделано: 1. Слова занесены в хэш-таблицу и однозначно определяются своим индексом, чтобы работать не со строками string, а с массивами чисел, где каждый элемент - число, обозначающее определенное слово. 2. Строки отсортированы с помощью кучи в порядки возрастания кол-ва слов. Собственно, в чем вопрос: есть ли оптимальный алгоритм, выполняющий поиск следующей подходящей строки (шаг 3)? --------------------
Смех смехом, а ОНА кверху мехом... |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Конечные автоматы. ИМХО оптимальнее некуда. Это самый оптимальный алгоритм по сложности(не сложности написания
![]() Конечно, можно поколдовать с хэш-таблицей, но это куда дольше и не гарантирую, что строка будет обрабатываться один раз. Хотя... Для хэш таблицы есть вариант. Пусть все слова- простые числа в хэш таблице. Тогда каждую строку можно записать как произведение всех слов в ней(на глазок- числа для разных строк разные будут(разные строки- отличающиеся более чем на 1 слово)). Итак. Берем строку, которую будем искать в других. Просто делим строку, в которой ищем на строку которую ищем. Если число целое, то получили true. Но произведение слов и его уникальность надо проверить. Вообще юзай автоматы ;) -------------------- Всем добра ![]() |
|||
|
||||
Yura_Matsuk |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 16.5.2004 Репутация: нет Всего: нет |
Мысль про произведение мне понравилась, благодарю. Хотя сложность там все равно квадратичная получается от кол-ва строк.
А что есть автоматы? Это сообщение отредактировал(а) Yura_Matsuk - 10.10.2007, 18:49 --------------------
Смех смехом, а ОНА кверху мехом... |
|||
|
||||
SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Почитай любую книжку по Дискретной Математике для студентов. Там должно быть. Но сперва смотри оглавление
![]() В двух словах- автомат позволяет производить поиск подстроки в строке за линейное время. Вроде так. Давно ими не занимался ![]() -------------------- Всем добра ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Поскольку выбор "однословных" строк произволен, достаточно исходный текст отсортировать не по количеству слов, а тупо так по алфавиту.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Yura_Matsuk |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 16.5.2004 Репутация: нет Всего: нет |
Или я чего-то не понимаю, или Вы ошибаетесь. Ведь при таком порядке:
Строка a b не обработается, а должна. --------------------
Смех смехом, а ОНА кверху мехом... |
||||
|
|||||
Akina |
|
||||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Слушайте, либо вам нужно
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |