Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск повторений в текстовом файле 
V
    Опции темы
Wizlight
Дата 17.2.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть текстовый файл - база чисел рулетки 1-36,0,00.(порядка 100000 чисел)
Программа должна обработать данные файла и вывести отдельно в новый текстовый файл все "комбинации" чисел заданной длины (например комбинация из 5 чисел: 14 5 00 21 12) которая встречается 2 и больше раз в базе чисел.

Как лучше это реализировать по скорости и рациональности?

У меня есть несколько вариантов:
1) Обрабатываем текстовый файл(базу чисел) как 1 стринг, где числа отделены пробелом. Копируем с начала стринга первых 5 чисел(пусть интересует длина именно в 5 чисел), ищем через pos эту подстроку дальше в файле, если нашли - ищем дальше вдруг еще есть комбинация. После поиска во всем файле этой комбинации, начинаем искать другую комбинацию - следующие 5 чисел от начала файла(то есть от второго до 6-го числа) и так далее пока не дойдем до конца 
2)  Обрабатываем текстовый файл (базу чисел) как массив чисел. То есть предварительно заганяем все числа с файла в массив целых чисел, и по похожему принципу с вариантом 1 ищем повторения комбинаций. Только тут поиск как я понимаю будет проходить по сравнению сразу 5-ти индексов чисел, которые будут сравниватся со следующими 5-а индексами чисел, которые будут смещаться до конца массива на +1. После первой проверки берем следующих 5 чисел и снова проделываем даную операцию.

В дальнейшем было бы не плохо чтобы программу переделать так, чтобы выводила в файл отдельно не только идентичные комбинации, а такие например где не совпадает только одно число. Например 25 16 9 13 31 и 25 16 17 13 31. Имхо 2-м способом это проще реализировать

Буду благодарен за новые идеи, подсказки, как лучше решить мою задачу. Спасибо за внимание
PM MAIL   Вверх
Fhusy
Дата 8.3.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



что значит 100000 чисел? чисел то всего 38: 1-36, 0,00; и какова структура базы? каким образом там числа хранятся?
PM MAIL   Вверх
Romkin
Дата 12.3.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

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



Лучше поздно, чем никогда smile
Задача интересная, искать так - пустая трата времени процессора.
Надо:
1. прочитать файл в массив байт, с перекодировкой (прибавить смещение чтобы не было кода 0, например числа от 1 до 38).
2. в конец массива добавить нулевой байт.
3. создать массив из PAnsiChar (это ссылка) с количесивом элементов по количеству символов (100000 - легко), каждый элемент которого указывает на очередной символ, т.е. первый - на первый элемент массива, второй - на второй.
4. упорядочить этот массив строк по возрастанию
5. пройти по нему, выделяя рядом стоящие строки, начинающиеся на одинаковую комбинацию заданной длины.
6. просмотреть значения ссылок, убирая пересекающиеся последовательности. Например, если будет последовательность 1 1 1 1 1 1, а длина задана 5, то получится две последовательности из 5 единиц, вторая - со второго символа первой.
PM ICQ   Вверх
northener
Дата 13.3.2011, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Romkin @  12.3.2011,  22:45 Найти цитируемый пост)
Задача интересная, искать так - пустая трата времени процессора.
Надо:

А вы уверены, что поиск по массиву строк будет быстрее чем поиск по массиву байт по алгоритму BMH?

Это сообщение отредактировал(а) northener - 13.3.2011, 03:32


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Romkin
Дата 14.3.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

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



Цитата(northener @  13.3.2011,  03:31 Найти цитируемый пост)
А вы уверены, что поиск по массиву строк будет быстрее чем поиск по массиву байт по алгоритму BMH?

В моем варианте поиска нет. И скорее всего это быстрее, чем выполнять поиск примерно 100000 раз по массиву 100000 байт, я практически в этом уверен, да.
Массива строк тут нет, есть массив остатков, фактически память занимается на N*(SizeOf(byte)+ SizeOf(Pointer)).
И мне еще кажется, что "алгоритм BMH", если это алгоритм  Бойера — Мура — Хорспула, подходит в этом варианте мало. 
Стоило бы рассмотреть применение алгоритма Рабина-Карпа, с хешированием. Точнее, его идею. Например, считать хеш для заданного количества символов для каждой позиции, далее упорядочить хеши (что в данном случае можно сделать за O(n)), и исключить ложные срабатывания. Кажется, здесь время O(n) можно получить, для фиксированной длины комбинации. Затраты на память - практически те же.
В принципе, если длина комбинации мала, можно не хешировать. Но практически все варианты, что мне приходят в голову, основаны так или иначе на сортировке, именно она обычно используется в том или ином виде для поиска дубликатов. 

PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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