Задача разбиения множества чисел

Задача разбиения множества чисел — это задача определения, можно ли данное мультимножество S положительных целых чисел разбить на два подмножества S1 и S2, таких, что сумма чисел из S1 равна сумме чисел из S2. Хотя задача разбиения чисел является NP-полной, существует решение псевдополиномиального времени методом динамического программирования и существуют эвристические алгоритмы решения для многих конкрентных задач либо оптимально, либо приближённо. По этой причине задачу называют "простейшей NP-трудной задачей"[1].

Существует оптимизационная версия задачи разбиения, в которой требуется разбить мультимножество S на два подмножества S1 и S2, таких, что разность между суммой элементов S1 и суммой элементов S2 минимальна. Оптимизационная версия является NP-трудной задачей, но на практике может быть решена эффективно[2].

Примеры

Если дано множество S={3,1,1,2,2,1}, допустимым решением задачи разбиения являются два множества S1={1,1,1,2} и S2={2,3}. Оба множества имеют сумму 5, и они являются разбиением множества S. Заметим, что это решение не уникально. S1={3,1,1} и S2={2,2,1} является другим решением.

Не любое мультимножество положительных целых чисел имеет разбиение на две части с равными суммами. Пример такого множества — S={2,5}.

Алгоритм псевдополиномиального времени

Задача может быть решена с помощью динамического программирования, если размер множества и размер суммы целых чисел в множестве не слишком велики, чтобы требования в памяти не стали невыполнимыми.

Представим вход алгоритма как список вида:

S=x1, ..., xn

Пусть N — число элементов в множестве S. Пусть K — сумма всех элементов из множества S. То есть K=x1 + ... + xn. Мы построим алгоритм, который определяет, существует ли подмножество S, сумма элементов которого равна . Если подмножество существует, то:

если K чётно, то остаток множества S также даст
если K нечётно, остаток множества S даст сумму . Это лучшее возможное решение.

Рекуррентные соотношения

Мы хотим определить, существует ли подмножество S, сумма элементов которого равна . Пусть:

p(i, j) принимает значение True, если среди { x1, ..., xj } существует такое подмножество, элементы которого в сумме дают i и False в противном случае.

Тогда p(, n) принимает значение True тогда и только тогда, когда существует подмножество S, сумма которого равна . Цель нашего алгоритма — вычислить p(, n). Для достижения этого мы имеем следующие рекуррентные формулы:

p(i, j) принимает значение True, если либо p(i, j − 1) принимает значение True, либо p(ixj, j − 1) принимает значение True
p(i, j) принимает значение False в противном случае

Причина этому следующая: существует некоторое подмножество S, сумма которого равна i для чисел

x1, ..., xj

тогда и только тогда, когда одно из двух верно:

существует подмножество { x1, ..., xj-1 }, дающее сумму i;
существует подмножество { x1, ..., xj-1 }, дающее сумму ixj, поскольку xj + сумма этого подмножества=i.

Псевдополиномиальный алгоритм

Алгоритм строит таблицу размера на n, содержащую значения рекурсии, где — сумма значений, а — число элементов. Когда вся таблица заполнена, возвращаем . Ниже приведена таблица P. На рисунке синяя стрелка из одного блока в другой, если значение конечного блока может зависеть от значения исходного блока. Эта зависимость является свойством рекуррентного отношения.

Зависимости ячеек (i, j) таблицы
INPUT:  Список целых чисел S
OUTPUT: True, если S может быть разбито на два подмножества, имеющих одинаковые суммы
1 функция найти_разбиение(S):
2     n ← |S|
3     Ksum(S)
4     P ← пустая булева таблица размера ( + 1) by (n + 1)
5     инициализируем верхнюю строку (P(0,x)) таблицы P значениями True
6     инициализируем крайний левый столбец (P(x, 0)) таблицы P, за исключением ячейки P(0, 0) значениями False
7     для i от 1 до 
8         для j от 1 до n
9             если (i-S[j-1]) >= 0
10               P(i, j)P(i, j-1) или P(i-S[j-1], j-1)
11            иначе
12               P(i, j)P(i, j-1)
13    вернуть значение P(, n)

Пример

Ниже приведена таблица P для использованного выше множества S={3, 1, 1, 2, 2, 1}:

Результат выполнения алгоритма

Анализ

Этот алгоритм работает за время O(K N), где N — число элементов во входном множестве, а K — сумма элементов во входном множестве.

Алгоритм может быть распространён на задачу мультиразбиения на k частей, но требует памяти O(n(k − 1)mk − 1), где m является наибольшим числом во входном множестве, что делает алгоритм практически бессмысленным даже для k = 3, если только на вход не подаются очень маленькие числа[2].

Специальный случай задачи о сумме подмножеств

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

Аппроксимирующие алгоритмы

Существуют некоторые эвристические алгоритмы для аппроксимации оптимизационной задачи разбиения. Они могут быть расширены до точных алгоритмов линейного времени[2].

Жадный алгоритм

Один из подходов к задаче, имитирующий способ ребёнка партнёра для игры, жадный алгоритм, который перебирает числа в порядке убывания и добавляет каждое число к меньшей сумме. Этот подход имеет время работы O(n log n). Этот эвристический алгоритм работает хорошо на практике, если числа в множестве примерно одного порядка, однако алгоритм не гарантирует получение лучшего возможного разбиения. Например, если в качестве входа дано множество S={4, 5, 6, 7, 8}, этот жадный алгоритм привёл бы к разбиению S на подмножества {4, 5, 8} и {6, 7}. Однако S имеет точное сбалансированное разбиение на подмножества {7, 8} и {4, 5, 6}.

Известно, что этот жадный подход даёт 76-аппроксимацию относительно оптимального решения оптимизационной версии. То есть, если вывод жадного алгоритма даёт два множестваs A и B, тогда , где OPT — размер наибольшего множества в лучшем разбиении[3]. Ниже приведён пример (на языке Python) жадного алгоритма.

def find_partition(int_list):
    "Разбиваем `int_list` на два множества с одинаковыми суммами "
    A=set()
    B=set()
    for n in sorted(int_list, reverse=True):
        if sum(A) < sum(B):
           A.add(n)
        else:
           B.add(n)
    return (A, B)

Алгоритм может быть распространён на случаи k > 2 множеств — выбираем k наибольших элементов, распределяем их по k множествам, затем перебираем оставшиеся числа в порядке убывания и добавляем их к множеству с меньшей суммой (простая версия выше соответствует k = 2). Эта версия работает за время O(2k n2) и известно, что она даёт аппроксимацию [3]. Таким образом, мы имеем приближенную схему полиномиального времени (PTAS) для задачи разбиения на несколько частей, хотя это не полностью приближенная схема полиномиального времени (время работы экспоненциально для желаемого уровня гарантированной аппроксимации). Однако существуют варианты этой идеи, которые являются полностью приближенными схемами полиномиального времени для задачи о сумме подмножеств, а следовательно, и для задачи разбиения[4][5].

Разностный алгоритм

Другой эвристический алгоритм — метод наибольшей разности (МНР, en:Largest Differencing Method, LDM)[6], который называется эвристическим методом КармаркараКарпа[2], по имени учёных, опубликовавших метод в 1982[7]. МНР имеет две фазы. Первая фаза алгоритма берёт два наибольших числа из входа и заменяет их разностью. Повторяем операцию, пока не останется одно число. Замена представляет решение разместить два числа в разные подмножества, но в какие множества эти числа размещаются, решение не принимается. В конце первой фазы оставшееся единственное число является разностью двух сумм подмножеств. На втором этапе строится актуальное решение[1].

Разностный эвристический алгоритм работает лучше, чем жадный алгоритм, но остаётся плохим для задач, в которых числа экспоненционально зависят от размера множества[1].

Следующий код на Java представляет первую фазу алгоритма Кармаркара – Карпа. Алгоритм использует кучу для эффективного поиска пары наибольших чисел среди оставшихся.

int karmarkarKarpPartition(int[] baseArr) {	
    // create max heap	
    PriorityQueue<Integer> heap=new PriorityQueue<Integer>(baseArr.length, REVERSE_INT_CMP);

    for (int value : baseArr) {		
        heap.add(value);	
    }

    while(heap.size() > 1) {
        int val1=heap.poll();	
        int val2=heap.poll();	
        heap.add(val1 - val2);
    }

    return heap.poll();
}

Другие подходы

Существуют также алгоритмы с отсечением по времени[англ.], основанные на разностной эвристической схеме, которые сначала находят решение, полученное разностной эвристической схемой, затем находится поступательно лучшие решения, если время позволяет (возможен экспоненциальный рост времени работы для получения оптимального решения в худшем случае)[8][9].

Сложные случаи

Множества с только одним или отсутствием разбиений чаще всего наиболее сложны (или наиболее расточительны) для получения решения относительно размера входа. Если значения малы по сравнению с размером множества, хорошие разбиения наиболее вероятны. Известно, что задача претерпевает «фазовый переход», когда хорошие разбиения наиболее вероятны для одних множеств и маловероятны для других. Если m — число бит, необходимых для выражения любого числа из множества, а n — размер множества, то при задача чаще имеет много решений, а при задача чаще имеет одно решение, либо не имеет решения вообще. Когда n и m становятся больше, вероятность хорошего разбиения стремится к 1, а плохого к 0 соответственно. Этот факт первоначально основывался на эмпирических результатах Гента и Уолша[10], затем на методах статистической физики (Мертенс[11][12]) и, наконец, факт доказали Боргс, Чайес[англ.] и Питтель[13].

Варианты и обобщения

Существует задача о 3-разбиении множества чисел[англ.], которая ищет разбиение множества S на |S|/3 тройки, каждая тройка с той же суммой. Эта задача совершенно отличается от задачи разбиения и не имеет алгоритма с псевдополиномиальным временем работы, если только не P=NP[14].

Задача разбиения на несколько множеств обобщает оптимизационную версию задачи разбиения. Здесь целью является разбиение множества или мультимножества n целых чисел на заданное число k подмножеств, минимизируя разность между наименьшей и наибольшей суммой чисел в подмножествах[2].

Дальнейшие обобщения задачи разбиения можно найти в статье «Задача об упаковке в контейнеры».

Вероятностная версия

Связанная задача, в чём-то похожая на парадокс дней рождения, заключается в поиске размера входного множества, для которого вероятность существования решения равна 0,5 при условии, что каждый элемент множества случайно выбран между 1 и некоторым заданным значением.

Решение этой задачи может быть парадоксальным. Например, при выборе случайно целых чисел между 1 и одним миллионом, многие люди считают, что ответом будет тысячи, десятки тысяч, или даже сотни тысяч, хотя, на самом деле, правильным ответом будет примерно 23 (подробности — в статье Задача разбиения).

Примечания

Литература

  • Silvano Martello, Paolo Toth. 4 Subset-sum problem // Knapsack problems: Algorithms and computer interpretations. — Wiley-Interscience, 1990. — ISBN 0-471-92420-2.
  • Ron L. Graham. Bounds on multiprocessor timing anomalies // SIAM J. Appl. Math.. — 1969. — Т. 17, вып. 2.
  • Richard E. Korf. Multi-Way Number Partitioning // IJCAI. — 2009.
  • Wil Michiels, Jan Korst, Emile Aarts. Performance ratios for the Karmarkar–Karp differencing method // Electronic Notes in Discrete Mathematics. — 2003. — Т. 13.
  • Michael Garey, David Johnson. Computers and Intractability; A Guide to the Theory of NP-Completeness. — 1979. — ISBN 0-7167-1045-5.
  • Hans Kellerer, Ulrich Pferschy, David Pisinger. Knapsack problems. — Springer, 2004. — С. 97. — ISBN 9783540402862.
  • Brian Hayes. The Easiest NP Hard Problem // American Scientist. — 2002. — May–June.
  • Narenda Karmarkar, Richard M. Karp. The Differencing Method of Set Partitioning. — Technical Report UCB/CSD 82/113. — University of California at Berkeley: Computer Science Division (EECS), 1982.
  • Ian Gent, Toby Walsh. Phase Transitions and Annealed Theories: Number Partitioning as a Case Study. — John Wiley and Sons, 1996. — С. 170–174.
  • Ian Gent, Toby Walsh. Analysis of Heuristics for Number Partitioning // Computational Intelligence. — 1998. — Т. 14, вып. 3. — С. 430–451. — doi:10.1111/0824-7935.00069.
  • Stephan Mertens. Phase Transition in the Number Partitioning Problem // Physical Review Letters. — 1998. — Ноябрь (т. 81, вып. 20). — С. 4281. — doi:10.1103/PhysRevLett.81.4281. — Bibcode1998PhRvL..81.4281M. — arXiv:cond-mat/9807077.
  • Stephan Mertens. A physicist's approach to number partitioning // Theoretical Computer Science. — 2001. — Т. 265, вып. 1-2. — С. 79–108. — doi:10.1016/S0304-3975(01)00153-0.
  • Stephan Mertens. The Easiest Hard Problem: Number Partitioning // Computational complexity and statistical physics / Allon Percus, Gabriel Istrate, Cristopher Moore. — Oxford University Press US, 2006. — С. 125. — ISBN 9780195177374.
  • Christian Borgs, Jennifer Chayes, Boris Pittel. Phase transition and finite-size scaling for the integer partitioning problem // Random Structures and Algorithms. — 2001. — Т. 19, вып. 3-4. — С. 247–288. — doi:10.1002/rsa.10004.
  • Richard E. Korf. A complete anytime algorithm for number partitioning // Artificial Intelligence. — 1998. — Т. 106, вып. 2. — С. 181–203. — ISSN 0004-3702. — doi:10.1016/S0004-3702(98)00086-1.
  • Stephan Mertens. A complete anytime algorithm for balanced number partitioning. — 1999. — Bibcode1999cs........3011M. — arXiv:cs/9903011.

Read other articles:

2-й гвардійський танковий Тацинський Червонопрапорний, ордена Суворова корпус На службі 26 грудня 1942 — липень 1945Країна  СРСРВид Бронетанкові військаТип Червона арміяЧисельність Танковий корпусВійни/битви Німецько-радянська війна Ворошиловградська операція (1943) Ку

 

Mikhail Yuryevich LermontovMikhail Lermontov pada tahun 1837 - Lukisan oleh Pyotr ZabolotskyLahirOktober 15 [K.J.: Oktober 3] 1814Moskow, Kekaisaran RusiaMeninggalJuli 27 [K.J.: Juli 15] 1841 (umur 26)Pyatigorsk, Kekaisaran RusiaPekerjaanPenyajr, novelis, penulis drama, pelukisTanda tangan Mikhail Yuryevich Lermontov 15 Oktober [K.J.: 3 Oktober] 1814 – 27 Juli [K.J.: 15 Juli] 1841) adalah penyair genius Rusia. Biografi Lermontov lahir di Moskow. Ayahnya seorang pegawai pensiun, ibunya ...

 

Adnan MaulanaInformasi pribadiKebangsaanIndonesiaLahir23 Oktober 1999 (umur 24)Jambi, IndonesiaPeganganKananGanda Putra & Ganda CampuranPeringkat tertinggi143 (MD bersama Ghifari Anandaffa Prihardik 23 April 2019) 32 (XD bersama Mychelle Crhystine Bandaso 2 Februari 2021)Peringkat saat ini35 (XD bersama Mychelle Crhystine Bandaso 12 Oktober 2021) Rekam medali Mewakili  Indonesia Kejuaraan Asia Junior Jakarta 2017 Tim Campuran Profil di BWF Adnan Maulana (lahir 23 Oktober 1999) a...

Nizhny Novgorod Metro Station ProletarskayaПролетарскаяNizhny Novgorod Metro stationGeneral informationLocationLeninsky DistrictNizhny NovgorodRussiaCoordinates56°15′56″N 43°54′45″E / 56.26556°N 43.91250°E / 56.26556; 43.91250Line(s) Line 1Platforms1Tracks2Connections 8, 417 31, 40, 56, 58, 64, 65, 66, 68, 69, 73, 77, 85 2, 11, 12ConstructionStructure typeThree-span, shallow-column stationHistoryOpened20 November 1985ElectrifiedYesServices Prece...

 

Air dari sebuah keran yang disalurkan melalui pipa. Air keran yang disuplai oleh sebuah truk. Penyediaan air adalah penyediaan air oleh fasilitas umum, organisasi komersial, upaya masyarakat atau perorangan, yang mana biasanya dilakukan melalui suatu sistem pompa dan pipa. Irigasi dibahas secara terpisah dari topik ini. Akses global ke air bersih Shipot, suatu sumber air bawah tanah di Ukraina. Pada tahun 2010, sekitar 85% populasi global (6,74 miliar orang) telah memiliki akses ke penyediaan...

 

Мікропластик — тверді частинки синтетичних полімерів, розміром менше 5 мм[1]. Термін «мікропластик» був введений у 2004 році професором Річардом Томпсоном, морським біологом університету Плімута у Великій Британії[2]. Мікропластики в морському середовищі зазви...

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (أبريل 2019) إيرين وايت معلومات شخصية الميلاد 27 أكتوبر 1977 (46 سنة)  فانكوفر  مواطنة الولايات المتحدة  الحياة العملية المدرسة الأم جامعة ولاية آيوا  المهنة لاعب ك...

 

Благовіщенська церква-дзвіниця Благовіщенська церква-дзвіниця Кирилівського монастиря 50°28′57″ пн. ш. 30°28′18″ сх. д. / 50.48258200002777585° пн. ш. 30.47180400002777745° сх. д. / 50.48258200002777585; 30.47180400002777745Координати: 50°28′57″ пн. ш. 30°28′18″ сх. д. / þ...

 

1995 Russian filmAmerican DaughterDirected byKaren ShakhnazarovWritten byAlexander BorodyanskyKaren Shakhnazarov[1]Produced byBoris GillerStarringVladimir Mashkov Allison WhitbeckCinematographyVladimir ShevtsikEdited byLydia MiliotiMusic byAnatoly KrollProductioncompanyMosfilmRelease date 1995 (1995) Running time98 minCountriesRussiaUnited StatesLanguagesRussianEnglishAmerican Daughter (Russian: Американская дочь) is a Russian road comedy-drama film directed by Ka...

2011 American filmMachine Gun PreacherTheatrical release posterDirected byMarc ForsterScreenplay byJason KellerBased onAnother Man's War by Sam ChildersProduced byRobbie BrennerGary SafadyDeborah GiarratanaCraig ChapmanMark ForsterStarringGerard ButlerMichelle MonaghanMichael ShannonCinematographyRoberto SchaeferEdited byMatt ChesséMusic byAsche & SpencerProductioncompaniesApparatusSafady Entertainment1984 Private Defense ContractorsMpower PicturesVirgin ProducedDistributed byRelativity ...

 

1929–1994 aerospace manufacturer For other uses, see Grumman (disambiguation). Grumman CorporationIndustryAircraft; aircraft parts and equipment; data processing and preparation; search and navigation equipment; truck and bus bodies; electrical equipment and suppliesFoundedDecember 6, 1929; 94 years ago (1929-12-06)FoundersLeroy GrummanEdmund Ward PoorWilliam T. SchwendlerJake SwirbulDefunctApril 4, 1994 (1994-04-04)FateMerged with NorthropSuccessorNorthrop ...

 

Tri Brata Rafflesia FCNama lengkapTri Brata Rafflesia Football ClubJulukanBadak SumatraBerdiri2012; 10 tahun lalu (2012)StadionStadion SemarakKota Bengkulu, Bengkulu(Kapasitas: 15.000)PemilikPolda BengkuluLigaLiga 3 Kostum kandang Kostum tandang Tri Brata Rafflesia FC (sebelumnya bernama Polda Bengkulu FC) adalah tim sepak bola Indonesia yang bermarkas Stadion Semarak, Kota Bengkulu, Bengkulu. Tim ini berkompetisi di Liga 3 Zona Bengkulu.[1] Referensi ^ Ditahan Imbang Tribrata Ra...

American college basketball season 1952–53 Western Kentucky State Hilltoppers basketballOVC Tournament ChampionNIT Tournament, QuarterfinalsConferenceOhio Valley ConferenceRankingCoachesNo. 11APNo. 17Record25–6 (8–2 OVC)Head coachEdgar Diddle (31st season)Assistant coachTed HornbackHome arenaHealth & Physical Education BuildingSeasons← 1951–521953–54 → The 1952–53 Western Kentucky State Hilltoppers men's basketball team represented Wes...

 

Government of Chiayi City, Taiwan Chiayi City Government嘉義市政府Emblem of Chiayi City GovernmentChiayi City HallAgency overviewFormed1 July 1982JurisdictionChiayi CityHeadquartersNo.199, ZhongShan Road, East, Chiayi City, Taiwan Province, Republic of China.Agency executiveHuang Min-hui, MayorChild agencies14 Subordinate Departments 6 Bureaus 2 Second-Level Agencies 2 District Offices 2 Affiliated Departments 3 Municipal EnterprisesWebsiteOfficial website Huang Min-hui, the incumbent Ma...

 

Spanish footballer In this Spanish name, the first or paternal surname is Codina and the second or maternal family name is Panedas. Laia Codina Codina with Barcelona B in 2019Personal informationFull name Laia Codina PanedasDate of birth (2000-01-22) 22 January 2000 (age 23)Place of birth Campllong, SpainHeight 1.70 m (5 ft 7 in)Position(s) Centre-backTeam informationCurrent team ArsenalNumber 27Youth career2014–2017 BarcelonaSenior career*Years Team Apps (Gls)20...

City in Oregon, United States For a similarly named city up the Columbia River, see Warren, Oregon. City in Oregon, United StatesWarrenton, OregonCityWarrenton marinaMotto: Making a Difference through excellence of serviceLocation in OregonCoordinates: 46°9′54″N 123°54′27″W / 46.16500°N 123.90750°W / 46.16500; -123.90750CountryUnited StatesStateOregonCountyClatsopIncorporated1899Government • MayorHenry Balensifer[citation needed]Are...

 

Norwegian architecture office This article reads like a press release or a news article and may be largely based on routine coverage. Please help improve this article and add independent sources. (March 2016) Space Group CompanyIndustryArchitectureFounded1999HeadquartersOslo, NorwayKey peopleGary Bates, Gro Bonesmo, Floire Nathanael DaubWebsitehttps://www.spacegroup.no Space Group is an architecture office established in 1999 in Oslo, Norway and created by Gary Bates and Gro Bonesmo. Prior to...

 

This article is missing information about the second part of the conflict. Please expand the article to include this information. Further details may exist on the talk page. (July 2020) This article is about the conflict in Lebanon. For other uses, see Brothers War (disambiguation) and War of the Two Brothers (disambiguation). War of Brothersحرب الأخوةDateApril 1988–November 1990LocationSouth Lebanon, Beirut and BeqaaResult Second Damascus AgreementBelligerents AmalSupported by...

Body of water in Antarctica Location of Nelson Island in the South Shetland Islands. Edgell Bay (62°16′05″S 58°58′37″W / 62.26797°S 58.97700°W / -62.26797; -58.97700) is a bay 1.5 nautical miles (3 km) long and wide, indenting the northeast side of Nelson Island, in the South Shetland Islands. Spiro Hill overlooks the bay. This bay appears in rough outline on Powell's chart of the South Shetland Islands published in 1822. It was recharted during 1934...

 

Bear Rocks PreserveIUCN category V (protected landscape/seascape)[1]View from Bear RocksLocation of Bear Rocks Preserve in West VirginiaLocationGrant County & Tucker County, West Virginia, United StatesCoordinates39°04′23″N 79°17′53″W / 39.07306°N 79.29806°W / 39.07306; -79.29806Area477 acres (193 ha)[2]Elevation3,999 ft (1,219 m)[3]WebsiteBear Rocks Preserve Bear Rocks are a widely recognized symbol of West Virgin...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!