Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск "дополняющей" строки 
:(
    Опции темы
Yura_Matsuk
Дата 10.10.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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)?
--------------------
Смех смехом, а ОНА кверху мехом...
PM MAIL   Вверх
SoWa
Дата 10.10.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Конечные автоматы. ИМХО оптимальнее некуда. Это самый оптимальный алгоритм по сложности(не сложности написания smile)

Конечно, можно поколдовать с хэш-таблицей, но это куда дольше и не гарантирую, что строка будет обрабатываться один раз. Хотя...
Для хэш таблицы есть вариант. Пусть все слова- простые числа в хэш таблице. Тогда каждую строку можно записать как произведение всех слов в ней(на глазок- числа для разных строк разные будут(разные строки- отличающиеся более чем на 1 слово)). Итак. Берем строку, которую будем искать в других. Просто делим строку, в которой ищем на строку которую ищем. Если число целое, то получили true. Но произведение слов и его уникальность надо проверить. Вообще юзай автоматы ;)


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Yura_Matsuk
Дата 10.10.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 16.5.2004

Репутация: нет
Всего: нет



Мысль про произведение мне понравилась, благодарю. Хотя сложность там все равно квадратичная получается от кол-ва строк.
А что есть автоматы?

Это сообщение отредактировал(а) Yura_Matsuk - 10.10.2007, 18:49
--------------------
Смех смехом, а ОНА кверху мехом...
PM MAIL   Вверх
SoWa
Дата 10.10.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Почитай любую книжку по Дискретной Математике для студентов. Там должно быть. Но сперва смотри оглавление smile
В двух словах- автомат позволяет производить поиск подстроки в строке за линейное время. Вроде так. Давно ими не занимался smile Я все так, в общем, знаю.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Akina
Дата 10.10.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Поскольку выбор "однословных" строк произволен, достаточно исходный текст отсортировать не по количеству слов, а тупо так по алфавиту.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Yura_Matsuk
Дата 11.10.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 16.5.2004

Репутация: нет
Всего: нет



Цитата(Akina @  10.10.2007,  18:54 Найти цитируемый пост)
Поскольку выбор "однословных" строк произволен, достаточно исходный текст отсортировать не по количеству слов, а тупо так по алфавиту. 

Или я чего-то не понимаю, или Вы ошибаетесь. Ведь при таком порядке:
Код

a b
b

Строка a b не обработается, а должна.
--------------------
Смех смехом, а ОНА кверху мехом...
PM MAIL   Вверх
Akina
Дата 11.10.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Слушайте, либо вам нужно
Код
ORDER BY FullLine
либо
Код
ORDER BY WordsCount, FullLine
либо вам нужно более внятно объяснить, чего именно вы добиваетесь.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0936 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.