Проблем збира подскупа

С Википедије, слободне енциклопедије

У рачунарству, проблем збира подскупа је значајан проблем у теорији комплексности и криптографији. Проблем је следећи: дат је скуп целих бројева, да ли постоји не-празан подскуп чији збир је нула? На пример, дат је скуп { −7, −3, −2, 5, 8}, одговор је ДА зато што{ −3, −2, 5} износи нула. Проблем је НП комплетан.

Еквивалентан проблем је ово: дат је скуп целих бројева и цео број с, да ли било који не-празан подскуп сумира до с? Збир подскупа може да се посматра као посебан случај проблема ранца.[1] Један занимљив случај посебан збир подскупа подела проблема, у којем је с половина суме свих елемената у скупу.

Сложеност[уреди | уреди извор]

Теорија комплексности (сложеност) проблема збира подскупа може се посматрати у зависности од параметра, Н, број доносилаца променљивих, и П, прецизност проблема (наведен као број вредности бинарних места која је потребно за проблем).

Сложеност најпознатијих алгоритама је експоненцијално мањи од два параметра Н и П. Дакле, проблем је веома тешко, ако Н и П су истог реда. То само постаје лако ако било Н или П постану веома мали.

Ако је Н (број променљивих) мали, тада је исцрпљујућа претрага практична за решење. Ако је П (број места вредности) мали фиксирани број, тада алгоритми динамичког програмирања могу да га реше тачно.

Ефикасни алгоритми за мале Н и мале П случајеве су дати у наставку.

Алгоритам експоненцијалног времена[уреди | уреди извор]

Постоји неколико начина да се реши збир подскупа у експоненцијалном времену у Н. Наивни алгоритам би био циклус кроз све подгрупе Н бројева и за сваки од њих, проверите да ли постоји збир подскупа за прави број. Време рада је у О(2НН), јер постоје 2Н подскупи и, да проверите сваки подскуп, морамо да закључимо највише Н елемената.

Боље познатији експоненцијални алгоритам је онај који ради у времену О(2Н/2). Алгоритам дели произвољно Н елементе у два сета Н/2 сваки. За сваки од ова два скупа, чува се списак суме од свих 2Н/2 могућих подскупа њених елемената. Свака од ове две листе се затим сортира. Користећи стандардни поређење сортирања алгоритам за овај корак ће бити потребно време О(2Н/2Н). Међутим, с обзиром сортирани списак износа за к елемената, списак се може проширити на две сортиране листе са увођењем (к + 1)ст елемента, и ове две сортиране листе могу да буду спојене за време О(2к). Према томе, свака листа може бити генерисана у сортираном облику у времену О(2Н/2). Имајући у виду два сортиране листе, алгоритам може да провери да ли се елемент првог низа и елемент другог низа добија за с у времену О(2Н/2). Да бисте то урадили, алгоритам пролази кроз први низ у опадајућем редоследу (почевши од највећег елемента) и други низ у растућем редоследу (почевши од најмањег елемента). Кад год је сума тренутног елемента у првом низу и тренутни елемент у другом низу више од с,алгоритам прелази на следећи елемент у првом низу. Ако је то мање од с, алгоритам прелази на следећи елемент у другом низу. Ако су два елемента са сумом с нађена, онда се зауставља. Хороwитз анд Сахни први пут објавили овај алгоритам у техничком извештају 1972.[2]

Динамичко програмирање[уреди | уреди извор]

Проблем се може решити на следећи начин коришћењем динамичког програмирања. Претпоставимо да је ред

x1, ..., xН

и желимо да се утврди да ли постоји непразан подскуп који сумира на нулу. Нека А буде збир негативних вредности и Б збир позитивних вредности. Дефинишемо буловску фунцкију Q(и,с) да има вредности (тачно или нетачно)

"постоји непразан подскуп x1, ..., xи који сумира до с".

Дакле, решење проблема је вредност Q(Н,0).

Јасно, Q(и,с) = фалсе ако с < А илис > Б тако да ове вредности не морају да се чувају или израчунавају. Креирање низа за одржавање вредности Q(и,с) за 1 ≤ иН иАсБ.

Низ се сада може попунити помоћу једноставне рекурзије. У почетку, заАсБ, поставити

Q(1,с) := (x1 == с).

Затим, за и = 2, …, Н, поставити

Q(и,с) := Q(и − 1,с) или (xи == с) или Q(и − 1,сxи)   за АсБ.

За сваки задатак, вредности Q на десној страни су већ познати, или зато што су били ускладиштени у табели за претходну вредност и или због Q(и − 1,сxи) = фалсе ако сxи < А или сxи > Б. Дакле, укупан број аритметичких операција је О(Н(БА)). На пример, ако су све вредности О(Нк) за неко к, онда је потребно време О(Нк+2).

Овај алгоритам се лако модификује да врати подскуп суме са 0 ако постоји.

Ово решење се не рачуна као полиномијално време у теорији сложености, јер БА није полиномилно у величини проблема, што је број битова који се користе за репрезентацију. Овај алгоритам је полином у вредностима А и Б, који је експоненцијалану у броју битова.


Алгоритам апроксимације у полиномијалном времену[уреди | уреди извор]

Апроксимована верзија збира подскупа ће бити: дат је скуп од Н бројева x1, x2, ..., xН и број с, излаз

  • Да, ако постоји подскуп који сумира до с;
  • Но, ако не постоји подскуп који сумира између (1 − ц)с и с за веома мале ц > 0;
  • било какав одговор, ако постоји подскуп који сумира између (1 − ц)с и с али не и подскуп до с.

Ако су сви бројеви не-негативни, приближан збир подскупа је растворљив у временском полиному у Н и 1/ц.

Решење за збир подскупа такође пружа решење за проблем првобитног збира подскупа у случају где су бројеви су мали (опет, за не негативне бројева).Ако неки збир бројева може се одредити са највише П битова, затим решавање проблема са приближно ц = 2П је еквивалентнода се реши тачно. Затим, полиномијални алгоритам за приближни збир подскупа постаје тачан алгоритам са полиномијалним временом извршавања Н' и 2П .

Алгоритам за апроксимацију проблема збира подскупа је следећи:

 initialize a list S to contain one element 0.
 for each i from 1 to N do
   let T be a list consisting of xi + y, for all y in S
   let U be the union of T and S
   sort U
   make S empty 
   let y be the smallest element of U 
   add y to S 
   for each element z of U in increasing order do
      //trim the list by eliminating numbers close to one another
      //and throw out elements greater than s
     if y + cs/N < zs, set y = z and add z to S 
 if S contains a number between (1 − c)s and s, output yes, otherwise no

Алгоритам је полинојалног времена зато шсто листе С, Т и У увек остају на величини полинома у Н и 1/ц и, док су величине од полинома, све операције на њима могу да се ураде у полиномијалном времену. Величина листа чува полином по корак, у којој само укључује број з у С ако је већи од претходног за цс/Н а не већи од с.

Овај корак обезбеђује да сваки елемент у С је мањи од следећег најмање цс/Н и не садрже елементе веће од с. Свака листа са том особином се састоји од више од Н/ц елемената.

Алгоритам је коректан јер сваки корак уводи грешку за највише цс/Н и Н корака заједно уводећи грешку за највише цс.

Види још[уреди | уреди извор]




Референце[уреди | уреди извор]

  1. ^ Мартелло, Силвано; Тотх, Паоло (1990). „4 Субсет-сум проблем”. Кнапсацк проблемс: Алгоритхмс анд цомпутер интерпретатионс. Wилеy-Интерсциенце. стр. 105-136. ИСБН 978-0-471-92420-3. МР 1086874. 
  2. ^ Хороwитз, Еллис; Сахни, Сартај (1974), „Цомпутинг партитионс wитх апплицатионс то тхе кнапсацк проблем”, Јоурнал оф тхе Ассоциатион фор Цомпутинг Мацхинерy, 21: 277—292, МР 0354006, дои:10.1145/321812.321823 


Литература[уреди | уреди извор]