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

Задача разбиения множества чисел — это задача определения, можно ли данное мультимножество 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:

Pangeran AndreasPangeran saat pernikahan Putri Madeleine dari Swedia, Juni 2013Kepala Wangsa Sachsen-Coburg dan GothaMulai menjabat23 Januari 1998 – kiniPendahuluPangeran Friedrich JosiasCalon pewaris takhtaPangeran HubertusInformasi pribadiKelahiran21 Maret 1943 (umur 80)Schloss Casel, Lusatia HilirWangsaWangsa Sachsen-Coburg dan GothaAyahFriedrich Josias, Pangeran Sachsen-Coburg-GothaIbuCountess Viktoria-Luise dari Solms-BaruthPasanganCarin DabelsteinAnakPutri StephaniePangeran Huber...

 

العلاقات الأوزبكستانية السويسرية أوزبكستان سويسرا   أوزبكستان   سويسرا تعديل مصدري - تعديل   العلاقات الأوزبكستانية السويسرية هي العلاقات الثنائية التي تجمع بين أوزبكستان وسويسرا.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للد�...

 

Jan Vertonghen Informasi pribadiNama lengkap Jan Bert Lieve Vertonghen[1]Tanggal lahir 24 April 1987 (umur 36)[2]Tempat lahir Sint-Niklaas, BelgiaTinggi 1,89 m[3]Posisi bermain BekInformasi klubKlub saat ini R.S.C. AnderlechtNomor 14Karier junior1997–2000 VK Tielrode2000–2003 Germinal Beerschot2003–2006 AjaxKarier senior*Tahun Tim Tampil (Gol)2006–2012 Ajax 155 (23)2006–2007 → RKC Waalwijk (pinjaman) 12 (3)2012–2020 Tottenham Hotspur 232 (6)2020-202...

American integrated naval weapons system developed by RCA and produced by Lockheed Martin This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Aegis Combat System – news · newspapers · books · scholar · JSTOR (February 2019) (Learn how and when to remove this template message) USS Lake Champlain (CG-57)...

 

Questa voce sull'argomento religiosi portoghesi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Bento de Góis Bento de Góis (Vila Franca do Campo, 1562 – Jiuquan, 1607) è stato un missionario portoghese. Dapprima militare, entrò nel 1588 nella Compagnia di Gesù come coauditore. Nel 1602 avviò un lungo viaggio che lo portò ad attraversare India, Afghanistan e Tibet diretto in Cina, allo scopo di accertare se il Catai descritto da Marco Polo co...

 

Extended-stay hotel chain run by Marriott International Residence Inn by MarriottIndustryExtended stay hotelsFounded1975Number of locations874 (2021)Area servedWorldwideParentMarriott InternationalWebsiteresidenceinn.marriott.com Residence Inn by Marriott is a brand of extended stay hotels. As of June 1, 2021[update], there were 874 Residence Inn hotels in the United States, Canada and Mexico with 107,680 rooms, plus an additional 243 hotels with 30,417 rooms in the deve...

Ivchenko AI-20 adalah mesin turboprop Soviet yang dikembangkan oleh biro desain Ivchenko pada tahun 1950. Telah dibangun dalam jumlah besar, yang berfungsi sebagai powerplant untuk Antonov An-12 dan pesawat transportasi Ilyushin Il-18. Maximum power output: 3,809 kW (5,180 ehp) (take-off); 2,004 kW (2,725 ehp) (cruise) Aplikasi AI-20 Antonov An-8 Antonov An-10 Antonov An-12 Antonov An-32 Beriev Be-12 Ilyushin Il-18 Ilyushin Il-38 WJ-6 Shaanxi Y-8 Shaanxi Y-9 Beriev Be-6 Referensi G...

 

Giorgio Galli Giorgio Galli (Milano, 10 febbraio 1928 – Camogli, 27 dicembre 2020) è stato un politologo e storico italiano. Indice 1 Biografia 2 Opere 2.1 Curatele 3 Note 4 Bibliografia 5 Collegamenti esterni Biografia Laureato in giurisprudenza, lungamente professore di Storia delle dottrine politiche presso l'Università degli Studi di Milano, fu uno dei più affermati politologi italiani[1]; egli dedicò gran parte dei suoi lavori all'analisi del sistema politico italiano, adot...

 

Hungarian fencer The native form of this personal name is Márton Anna. This article uses Western name order when mentioning individuals. Anna MártonMárton at the 2014 Orléans Grand PrixPersonal informationBorn (1995-03-31) 31 March 1995 (age 29)Budapest, HungaryNationalityHungarianHeight1.80 m (5 ft 11 in)Weight70 kg (154 lb)SportCountryHungarySportFencingWeaponSabreHandRight-handedClubBSE ( –2013)MTK Budapest (2014– )Head coachGábor Gárdos, P...

金正男遇刺现场,位于吉隆坡第二国际机场 金正男遇刺事件,是2017年2月13日已故朝鮮勞動黨總書記金正日的長子,也是現任領導人金正恩的兄長金正男於吉隆坡第二国际机场被2名女子刺殺身亡的事件。 事件经过 2017年2月6日,一名持姓名为「金哲」的朝鲜民主主义人民共和国外交护照的男子搭機抵达马来西亚,在2月8日前往浮羅交怡並在浮羅交怡威斯汀酒店(The Westin Langkaw...

 

此條目可参照英語維基百科相應條目来扩充。 (2022年1月31日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 艾哈迈德·哈桑·贝克尔أحمد حسن البكر第4任伊拉克总统任期1968年7月17日—1979年7月16日副总统萨达姆·侯...

 

Prime Minister of Malaysia from 2020 to 2021 Muhyiddin redirects here. For other people with this name, see Mohy al-Din. In this Malay name, there is no surname or family name. The name Yassin is a patronymic, and the person should be referred to by their given name, Muhyiddin. The word bin or binti/binte means 'son of' or 'daughter of', respectively.Yang Berhormat Tan Sri Dato' HajiMuhyiddin YassinPSM SPMJ SHMS SPSA SPMP SUNS DUNM SPDK DP PNBS SMJ ...

  提示:此条目页的主题不是萧。 簫琴簫與洞簫木管樂器樂器別名豎吹、豎篴、通洞分類管樂器相關樂器 尺八 东汉时期的陶制箫奏者人像,出土於彭山江口汉崖墓,藏於南京博物院 箫又稱洞簫、簫管,是中國古老的吹管樂器,特徵為單管、豎吹、開管、邊稜音發聲[1]。「簫」字在唐代以前本指排簫,唐宋以來,由於單管豎吹的簫日漸流行,便稱編管簫爲排簫�...

 

Peta infrastruktur dan tata guna lahan di Komune Vayres-sur-Essonne.  = Kawasan perkotaan  = Lahan subur  = Padang rumput  = Lahan pertanaman campuran  = Hutan  = Vegetasi perdu  = Lahan basah  = Anak sungaiVayres-sur-EssonneNegaraPrancisArondisemenÉtampesKantonLa Ferté-AlaisAntarkomunebelum ada pada 2007Kode INSEE/pos91639 /  Vayres-sur-Essonne merupakan sebuah desa dan komune di département Essonne, di region Île-de-France di Prancis. Demogra...

 

الدوري التركي الممتاز 2016–17 تفاصيل الموسم الدوري التركي الممتاز  النسخة 59  البلد تركيا  التاريخ بداية:19 أغسطس 2016  نهاية:21 مايو 2017  المنظم اتحاد تركيا لكرة القدم  البطل نادي بشكتاش  مباريات ملعوبة 306   عدد المشاركين 18   الموقع الرسمي الموقع الرسمي  ال...

Production plant Flint East was an automobile component production complex owned by Delphi Corporation in Flint, Michigan. The complex, parts of which were over 100 years old, was located on Dort Highway, stretching along Robert T. Longway Boulevard past Center Road. The plant produced numerous automotive components, including instrument panels, instrument clusters, spark plugs, filters, air meters, fuel pumps and other parts. Flint East once employed nearly 14,000 people, but by 2007, the nu...

 

Former charity in London The Old College complex, including Christ's Chapel of God's Gift The Old Grammar School; the sign above the door says The Grammar School of the College of God's Gift Dulwich The College of God's Gift, often referred to as the Old (Dulwich) College, was a historic charity founded in 1619 by the Elizabethan actor and businessman Edward Alleyn who endowed it with the ancient Manor of Dulwich in south London. In 1857 it was renamed as Alleyn's College of God's Gift. The c...

 

Incorporation of sulfur into living organisms This article may require cleanup to meet Wikipedia's quality standards. The specific problem is: This article is full of non-relevant or incorrect information, unsourced and poorly written with many typos pointing not only to a lack of writing skills but probably also of basic knowledge in the field. Please help improve this article if you can. (March 2024) (Learn how and when to remove this message) This article includes a list of references, rel...

Battle of PatanDate20 June 1790LocationPatan, IndiaResult Maratha victory[1][2]Belligerents  Maratha Confederacy • Gwalior State Kingdom of Amber Kingdom of Marwar Mughal mercenariesCommanders and leaders Mahadji ShindeBenoît de BoigneNana PhadnisGopal BhauAmbaji Ingle Shovram BhandariShahmalSukhlal HaldiaMirza Ismail BegRaja Sampat Singh TomarCasualties and losses Unknown Unknown vteDeccan wars Ahmednagar Chakan Surat Purandar Sinhagad Salher 1st Shivne...

 

Irish Gaelic footballer For the Derry Gaelic footballer, see Paul Murphy (Derry Gaelic footballer). Paul MurphyPersonal informationIrish name Pól Ó MurchúSport Gaelic footballPosition Half backBorn (1991-08-02) 2 August 1991 (age 33)Rathmore, IrelandHeight 1.78 m (5 ft 10 in)Occupation AccountantClub(s)Years Club2008– RathmoreClub titlesKerry titles 2Inter-county(ies)Years County Apps (scores)2014– Kerry 41 (2–14)Inter-county titlesMunster titles 9All-Irelands 2NF...