![]() |
|
|
![]()
|
|
| Psyhonaut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.10.2005 Где: Петрозаводск Репутация: нет Всего: нет |
Поискал поиском по форуму, нашлось пару тем, но в них идет обсуждение что такое полиндромы и т.д.Но самого алгоритма не нашлось.
Подскажите пожалуйста алгоритм нахождения полиндромов.Желательно самый эффективный.Мож у кого и исходник завалялся, тож не откажусь Заранее спасибо. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
пример на C++
подходит? если нет, то неплохо было бы описать нахождение каких именно палиндромов нужно или, может быть, всех? тогда перебирать все строки и делать из них палиндромы... -------------------- qqq |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Палиндром находится перебором. И в зависимости от длинны текста(чет нечет). Прочто с двух краев идешь по буквам слова, и если встретились неодинаковые- берешь другое слово. Задача интереснее, когда в тексте найти самый длинный палиндром.
-------------------- Всем добра |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: нет Всего: 44 |
а че тут интереснее то |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
if str == strreverse(str) {cout << str;}
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Psyhonaut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.10.2005 Где: Петрозаводск Репутация: нет Всего: нет |
В программу передается текст.Необходимо найти все полиндромы.Просто задачку задали по предмету комбинаторные алгоритмы, вот и думаю, мож существует какой хитрый комбинаторный алгоритм.Идея сравнивать буквы по краям возникала.
Как эффективнее хранить слово?Просто можно создать заведомо большой массив, и запоминать, при считывании длину слова, чтоб знать с какого элемента в конце сравнивать.Или есть более эффективный способ? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну тогда можно например так:
перебираем по очереди все символы строки (кроме первого и последнего) и проверяем, являются ли они центрами палиндромов и, если да, то каких от каждого символа растягиваем отрезок в обе стороны, пока буквы по краям одинаковые на каждом шаге выводим содержимое отрезка это даст все палиндромы с нечетной длиной для получения палиндромов с четной длиной ищем в строке те места, в которых два одинаковых символа стоят друг рядом с другом и делаем для них то же, что и для одного символа пример: строка: qweretteq 1. для получения нечетных палиндромов: первый пропускаем, берем w добавляем соседние символы: qwe, т.к. символы по краям разные - забываем про w для e - то же самое берем r, добавляем соседей: ere, символы по краям одинаковые - выводим, добавляем еще соседей: weret, символы по краям разные - прекращаем проверяем остальные символы - здесь больше палиндромов с нечетной длиной нету 2. для получения четных палиндромов: ищем i: s[i]=s[i+1] находим tt, выводим добавляем соседей: ette символы по краям одинаковые - выводим добавляем соседей: retteq символы разные прекращаем... -------------------- qqq |
|||
|
||||
| nostromo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 194 Регистрация: 23.3.2006 Репутация: 5 Всего: 10 |
То Psyhonaut:
"Ваш способ меня не устраивает, он слишком простой." Чем предложение Akina то не подходит? И к чему вопрос как эффективнее хранить слово, std::string недостаточно эффективен? Бешеные требования к производительности? --------------------
На пыльных тропинках далеких планет останутся наши следы. |
|||
|
||||
| Psyhonaut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.10.2005 Где: Петрозаводск Репутация: нет Всего: нет |
Преподователь просто такой(одна из его фраз - "Олимпиадники(имеется ввиду участники мирового чемпионата по програмированию) делают такую задачу за два цикла, вы мне за один напишите"). Начал я писать програмку, пока что только для слов с четным количеством букв написал.Но есть какие то странные баги.Когда ее запускаю, выдает ошибку I/O. Прошелся я по строчкам, проследил процесс выполнения, вот что обнаружил.Массив для хранения слова - 10 элементов. Начинаю считывать слово(просто для примера, взал слово из 4 букв, после слова стоит запятая).Считывает все 4 буквы, потом считывает запятую, после этого он по идее должен идти на проверку слова(полиндром ли?), так как обнаружен разделитель(запятая), но прога продолжает считывать символы.После запятой пустота, т.е. должен закончится цикл, так как он задан так while (символ <> EoF), но продолжает считывать в массив символ с кодом 26.Причем считывает пока не накидает в массив 18 элементов(хотя размерность массива 10 В чем проблема, помогите пожалуйста. Во вложении программа.Только что копался в ней, пытался исправить, мож чего намудрил, так как рубит уже страшно. Заранее спасибо за помощь. Присоединённый файл ( Кол-во скачиваний: 17 )
Polindrom.rar 22,00 Kb |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
для текста длины n можно за O(n*log(n)):
0) Пробегаемся по всему тексту и запоминаем где какая буква стояла в разные массивы [любые контейнеры, в которое возможно добавление за О(1) и бинарный поиск за O(log2(N)) ]. Далее для каждой буквы исходного текста A: (пусть cur - текущая буква) 1) использую массивы из 0) находим бинарным поиском где в A стоит следующая буква A[cur]. Пусть это будет next 2) Если подстрока A[cur] .. A[next] полиндром, то полиндром найден. 3) Находим следующий next 4) Когда все next'ы закончились - увеличиваем cur, и переходим к шагу 1. Мы применяем бинарный поиск N раз что даёт оценку в O(N*log(N)). Худший случай - строка вида AAAA. В лучшем случае (строка ABC) затрачивается Θ(N), этот результат является оптимальным =) Пример. Дана ABABACB 0) A встречается на 1, 3, 5 позиции, B встречается на 2,4,7 позиции C встречается на 6 1) Берём первую A. Следующая A встречается на 3 позиции. Подстрока ABA - полиндром Берём следующую(третью) A. Подстрока ABABA полиндром. Больше A нет 2) Берём B. Следующая B - на 4 позиции BAB полиндром. Следующая B - на 7 позиции, BABACB не полиндром 3) Берём A. Следующая A на 5 позиции. ABA полиндром. Более А нет. 4) Берём B. Следующая B на 7 позиции. BACB не полиндром 5) A на 5 позиции. Далее A нет. 6) С на 6 позиции. Далее C нет 7) B на 7 позиции. Далее B нет. Это сообщение отредактировал(а) Mayk - 17.5.2006, 06:26 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Для текста с количеством символов n слов N можно за O(N)+O(n) при условии что весь текст можно загрузить в переменные программы в памяти.
1) Регуляркой или по одному символу заменить все небуквенные символы на пробелы. 2) Регуляркой или мультипроходно заменить группы пробелов на одиночные пробелы. 3) Разбить текст на слова функцией Split в массив. 4) Протестить каждое слово (элемент массива) на str == strreverse(str) . -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Psyhonaut |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 23.10.2005 Где: Петрозаводск Репутация: нет Всего: нет |
Программа написана, всем спасибо за помощь.Тему можно закрывать
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |