Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
1 | ||||||
оптимизировать алгоритм поиска вхождений строки в текстовый файл (1 Мб)08.09.2012, 13:36. Показов 2050. Ответов 11
Метки нет (Все метки)
Здравствуйте.
По заданию требовалось составить программу для подсчета вхождений разных сочетаний букв с алфавита от 1 буквы до 4 в текстовый файл, размером 1 Мб. Т.е, например, для латиницы это a, b, c, ... z, aa, ... az, aaaa, ..., zzzz. Только алфавит надо было взять не латинский (я взял греческий). Результаты поиска записать в файл .csv через запятую. Программу то я написал, да вот выполняется она минут 80 (проц 2-х ядерный Intel D525 с частотой 1,8 ГГц), но все же, хотелось бы как-нибудь уменьшить эту цифру. Помогите оптимизировать алгоритм. Да, пишу под Linux. Вот код:
0
|
08.09.2012, 13:36 | |
Ответы с готовыми решениями:
11
Получить текстовый файл g путём смены вхождений в файл f строки s1 на s2 Дан текстовый файл f и две строки s1 и s2. Получить текстовый файл g заменой ввода в файл f строки s1 на s2 Дан текстовый файл f из целых чисел. Переписать этот файл в g без повторных вхождений цифр Создать и заполнить текстовый файл f получить файл g образованнный из файла f c исключением повторных вхождений одного и того же слова |
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
08.09.2012, 14:16 | 2 |
Эм. Делаете четыре массива: одномерный, двухмерный, трёхмерный и четырёхмерный. Размером, соответственно, сколько-букв-в-алфавите по каждому измерению. Заполняете нулями. Там мегабайт памяти или типа того на них надо для греческого.
Делаете четыре циклических буфера (на основе std::deque): на один, два, три и четыре символа соответственно. Читаете файл посимвольно, если это не буква, ничего не делаем, если буква — заносим её во все буферы с конца. Если буфер полный, то предварительно выкидываем первый символ, чтобы в буфере всегда было один–четыре символа соответственно. После каждого чтения буквы смотрим на полные буферы и делаем +1 в каждый из массивов по координатам, соответствующих символам, хранящимся в буфере. В принципе, можно даже обойтись одним буфером на четыре символа. И одним четырёхмерным массивом (выделить, к примеру, двадцать пятую букву под меньшую размерность).
1
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
08.09.2012, 14:26 | 4 |
fix:
если это не буква,
0
|
║XLR8║
|
||||||
08.09.2012, 15:51 | 5 | |||||
Дай свой файл для теста, напишу покажу что вышло.
П.С. алгоритмы http://e-maxx.ru/algo/prefix_function http://e-maxx.ru/algo/rabin_karp Добавлено через 1 час 22 минуты MrGluck, еще такой момент, я так и не понял ты ищешь вхождение 1 подстроки или массива
Во втором случае тебе надо этот: http://e-maxx.ru/algo/aho_corasick
1
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
08.09.2012, 16:32 [ТС] | 6 |
Спасибо, много полезной информации.
Файл с текстом. https://dl.dropbox.com/u/24221707/text.txt А вхождения нужно искать для каждого сочетания от a до zzzz, а ответ выглядит например так: a, 2011 b, 1789 ... zzzz 0
0
|
║XLR8║
|
|||||||||||
08.09.2012, 21:19 | 7 | ||||||||||
MrGluck, надо и прописные и строчные символы?
Добавлено через 27 минут Никогда не любил комбинаторику...
1. Здесь без вопросос только Ахо-Корасика надо 2. Можно еще распаралелить. Оптимальным количеством потоков считается N+2, где N - количество ядер процессора. Я бы для этого дела использовал boost::thread так как native pthread на линухе мне не нрав. Раньше я мог дать оценку времени выполнения исходя с асимптотики, но сейчас мощности очень выросли, затрудняюсь ответить. Добавлено через 3 минуты UPD: Спец символы надо? Я видел в файле цифры, знаки препинания скобки... Добавлено через 4 часа 12 минут Мда, а гречесский текст найти сложно? Это не гречесский алфавит, и такст также. В гречесском алвафите всего 24 символа, а утебя около 28.
1
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
09.09.2012, 02:31 [ТС] | 9 |
outoftime, нужно только строчные с алфавита. В греческом 24 буквы, но одну особенную обозначают 2 символами (выходит 25, не задавать же диапазон из 2 отрезков).
Буду вкуривать Ахо-Карасика . Чувствую, много кофе уйдет. Распараллеливание пока точно не трону (лвл не тот).
0
|
║XLR8║
|
|
09.09.2012, 13:10 | 10 |
MrGluck, а я наоборот, написал КМП и пробую распаралелить, еще добавил индикация прогресса. Кстати, если ты не заметил файл со строками что надо искать занимают 2.3 метра а сам текст 1 метр.
Добавлено через 10 часов 19 минут Задача в лоб решается элементарно, полный перебор рулит.
1
|
║XLR8║
|
|
09.09.2012, 16:20 | 11 |
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||||||||||
10.09.2012, 13:20 [ТС] | 12 | ||||||||||
Почитав Ахо-Корасика и про суффиксальные деревья, меня натолкнула на мысль одна идея. Вот, в корни переделал алгоритм. Теперь выполняет за 15 секунд (для нетбука неплохо).
С компаратором неверно считает... Почему? Добавлено через 17 часов 40 минут Исправил ошибку, вот конечный исходник. Результаты работы совпадают с результатами брутаса (1 вариант).
0
|
10.09.2012, 13:20 | |
10.09.2012, 13:20 | |
Помогаю со студенческими работами здесь
12
Есть текстовый файл, первый символ каждой строки записать в другой текстовый файл дан текстовый файл.перенести в текстовый файл все строки, содержащие заданное слово Файл: Создайте текстовый файл, содержащий в начале каждой строки гласные буквы соответствующей строки файла, а в конце строки - согласные LINQ запрос для поиска вхождений строки Определить число вхождений заданной цепочки символов в текстовый файл Преобразование строки в байты: оптимизировать алгоритм Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |