irene221b: (Default)
[personal profile] irene221b
Интересная алгоритмическая проблемка.

Есть набор строк (одной длины, но это вроде бы неважно). Есть два параметера: Х - максимальное число позволенных do-not-care симоволов, и N - максимальное число строк в результате. Нужно разбить исходный набор в соответствии с этими параметерами, ну или установить, что это невозможно.

Например:
1 2 3 1 2 3 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 3 3 3 7 8 9

При Х = 3 результат такой: 1 2 3 ? ? ? 7 8 9, но при Х = 2 это уже не годится, нужно выдать:
1 2 3 ? ? 3 7 8 9
1 2 3 4 5 6 7 8 9

Строки запихнуты в ternary tree, которое позволяет поиск всех строк на опредленном расстоянии от данной строки, а так же поиск всех строк, удовлетворяющих шаблонам с do-not-care.

Но можно запихнуть и в какую-нибудь другую структуру.

Date: 2009-07-01 04:32 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
Да вроде бы никаких деревьев не надо, можно в лоб сделать.

Давай сложим эти строки в двумерный массив символов, после чего пройдемся по всем столбцам этого массива. Для каждого столбца вернем True, если все символы в нем равны, а иначе False. Если количество False столбцов больше чем X - решения нет. Если не больше, то все хорошо, можно строить ответ.
Проходим по любой строке, если для текущей позиции у нас насчитано True - выписываем символ из этой позиции, а если нет - пишем '?'.

Virtual keyboard is in another tab. :-)

Date: 2009-07-01 04:42 pm (UTC)
From: [identity profile] irene221b.livejournal.com
In my example your 2d array would return

true true true false false false true true true.

And yet there is a solution for X = 2.

Date: 2009-07-01 04:45 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
Тогда я не понял условия задачи. Что нужно сделать в том случае, если невозможно найти шаблон, описывающий все строки? В твоем случае при X=2 такого шаблона не существует.

Date: 2009-07-01 05:27 pm (UTC)
From: [identity profile] irene221b.livejournal.com
Результат может состоять из нескольких строк (максимум N). В случае Х=2, правильный ответ:
1 2 3 ? ? 3 7 8 9
1 2 3 4 5 6 7 8 9

Если все можно было бы запихнуть в одну строку, и только сказать да или нет, то мне вообще никакая структура не нужна была бы, можно было бы строить результат даже по мере получения строк по одной.

Date: 2009-07-01 07:07 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
А, теперь понял. Надо найти минимальное количество шаблонов, которые вместе описывают все данные строки.

Ушел думать..

Date: 2009-07-01 08:39 pm (UTC)
From: [identity profile] irene221b.livejournal.com
Ну я ж сказала, интересная. :-)

Количество строк - до сотни, размер примерно 16 байт.

Date: 2009-07-01 07:13 pm (UTC)
From: [identity profile] ahaxopet.livejournal.com
А какого размера наш набор строк по порядку величины? Десятки, тысячи, миллионы?
From: [identity profile] igorm.livejournal.com
запихнуть исходный список в ternary tree. Затем каждую строчку искать по кроссвордному принципу, то ест для Х=3 и первой строчки нужно будет искать все совпадения для . . . 1 2 3 7 8 9, потом 1 . . . 2 3 7 8 9, потом для 1 2 . . . 3 7 8 9 и так далее. Если нашлось хотя бы два слова то то можно остановится, то что мы ищем подходит под шаблон, 1 2 3 . . . 7 8 9, например. Если нашлось только по одному разу за все проходы то тогда эта сама строчка. Вроде должно работать.

Date: 2009-07-03 06:00 am (UTC)
From: [identity profile] petro-gulak.livejournal.com
C днем рождения! Всего самого лучшего!

Date: 2009-07-03 02:20 pm (UTC)
From: [identity profile] irene221b.livejournal.com
Спасибо. :-)

Date: 2009-07-03 06:14 am (UTC)
From: [identity profile] v-kolmanovsky.livejournal.com
Если АЛГОРИТМ это не ЛИМЕРИК, то задача не для меня. Я больше по лимерикам...

Если б лампу мне дал Ападдин,
Я б велел, чтоб отвез меня джин
На ковре-самолёте
Не к какой-нибудь тёте,
А к Ирэн 221

Не нужны мне ни А и ни Б,
Пусть сидят себе там на трубе.
С днем рожденья поздравлю
И, конечно, оставлю
Благодарность счастливой судьбе.

Заявляю открыто пред всеми я
Ни к чему мне скандал и в Богемии.
Нет, не Адлер мой Бог,
Да и я не Шерлок,
Извините, коль вдруг не по теме я

Некий старый смешной господин,
Но ценитель ликеров и вин,
Нынче выпьет мускату
За прекрасную дату,
За Ирен 221


Спасибо. :-)

Date: 2009-07-03 02:22 pm (UTC)
From: [identity profile] irene221b.livejournal.com
Третий надо было закончить:

Извините за, гхм, ударение. ;-)

Re: Спасибо. :-)

Date: 2009-07-03 08:41 pm (UTC)
From: [identity profile] v-kolmanovsky.livejournal.com
Уходил от варианта:

Нет, Не Адлер Ирэн,
Что взяла меня в плен...

да и 221b обязывают...

Re: Спасибо. :-)

Date: 2009-07-03 10:13 pm (UTC)
From: [identity profile] irene221b.livejournal.com
Нет, я про тот, где ударение ШерлОк.

А 221 отлично срифмовалось как раз.

Re: Спасибо. :-)

Date: 2009-07-03 10:46 pm (UTC)
From: [identity profile] v-kolmanovsky.livejournal.com
Так и я про тот. Следует заменить обе строки с ШЕрлоком, на те две, которые я заменил на ШерлОка... А 221 требовало упоминание либо Бейкер-стрит, либо владельца адреса. Элементарно!
Твой Ватсон...

Date: 2009-07-03 11:19 am (UTC)
From: [identity profile] zmist.livejournal.com
Держи голую непроверенную идею, :-) если понравится детали дальше сама проработаешь.

Алгоритм по идее однопроходный относительно движения по тернарному траю (TST), но распараллеливающийся на набор отслеживаемых путей движения по нему. Основной принцип: отслеживаем все валидные пары (n,x) таких что 1<=n<=N, 0<=x<=X, по мере продвижения вглубь TST по всем возможным путям.

Начинаем с корня TST, отслеживаем пока что единственный путь, начатый из корня, множество пар инициализируем парой (1,0).

Крутим циклы "времени" продвижения по TST (т.е. по входным данным), затем по всем текущим узлам TST на всех отслеживаемых путях продвижения.

На каждом шаге смотрим кол-во ветвлений текущего узла на текущем пути TST - обозначим m.

Пока m==1 просто продвигаемся дальше. Как только встречается ветвление m>1, так для каждой пары (n,x) множества делаем ее замену двумя парами (n,x+1) и (n+m-1,x), но добавляя при этом только валидные пары с n<=N и x<=X. Заменяем отслеживание текущего пути в TST на мониторинг m дальнейших вариантов.

Цикл заканчивается либо когда множество пар оказалось пустым (решения нет), либо когда все входные данные успешо проанализированны. Тогда из множества берется любая лучшая пара, т.е. та у которой минимально сначала n затем x. Где-то параллельно (видимо, как-то ассоциированно с отслеживаемыми путями и парами) должны еще строиться возможные шаблоны результата, чтобы потом у наилучшей пары взять ее ассоциированный шаблон.

Profile

irene221b: (Default)
irene221b

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28 293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 12th, 2026 07:43 am
Powered by Dreamwidth Studios