Musala Soft Logo Конкурс по програмиране на Musala Soft и PC Magazine Bulgaria PC Magazine Bulgaria Logo
  Състезателна система
Сезон 2010 - 2011
Сезон 2009 - 2010
Сезон 2008 - 2009
Сезон 2007 - 2008
Сезон 2006 - 2007
Сезон 2005 - 2006
Сезон 2004 - 2005
Правила
Задача 1
Задача 2
Задача 3
Задача 4
Задача 5
Задача 6
Класиране
Финален кръг
Сезон 2003 - 2004
Сезон 2002 - 2003
Сезон 2001 - 2002
Сезон 2000 - 2001

Задача 2 от брой 11/2004 - ИМЕНА - Анализ


Втората задача от Конкурса е така наречения проблем за най-къс съдържащ низ (shortest superstring). Задачата е NP-трудна, поради което намирането на оптималния отговор за всеки тестов пример би било невъзможно в приемливо време. Ето защо, в условието се изискваше състезателите да намерят колкото се може по-добро решение. Няма да се спираме върху понятията за NP-трудна и NP-пълна задача, а ще препоръчаме на любознателния читател да се обърне към някоя книга разглеждаща сложност на алгоритми или за кратък увод да прочете началото на анализа на задача 4 от Конкурса 2002-03.

Нека с S1, S2, …, SN означим низовете от входния файл. А с overlap(i,j) бележим максималното застъпване на два низа Si и Sj дължината на най-дългия низ, който е едновременно наставка на Si и представка на Sj. Без ограничение на общността  можем да приемем, че никой от дадените низове не съдържа в друг. Ако такива има, то можем да ги намерим в процеса на изчисление на застъпванията и да ги игнорираме.

Алгоритъм, намиращ оптималното решение на задачата е този пробващ всички възможни нареждания на низовете един след друг и след това застъпва всеки два последователни възможно най-много. Ако едно нареждане на дадените низовете е i1, i2, … iN, то дължината на низа съдържащ дадените при тази наредба ще е |Si1| + | Si2| + … + | SiN| - overlap(i1, i2) - overlap(i2, i3) - … - overlap(iN-1, iN). За съжаление всички възможни нареждания са N!, което е твърде голямо (за информация 100! е число с над 150 цифри). Ето защо, (почти) всички решения на задачата се състоят условно от две части: изчисляване на застъпванията между всички двойки низове и намиране на подходяща наредба на низовете.

За първата част могат да се използват няколко ефективни алгоритми. Участниците, запознати с анализа на задача 1 от миналогодишния Конкурс (2003-04) или съответните алгоритми ще се досетят, че overlap(i,j) може се изчисли чрез алгоритъма Кнут-Морис-Прат или Z-алгоритъма. Понеже ние се интересуваме от всички overlap(i,·), то е по-разумно да се използва обобщената версия на KMP алгоритъма - алгоритъма на Ахо-Корасик (описан в анализа на споменатата задача). Друг подход е да се построи суфиксно дърво или суфиксен масив за дадените низове и да се използват свойствата му за намиране на застъпванията. През изминалите няколко години се появиха и първите линейни алгоритми за построяване на суфиксен масив на даден низ  - характеристика, която имаха суфиксните дървета, но на цената на много повече памет. Един от тях може да бъде намерен на http://www.cs.helsinki.fi/juha.karkkainen/publications/icalp03.pdf .

Втората част на решението под една или друга форма разглежда проблема за възможно най-добро нареждане на низовете, така че сумарното застъпване между всеки два последователни низа, да е колкото се може по-голямо. Един подход е да се построи ориентиран граф и в него да се разглежда задачата за намиране най-къс цикъл, минаващ през всички върхове (задачата за търговския пътник). Върховете на графа са N+1 – по един съответстващ на всеки низ (vi съответства на Si)  и един начален v0 (имащ фиктивна роля). Теглото (дължината) на реброто от vi до vj (нека го означим с w(i,j)) отразява с колко удължаваме строения от нас низ, ако в края му досега е Si и добавим Sj с възможно най-голямо застъпване т.е. w(i,j) = |Sj| - overlap(i,j). Дефинираме w(0,i) = |Si| и w(i,0) = 0 за всяко i > 0, за да съответства най-късия цикъл в граф на най-дългия низ съдържащ всички дадени. За намиране на добро решение на задачата за търговския пътник близко до оптималното (approximation algorithm)  има различни техники, описани в научната литература. Една от тях е да се използва задача за назначенията (виж задача 3 от Конкурса 2002-03), чрез която намираме цикли нямащи общи върхове и обхващащи всички върхове на графа, общата дължина на които е възможно най-малка. След което обединяваме тези цикли в един.

Ако предпочитаме да не разглеждаме задачата като графова една възможна идея е следната: на всяка стъпка избираме двата низа които имат максимален overlap и ги заменяме с най-късия който съдържа само двата; прилагайки това N-1 пъти накрая ще остане един низ, съдържащ всички дадени низове, защото на всяка стъпка броя на низовете намалява с едно. Друг алгоритъм е този на Blum, Jiang, Li, Tromp и Yannakakis в статията им “Linear approximation of shortest superstring”  - виж  http://citeseer.ist.psu.edu/blum91linear.html . А една по-нова статия е тази на Breslauer, Jiang, и Jiang – Rotations of Periodic Strings and Short Superstrings” - виж http://citeseer.ist.psu.edu/breslauer96rotations.html .

Трима участника успяват да решат дадените тестови примери във времевото ограничение: Ростислав Руменов (Шумен), Радослав Герганов (София) и Илиан Илиев (София), като те заемат първите три места. Победител в този кръг е Ростислав Руменов от Шумен, чието решение се справя най-успешно с всички поставени тестове примери. Анализът на решението му може да намерите тук.


За въпроси можете да ни пишете на адрес: konkurs@musala.com.

Supported by Musala Soft Ltd.

Copyright 2000-2010 by Musala Soft Ltd. All rights reserved.