![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
dened |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Суть задачи такая.
Нужно удалить из текстового файла повторяющиеся слова. Причем текстовый файл очень большой, порядка 200 000 строк и повторяющихся слов там тоже очень много ![]() Пример мама папа мама бабушка дед мама Результат должен быть мама папа бабушка дед Может это уже решалось здесь, но честное слово искал около часа. Находил тока работу с символами. Хотя может это и почти одно и тоже. |
![]() ![]() |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Решение включает в себя две основных задачи:
1. составление словаря; 2. поиск по словарю. Поскольку размер словаря может быть весьма немалым, и заранее он неизвестен, то желательно использовать динамическую память. При указанном количестве строк и колличество слов может значительно превышать возможности сегмента (64К), так что придется структурировать. Если использование ТР не обязательно, то рекомендую взять 32-битный сомпилятор (например, FPC). Структурирование все равно весьма желательно для ускорения работы и уменьшения размеров. Структура базы данных (словаря) может быть как самой простой (слова в одном массиве of char, разделенные пробелами в алфавитном порядке), так и более сложной Например, блоки описанной струтуры, пронумерованные буквами - или парами, тройками букв. Вот наглядная иллюстрация сказанного: 1-й способ (1): а агат аз азот астра аська береза боб бор бочка вода воск восток дед дело дочь дочка 2-й способ с нумерацией одной буквой (2): !а ? гат з зот стра ська !б ереза об ор очка !в ода оск осток !д ед ело очь очка 2-й способ с нумерацией двумя буквами (3): 1а ? 2г ат 2з ? от 2с тра ька 1б 2е реза 2о б р чка 1в 2о да ск сток 1д 2е д ло 2о чь чка "?" означает слово без продолжение, только из нумерующих букв. Реально этот знак не нужен - два пробела подряд выполняют его роль. Даже на глаз видно, что (2) выигрывает по объему по сравнению с (1). Способ (3) на первый взгляд и сложнее, и места больше требует. Про сложность спорить не буду, но выигрыш в месте там будет заметен при бОльшем размере словаря. Вот, примерно так.. Выбирай, что нарвится ![]() Да, еще про поиск.. Его можно вести дихотомией с самого начала - либо можно хранить карту пронумерованных блоков. Внутри блока - дихотомия.. ![]() Ну, а само удаление слов - дело несложное.. ломать - не делать! ![]() PS Уточни также, что считать разделителями слов. Надеюсь, только пробелы.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
dened |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
PS Уточни также, что считать разделителями слов. Надеюсь, только пробелы.. Разделителем является enter. Lapp ![]() Мое решение, то есть пока идея, такова Создать новый файл и копировать туда слова. берем новое слово и ищем его во втором файле, если нет, то записываем, иначе берем следующие слово из первого файла ![]() Зы: как я понял обращатся к определенному участку текстового файла нельзя?? или можно, если можно подскажите плиз функцию или процедуру, которая это делает |
dened |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 4 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Еще думаю если исключить вариант с доп. файлом, выгоднее использовать структуру типа списка ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 6:50 |