Puncte:2

Complexitatea temporală a algoritmului de căutare exhaustivă

drapel in

Am seturile $S_1=\{2,10,20,6\}$ și $S_2=\{25,26,20\}$ și vreau să aflu ce numere însumează 32. Acest lucru este foarte ușor prin inspecție; 6 și 26. Pare similară cu problema rucsacului, dar nu sunt expert.

Cu toate acestea, să spunem că am 1000 de seturi, fiecare cu 500 de elemente, astfel încât însumarea unui termen din fiecare set vă oferă întotdeauna o valoare unică. Acest lucru este mult mai greu de inspectat și rezolvat, mai ales dacă seturile urmează o structură care va apărea aleatorie (ar fi construite din seturi structurate cu care au fost încurcate și ar fi aproape imposibil să ghicim amestecul și să inversezi seturile).

Deci, singura modalitate trebuie să fie un algoritm de căutare exhaustiv. Dat fiind că numărul meu este 52.485.332, există $1000^{500}$ opțiuni posibile de analizat. Într-adevăr, vor exista modalități de a scurta această căutare (cum ar fi atunci când un set are numere mai mari decât valoarea țintă, puteți ignora acele numere). Dar altfel s-ar putea să te uiți în continuare la $750^{500}$ posibile alegeri.

Deci, care este complexitatea de timp a unui astfel de algoritm de căutare? $O(n^{k})$, cu $n$ numărul de seturi și $k$ numărul de elemente din acele seturi? Ei trebuie să verifice „toate” combinațiile posibile de termeni până când unul se potrivește cu valoarea dată.

Principalele întrebări par să fie „câte seturi există?” și „cât de mari sunt seturile?”. Într-adevăr, seturile pot fi toate de diferite dimensiuni, nu doar uniforme.

Nu sunt o persoană cu criptografie; cercetarea mea doar cochetează cu ideea la îndemână. Orice ajutor ar fi apreciat.

poncho avatar
drapel my
„Deci, singura cale trebuie să fie un algoritm de căutare exhaustiv” - ummm, nu, chiar și fără nicio structură în valori, există metode de căutare semnificativ mai eficiente; unul care îmi vine imediat în minte durează $O(nm)$ (unde $m$ este suma țintă; cu $m=52485332$, care pare a fi practic rezolvabil). Sunteți interesat sau întrebarea dvs. este în mod specific despre timpul necesar algoritmului de căutare naiv?
MeBadMaths avatar
drapel in
@poncho multumesc pentru comentariu. Nu știam că există metode mai bune decât o metodă de căutare „naïve”. M-ar interesa cel pe care l-ați sugerat - orice puteți sugera ar fi grozav.
jjj avatar
drapel cn
jjj
Există 500^1000 de opțiuni, nu 1000^500
Puncte:2
drapel my

Deci, singura modalitate trebuie să fie un algoritm de căutare exhaustiv

După cum am menționat în comentariul meu, există metode practice pentru valori non-uriașe ale $m$ (și $m=52485332$ nu este imens). Iată schița unei astfel de metode (care presupune că toate mulțimile constau din numere întregi nenegative):

  • Avem o matrice $A_{n, m+1}$; fiecare element al matricei $A_{a, b}$ va observa cum putem genera suma $b$ din prima $a$ seturi (sau $\perp$ dacă nu s-a găsit încă o astfel de cale).

  • Inițializați toate elementele $A$ la $\perp$

  • Pentru $i := 1$ la $n$ cauta elementele $A_{i-1}$ pentru non-$\perp$ element (și pentru $i=1$, al 0-lea element este tratat ca singurul non-$\perp$ element. Pentru fiecare astfel de element $A_{i-1, x}$, a stabilit $A_{i, x + S_{i,j}}$ la $j$ (pentru fiecare element $S_{i,j}$ a setului $S_i$) Dacă $x + S_{i,j} > m$, ignora.

  • În fine, dacă $A_{n,m} = \perp$, nu există nicio submulțime care să conducă la sumă $m$. Dacă este altceva, putem recupera termenii revenind înapoi prin matrice $A$.

Acesta ar trebui să fie un algoritm practic pentru recuperarea termenilor având în vedere parametrii pe care i-ați specificat.

jjj avatar
drapel cn
jjj
În întrebare s-a afirmat că însumarea dă întotdeauna o valoare unică. Aceasta înseamnă că există 1000^500 de rezultate diferite, așa că trebuie să presupunem că vorbim despre m și în această mărime. Acest algoritm nu se va termina „niciodată” atunci
poncho avatar
drapel my
@jjj: întrebarea mai spune „Dacă numărul meu este 52.485.332”; Am presupus că își listau valoarea de $m$; dacă nu, care este „numărul meu”?
jjj avatar
drapel cn
jjj
Bănuiesc că autorul întrebării nu este conștient de faptul că unicitatea va avea ca rezultat faptul că majoritatea numerelor setului vor fi mult mai mari decât suma. Iar eliminarea lor ar reduce drastic problema
MeBadMaths avatar
drapel in
Va multumesc amandoi pentru raspunsuri si comentarii. Nu sunt familiarizat cu detaliile Criptografiei, așa că îmi pare rău pentru confuzia pe care a provocat-o postarea mea. Faptul că am crezut că 52.485.332 este „uriaș” arată ignoranța mea haha. Pentru a clarifica; toate mulțimile sunt numere întregi nenegative. Luarea unei valori din fiecare set și însumarea acestora va garanta întotdeauna un element unic.
MeBadMaths avatar
drapel in
Prin „numărul meu” mă refeream la termenul pe care l-am codificat (ceva pe care nu l-am declarat – îmi pare rău!). Să spunem că am primit un mesaj și l-am codificat prin aceste seturi. Numărul rezultat este 52.485.332 (sau poate chiar mai mare!). Sarcina algoritmului de căutare este să găsească valorile unice din suma celor 1000 de seturi pentru a face acest număr. De acolo puteți decoda mesajul. Cele 1000 de seturi acționează ca o cheie publică. Deci, dacă este ușor de spart, aceasta este o problemă. Sper că te ajută. @jjj ai putea explica mai mult ultimul tău comentariu? Nu cred că o urmăresc, îmi pare rău
MeBadMaths avatar
drapel in
@poncho Mulțumesc pentru algoritm. Nu cred că înțeleg ce înseamnă T invers - cunoștințele mele de notație despre Criptografie sunt în cel mai bun caz de bază. Mă voi uita mai atent și voi vedea dacă pot înțelege restul
poncho avatar
drapel my
@MeBadMaths: $\perp$ înseamnă „gol”, adică un simbol care se distinge de orice valoare validă. În termeni C, gândiți-vă la asta ca la un pointer NULL...
MeBadMaths avatar
drapel in
@poncho: multumesc pentru precizare. Simt că acel algoritm este similar cu un algoritm de căutare naiv, în sensul că iterați prin toate seturile și compilați o listă de valori posibile până acum la care ar putea fi însumate. Dacă vreo sumă devine prea mare, nu te mai uita la ea. În cele din urmă, veți înceta să vă concentrați asupra tuturor, cu excepția valorilor care vor fi egale sau mai mici decât cea desemnată. Presupun că un avantaj al algoritmului dvs. este că nu verificați valorile până la sfârșit - cu excepția faptului că pentru a compara dacă este prea mare?
MeBadMaths avatar
drapel in
O întrebare pe care o am este; de câte seturi (de diferite dimensiuni) ai avea nevoie pentru ca acest algoritm să dureze prea mult? Așa cum a sugerat @jjj, deși poți să nu te mai uiți la o bucată bună din seturi, deoarece în cele din urmă multe dintre valorile numerelor vor fi prea mari. Dacă, de exemplu, numerele dvs. codificate se aflau chiar în mijlocul tuturor numerelor însumate posibile, primul pas ar putea privi doar 250 de numere, dar fiecare dintre acestea adaugă apoi 250 din al doilea set și apoi 250 pe fiecare dintre cele pentru al treilea set. Se pare că va deveni enorm în curând? Deși, din nou, s-ar putea să subestimez „uriașul” haha
poncho avatar
drapel my
@MeBadMaths: de fapt, avantajul real al algoritmului meu (comparativ cu căutarea cu forță brută) este dacă există mai multe moduri de a ajunge la o sumă intermediară. Să presupunem că există 1000 de moduri diferite de a ajunge la valoarea 314159 după 42 de pași; forța brută va repeta calculul începând de la (314159,42) de 1000 de ori; algoritmul meu o va face o singură dată.
poncho avatar
drapel my
@MeBadMaths: în ceea ce privește modalitățile de a face problema imposibilă pentru algoritmul meu, cea mai evidentă este să mă facă uriaș.Pentru m nemărginit, această problemă este de fapt NP-grea, totuși pentru a intra în intervalul cu adevărat dificil, m trebuie să fie enorm...
MeBadMaths avatar
drapel in
@poncho Cred că ar exista o singură cale după primii 42 de pași pentru a ajunge la 314159. Dacă ar exista mai multe moduri, atunci nu ar exista o combinație unică pentru fiecare sumă. Dar pot vedea cum algoritmul tău face ceea ce spui tu - este un algoritm foarte grozav și bine gândit! Mult mai bine decât orice aș putea face haha. Mulțumesc pentru clarificare și despre $m$. Am subestimat cu adevărat ce înseamnă „uriaș”.
Puncte:1
drapel cn
jjj

Acesta este mai mult un răspuns la motivul pentru care unicitatea sumelor afectează atât de mult dimensiunea încât este cazul $52485332$ devine banal (modul său de a tânji după un comentariu).

Când toate sumele trebuie să fie unice, atunci ele trebuie să rezulte în numere întregi diferite. Pentru ca sunt acolo $500^{1000}$ sume posibile, există și $500^{1000}$ rezultate întregi diferite pentru asta. cel mai mic caz ar fi toate numerele întregi din $0$ la $500^{1000}-1$.

De exemplu,

$S_1 = \{0, 1, 2, ..., 499\}$

$S_2 = \{0, 500, 1000, ..., 249500\}$

$S_3 = \{0, 250000, 500000, ..., 124750000\}$

...

$S_{1000} = \{0, 500^{999}, 2*500^{999}, ..., 499*500^{999}\}$

ar fi o modalitate de a asigura unicitatea rezultatului. După cum puteți vedea, numerele devin foarte mari, foarte repede.

În acest exemplu particular, este ușor să găsiți rezultatul (doar alegeți întotdeauna cel mai mare număr care se potrivește de la ultimul până la primul set). Chiar și majoritatea numerelor este $S_3$ sunt mai mari decât $52485332$ și, prin urmare, poate fi ignorat.

Probabil că ați dori valori relativ aleatorii în seturile dvs. În acest caz, intervalul de valori trebuie să fie cel puțin puțin mai mare.

Cu toate acestea, este foarte puțin probabil ca vreo valoare să fie mai mică sau egală cu $52485332$ (când alegi uniform $500000$ valori din $500^{1000}$)

Programarea dinamică, așa cum a sugerat @poncho, într-adevăr funcționează doar pentru numere mici și performanța sa nu este cu mult mai bună decât căutarea exhaustivă (diferența liniară a numărului de seturi), deoarece sub-suma, care pot fi refolosite sunt unice, avantajul a nu se uita la alte posibilități nu există. Timpul de rulare ar trebui să fie în aceeași ordine ca și căutarea exhaustivă. Doar îmbunătățirea este să vă integrați atunci când valorile sunt prea mari sau mici pentru a atinge ținta, dar pentru ținte rezonabile, acest lucru nu reprezintă un mare avantaj.

Activat ar putea reduce cu ușurință problema sumei subsetului sau problema rucsacului la aceasta, folosind doar același set de câte ori numărul cu care doriți să însumați.Problema cu aceasta este că aceasta nu este o reducere de timp polinomială și, prin urmare, nu este suficientă pentru a demonstra dacă problema este NP grea.

MeBadMaths avatar
drapel in
Mulțumesc pentru răspuns. Exemplul seturilor pe care le-ați dat este unul pe care îl cunosc bine și este cel mai elementar dintre aceste seturi. Însă, de acolo puteți „încurca” această configurație într-un mod care este complet irecuperabil fără informații suplimentare (cheia privată). Seturile rezultate „încurcate” vor fi aparent aleatorii și vor genera o gamă foarte mare de seturi. Sunt de acord că 52485332 dat este prea mic - chiar nu m-am gândit la asta haha. Dar, să spunem că valoarea mea a fost de o dimensiune suficientă care a urmărit corect cu seturile „aleatorie” - presupun că asta face această problemă mai greu de rezolvat?
jjj avatar
drapel cn
jjj
@MeBadMaths Numărul de moduri de a încurca acest lucru este relativ limitat (dacă este posibil). De exemplu, când împărțiți {0, 1, 2, 3, 0, 4, 8, 12} (exemplu mai mic aceeași structură) în două seturi de dimensiunea 4, atunci există o singură modalitate de a face acest lucru (ignorând ordinea seturilor și comanda in seturi)
MeBadMaths avatar
drapel in
Este posibil să „încurcăm” aceste setări, dar devine din ce în ce mai uriaș pe măsură ce obțineți valori din ce în ce mai mari. Fie $N=\prod_{j=1}^n |S_{j}|$, apoi ia $d>N$. Luați $r$ astfel încât $r$ și $d$ sunt coprim și luați $0\leq t_1,t_2,\dots,t_n
jjj avatar
drapel cn
jjj
@MeBadMaths Ok, da, ai dreptul. Credeam că vrei doar să schimbi elementele, nu să le modifici. Am verificat că formula dvs. este valabilă și că într-adevăr nu se poate distinge de valorile aleatorii. Voi ajusta ultima parte a răspunsului meu
MeBadMaths avatar
drapel in
vă mulțumesc pentru toate comentariile și răspunsurile voastre - și scuze pentru explicația mea proastă. Nu am folosit aceste forumuri până acum într-o asemenea măsură, așa că sunt încă nou în modul de formatare a întrebărilor etc. Apreciez foarte mult sprijinul dumneavoastră. Cu siguranță nu caut să dovedească NP haha. Contribuția dvs. a ajutat totuși. Ultima întrebare ar fi; este ordinea căutării extinse $O(n^k)$ așa cum am presupus în postarea mea, sau $O(k^n)$? Sau este altceva? Iti multumesc din nou
jjj avatar
drapel cn
jjj
Am vrut să spun că nu este suficient pentru a demonstra că această problemă este NP grea ^^. Căutarea exhaustivă ar fi O(k^n) (fiecare dintre k elemente din setul unu poate fi combinat cu fiecare dintre k elemente din setul 2...)
MeBadMaths avatar
drapel in
Da, asta are sens, mai mult decât $n^k$. Am citit pagina wiki despre complexitatea timpului și nu pot spune dacă $O(k^n)$ este timp polinom sau timp exponențial? (sau niciunul!) Jur că aceasta este ultima întrebare ahaha, mulțumesc pentru tot ajutorul tău @jjj

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.