Moskovsko državno sveučilište za tisak. Moskovsko državno sveučilište za tisak Brute force algoritam

Imam matematički problem koji rješavam pokušajem i pogreškom (mislim da se to zove brute force) i program radi dobro kada postoji nekoliko parametara, ali kako se dodaje više varijabli/podataka, potrebno je dulje i dulje se izvodi .

Moj problem je taj što, iako prototip radi, koristan je za tisuće varijabli i velike skupove podataka; pa se pitam mogu li se brute force algoritmi skalirati. Kako mogu pristupiti skaliranju?

3 odgovora

Obično možete kvantificirati koliko će se algoritam skalirati korištenjem velike izlazne notacije za analizu njegove stope rasta. Kada kažete da vaš algoritam radi pod "grubom silom", nejasno je u kojoj će se mjeri skalirati. Ako vaše brute force rješenje radi ispisivanjem svakog mogućeg podskupa ili kombinacije skupa podataka, tada se gotovo sigurno neće mjeriti (imat će asimptotičku složenost od O(2n) odnosno O(n!). Ako vaše rješenje grube sile radi pronalaženjem svih parova elemenata i njihovim testiranjem, može se prilično dobro mjeriti (O(n2)). Međutim, bez više informacija o tome kako vaš algoritam funkcionira, teško je reći.

Po definiciji, brute force algoritmi su glupi. Bit ćete puno bolji s pametnijim algoritmom (ako ga imate). Bolji algoritam smanjit će posao koji je potrebno obaviti, nadamo se do te mjere da ga možete obaviti bez potrebe za "skaliranjem" na više strojeva.

Bez obzira na algoritam, dođe trenutak kada je potrebna količina podataka ili snaga obrade toliko velika da morate koristiti nešto poput Hadoopa. Ali općenito, ovdje zapravo govorimo o velikim podacima. Ovih dana već možete učiniti mnogo s jednim računalom.

Algoritam za rješavanje ovog problema blizak je procesu koji proučavamo za ručno matematičko dijeljenje, kao i pretvorbu iz decimalne u drugu bazu kao što je oktalna ili heksadecimalna, osim što se u dva primjera razmatra samo jedno kanonsko rješenje.

Kako bi se osiguralo da je rekurzija potpuna, važno je poredati niz podataka. Kako bismo bili učinkoviti i ograničili broj rekurzija, također je važno započeti s višim vrijednostima podataka.

Konkretno, ovdje je rekurzivna Java implementacija za ovaj problem - s kopijom koeficijenta vektora rezultata za svaku rekurziju, kao što se očekuje u teoriji.

Import java.util.Arrays; javna klasa Solver ( public static void main(String args) ( int target_sum = 100; // preduvjet: sortirane vrijednosti!! int podaci = novi int ( 5, 10, 20, 25, 40, 50); / / vektor rezultata, init to 0 int; fill(coeff, 0); partialSum(data.length - 1, target_sum, coeff, data); private static void printResult(int coeff, int data) ( for ( int i = coeff.length - 1; i >= 0; i--) ( if (coeff[i] > 0) ( System.out.print(data[i] + " * " + coeff[i] + " ") ); ) ) System.out.println(); ) private static void parcialSum(int k, int sum, int coeff, int data) ( int x_k = data[k]; for (int c = sum / x_k; c > = 0; c--) ( coeff[k] = c; if (c * x_k == sum) ( printResult(coeff, data); continue; ) else if (k > 0) ( // kontekstualni rezultat u parametrima , local to method scope int newcoeff = Arrays.copyOf(coeff, coeff.length); partialSum(k - 1, sum - c * x_k, newcoeff, data); // for petlja na "c" nastavlja se s prethodnim coeff sadržajem) ; ) ) )

Ali sada je ovaj kod u posebnom slučaju: posljednji test vrijednosti za svaki koeficijent je 0, tako da kopija nije potrebna.

Kao procjenu složenosti, možemo koristiti maksimalnu dubinu rekurzivnih poziva kao data.length * min(( data )) . Naravno, neće se dobro mjeriti, a ograničavajući faktor bit će memorija praćenja stoga (opcija -Xss JVM). Kod može biti neuspješan s pogreškom za veliki skup podataka.

Kako bi se izbjegli ovi nedostaci, koristan je postupak "prekida". Sastoji se od zamjene stoga poziva metode softverskim stogom za pohranjivanje konteksta izvršenja za kasniju obradu. Evo koda za ovo:

Import java.util.Arrays; import java.util.ArrayDeque; import java.util.Queue; javna klasa NonRecursive ( // preduvjet: sortirane vrijednosti!! privatni statički konačni int podaci = novi int ( 5, 10, 20, 25, 40, 50 ); // Kontekst za pohranjivanje srednjeg izračuna ili statičke klase rješenja Kontekst ( int k; int zbroj; int koeff; Kontekst (int k, int zbroj, int koeff) ( this.k = k; this.sum = zbroj; this.coeff = koeff; ) ) private static void printResult(int coeff ) for (int i = coeff.length - 1; i >= 0; i--) ( if (coeff[i] > 0) ( System.out.print(data[i] + " * " + coeff[i) ] + "); System.out.println();) public static void main(String args) (int target_sum = 100; // init to 0 int coeff = new int; Arrays.fill(coeff) , 0); // red s kontekstima za obradu konteksti = novi ArrayDeque ();

// početni kontekst contexts.add(novi kontekst(data.length - 1, target_sum, coeff));

while(!contexts.isEmpty()) ( Kontekst current = contexts.poll(); int x_k = podaci; for (int c = current.sum / x_k; c >= 0; c--) ( current.coeff = c ; int newcoeff = Arrays.coeff, current.coeff.length); if (c * x_k == current.sum) ( printResult(newcoeff); continue; ) else if (current.k > 0) ( contexts .add(novi kontekst(current.k - 1, current.sum - c * x_k, newcoeff)); S moje točke gledišta, teško je biti učinkovitiji u izvršavanju jedne niti - mehanizam hrpa sada zahtijeva kopije niza coeff. Riža. 11.6. Postupak izrade liste Riža. 11.7. Grafički prikaz stog

Riža. 11.8. Primjer binarnog stablaRiža. 11.9. Korak stabla u binarnu konverziju

Problem sortiranja postavlja se na sljedeći način. Neka postoji niz cijelih ili realnih brojeva. Potrebno je preurediti elemente ovog niza tako da nakon preuređivanja budu poredani u neopadajućem redoslijedu: formula" src="http://hi-edu.ru/e. -books/xbook691/files/178-2. gif" border="0" align="absmiddle" alt="

Ovaj se algoritam smatra najjednostavnijim i najsporijim. Korak sortiranja sastoji se od prolaska nizom odozdo prema gore. U ovom slučaju gledaju se parovi susjednih elemenata. Ako su elementi para u pogrešnom redoslijedu, tada se mijenjaju.

Nakon prvog prolaska kroz niz, “najlakši” (minimalni) element pojavljuje se “na vrhu” (na početku niza), otuda analogija s mjehurićem koji lebdi prema gore (Sl. 11.1
). Sljedeći prolaz se vrši na drugi element odozgo, tako da se drugi najveći element podiže u ispravan položaj i tako dalje.

Prolazi se duž donjeg dijela niza koji se stalno smanjuje sve dok ne ostane samo jedan element. Tu sortiranje završava, budući da je niz poredan uzlaznim redoslijedom.

subheading">Poređaj po izboru

Sortiranje odabirom malo je brže od sortiranja u obliku mjehurića. Algoritam je sljedeći: potrebno je pronaći element niza koji ima najmanju vrijednost, preurediti ga s prvim elementom, zatim učiniti isto, počevši od drugog elementa itd. Ovo stvara sortirani niz dodavanjem jednog elementa za drugim ispravnim redoslijedom. Na i-ti korak odaberite najmanji od elemenata a[i]...a[n] i zamijenite ga s a[i]. Redoslijed koraka prikazan je na sl. 11.2
.

Bez obzira na broj trenutnog koraka i, niz a...a[i] je uređen. Dakle, u (n - 1) koraku, ispada da je cijeli niz osim a [n] sortiran, a [n] je na posljednjem mjestu desno: svi manji elementi već su otišli ulijevo.

subheading">Jednostavno sortiranje umetanjem

Niz se obilazi i svaki novi element a[i] se umeće na odgovarajuće mjesto u već uređenoj kolekciji a,...,a. Ovo mjesto je određeno sekvencijalnom usporedbom a[i] s uređenim elementima a,...,a. Dakle, sortirani niz "raste" na početku niza.

Međutim, u mjehurićima ili izbornom sortiranju bilo je moguće jasno reći da su u i-tom koraku elementi a...a na ispravnim mjestima i da se neće pomaknuti nigdje drugdje. U slučaju jednostavnog sortiranja umetanjem, možemo reći da je niz a...a uređen. U ovom slučaju, kako algoritam napreduje, svi novi elementi će biti umetnuti u njega (pogledajte naziv metode).

Razmotrimo radnje algoritma u i-tom koraku. Kao što je gore spomenuto, niz je u ovom trenutku podijeljen na dva dijela: spremni a...a i neuređeni a[i]...a[n].

U sljedećem, i-tom koraku algoritma, uzimamo [i] i ubacujemo ga na željeno mjesto u gotovom dijelu niza. Potraga za prikladnim mjestom za sljedeći element ulazne sekvence provodi se sekvencijalnim usporedbama s elementom ispred njega. Ovisno o rezultatu usporedbe, element ili ostaje na svom trenutnom položaju (umetanje je završeno), ili se zamjenjuju i proces se ponavlja (Sl. 11.3).
).

Dakle, tijekom procesa umetanja, "prosijavamo" element X na početak niza, zaustavljajući if

  • pronađen je element manji od X;
  • dosegnut je početak niza.

određuje se linearnim algoritmom pretraživanja, kada se cijeli niz sekvencijalno prelazi i trenutni element niza se uspoređuje s traženim. Ako postoji podudaranje, pamti se indeks(i) pronađenog elementa.

Međutim, u problemu pretraživanja može ih biti mnogo dodatni uvjeti. Na primjer, traženje minimalnog i maksimalnog elementa, traženje podniza u nizu, traženje u nizu koji je već sortiran, traženje postoji li željeni element ili ne bez navođenja indeksa itd. Pogledajmo neke tipične zadatke pretraživanja.

Traženje podniza u tekstu (string). Algoritam grube sile

Traženje podniza u nizu provodi se prema zadanom uzorku, tj. neki niz znakova čija duljina ne prelazi duljinu izvornog niza. Posao pretraživanja je utvrditi sadrži li niz zadani uzorak i naznačiti mjesto (indeks) u nizu ako se pronađe podudaranje.

Brute force algoritam je najjednostavniji i najsporiji i sastoji se od provjere podudaranja svih pozicija teksta s početkom uzorka. Ako se početak uzorka podudara, tada se uspoređuje sljedeće slovo u uzorku iu tekstu, i tako dalje sve dok se sljedeće slovo potpuno ne podudara s uzorkom ili razlikuje od njega.

subtitle">Boyer-Moore algoritam

Najjednostavnija verzija Boyer-Moore algoritma sastoji se od sljedećih koraka. Prvi korak je izrada tablice pomaka za željeni uzorak. Zatim se početak retka i uzorak kombiniraju i provjera počinje od posljednjeg znaka uzorka. Ako se zadnji znak uzorka i odgovarajući znak retka kada se preklapaju ne podudaraju, uzorak se pomiče u odnosu na redak za iznos dobiven iz tablice pomaka i ponovno se vrši usporedba, počevši od posljednjeg znaka uzorak. Ako se znakovi podudaraju, uspoređuje se pretposljednji znak uzorka i tako dalje. Ako svi znakovi u uzorku odgovaraju superponiranim znakovima u nizu, tada je podniz pronađen i pretraga je gotova. Ako neki (ne zadnji) znak uzorka ne odgovara odgovarajućem znaku niza, pomičemo uzorak za jedan znak udesno i ponovno počinjemo provjeravati od zadnjeg znaka. Cijeli algoritam se izvršava sve dok se ne pronađe pojavljivanje željenog uzorka ili dok se ne dosegne kraj niza.

Količina pomaka u slučaju neusklađenosti posljednjeg znaka izračunava se prema pravilu: pomak uzorka treba biti minimalan - takav da se ne propusti pojava uzorka u retku. Ako se određeni znak niza pojavljuje u uzorku, uzorak se pomiče tako da znak niza odgovara krajnjem desnom pojavljivanju tog znaka u uzorku. Ako uzorak uopće ne sadrži ovaj znak, tada se uzorak pomiče za iznos jednak njegovoj duljini tako da se prvi znak uzorka superponira na sljedeći znak retka koji se provjerava.

Vrijednost pomaka za svaki znak uzorka ovisi samo o redoslijedu znakova u uzorku, stoga je zgodno izračunati pomake unaprijed i pohraniti ih u obliku jednodimenzionalnog niza, gdje svaki znak abecede odgovara pomaku u odnosu na zadnji znak uzorka. Objasnimo sve gore navedeno u jednostavan primjer. Neka postoji skup od pet znakova: a, b, c, d, e, i trebate pronaći pojavu uzorka "abbad" u nizu "abecccacbadbabbad". Sljedeći dijagrami ilustriraju sve faze algoritma:

formula" src="http://hi-edu.ru/e-books/xbook691/files/ris-page184-1.gif" border="0" align="absmiddle" alt="

Započnite pretragu. Posljednji znak uzorka ne odgovara preklopnom znaku niza. Pomaknite uzorak udesno za 5 pozicija:

formula" src="http://hi-edu.ru/e-books/xbook691/files/ris-page185.gif" border="0" align="absmiddle" alt="

Posljednji znak opet ne odgovara znaku niza. U skladu s tablicom pomaka, pomaknemo uzorak za dva položaja:

formula" src="http://hi-edu.ru/e-books/xbook691/files/ris-page185-2.gif" border="0" align="absmiddle" alt="

Sada, u skladu s tablicom, pomičemo uzorak za jedan položaj i dobivamo željeno pojavljivanje uzorka:

formula" src="http://hi-edu.ru/e-books/xbook691/files/ris-page185-4.gif" border="0" align="absmiddle" alt="

formula" src="http://hi-edu.ru/e-books/xbook691/files/ris-page186.gif" border="0" align="absmiddle" alt="

Funkcija BMSearch vraća položaj prvog znaka prvog pojavljivanja uzorka P u nizu S. Ako niz P nije pronađen u S, funkcija vraća 0 (podsjetimo se da u ObjectPascal-u numeriranje znakova u nizu počinje na 1). Parametar StartPos omogućuje vam da odredite poziciju u nizu S na kojoj će započeti pretraživanje. Ovo može biti korisno ako želite pronaći sva pojavljivanja P u S. Za pretraživanje od samog početka niza, morate postaviti StartPos na 1. Ako rezultat pretraživanja nije nula, tada da biste pronašli sljedeći pojavljivanja P u S, morate postaviti StartPos jednak vrijednosti "prethodni rezultat plus duljina uzorka".

Binarno (binarno) pretraživanje

Binarno pretraživanje koristi se ako je niz u kojem se izvodi već uređen.

Varijable Lb i Ub sadrže redom lijevu i desnu granicu segmenta polja u kojem se nalazi željeni element. Pretraga uvijek počinje ispitivanjem srednjeg elementa segmenta. Ako je željena vrijednost manja od srednjeg elementa, tada morate prijeći na pretragu u gornjoj polovici segmenta, gdje su svi elementi manji od upravo označenog. Drugim riječima, vrijednost Ub postaje (M-1), au sljedećoj se iteraciji provjerava polovica izvornog niza. Dakle, kao rezultat svake provjere, područje pretrage se prepolovljuje. Na primjer, ako u nizu ima 100 brojeva, tada se nakon prve iteracije područje pretraživanja smanjuje na 50 brojeva, nakon druge - na 25, nakon treće na 13, nakon četvrte na 7, itd..gif" border="0" align=" absmiddle" alt="

Dinamičke strukture podataka temelje se na korištenju pokazivača i korištenju standardnih procedura i funkcija za dodjelu/oslobađanje memorije tijekom rada programa. Razlikuju se od statičkih struktura podataka, koje su opisane u odjeljcima o vrstama i podacima. Kada je u programu opisana statička varijabla, tada se prilikom prevođenja programa, ovisno o vrsti varijable, ona označava OVAN. Međutim, nije moguće promijeniti veličinu dodijeljene memorije.

Na primjer, ako je naveden niz

Var S: niz znakova,

tada se za to jednokratno dodjeljuje 10 bajtova RAM-a na početku izvođenja programa.

Dinamičke strukture karakterizira nestalnost i nepredvidivost veličine (broja elemenata) konstrukcije tijekom njezine obrade.

Budući da se elementi dinamičke strukture nalaze na nepredvidivim memorijskim adresama, adresa elementa takve strukture ne može se izračunati iz adrese početnog ili prethodnog elementa.

Za uspostavljanje veza između elemenata dinamičke strukture koriste se pokazivači preko kojih se uspostavljaju eksplicitne veze između elemenata. Ovakav prikaz podataka u memoriji naziva se koherentnim. Element dinamičke strukture sastoji se od dva polja:

  • informacijsko polje ili podatkovno polje koje sadrži podatke za koje je struktura stvorena; V opći slučaj samo informacijsko polje je integrirana struktura: zapis, vektor, niz, druga dinamička struktura itd.;
  • link polja koja sadrže jedan ili više pokazivača koji povezuju dani element s drugim elementima strukture.

Kada se koherentna reprezentacija podataka koristi za rješavanje aplikacijskog problema, samo sadržaj informacijskog polja postaje "vidljiv" krajnjem korisniku, a polje veze koristi samo programer-developer.

Prednosti koherentnog prikaza podataka:

  • sposobnost osiguravanja značajne varijabilnosti u strukturama;
  • ograničavanje veličine strukture samo na dostupnu količinu memorije stroja;
  • pri promjeni logičkog slijeda elemenata strukture nije potrebno premještati podatke u memoriji, već samo korigirati pokazivače;
  • veću strukturnu fleksibilnost.

U isto vrijeme, koherentna reprezentacija nije bez nedostataka, od kojih su glavni:

  • dodatna memorija se troši na polja veze;
  • pristup elementima kohezivne strukture može biti vremenski manje učinkovit.
  • Posljednji nedostatak je najozbiljniji i upravo on ograničava primjenjivost koherentnog prikaza podataka. Ako smo u susjednom prikazu podataka (nizovi) za izračunavanje adrese bilo kojeg elementa u svim slučajevima imali samo broj elementa i informacije sadržane u deskriptoru strukture, tada se za povezani prikaz adresa elementa ne može izračunati iz izvornih podataka . Deskriptor povezane strukture sadrži jedan ili više pokazivača koji vam omogućuju ulazak u strukturu; zatim se traži traženi element prateći lanac pokazivača od elementa do elementa. Stoga se povezana reprezentacija gotovo nikada ne koristi u zadacima gdje je logična struktura podataka u obliku vektora ili niza – s pristupom prema broju elementa, ali se često koristi u zadacima gdje logička struktura zahtijeva druge početne pristupne informacije (tablice, liste, stabla itd.).

    Dinamičke strukture koje se koriste u programiranju uključuju:

    • dinamički nizovi (raspravljano u temi 6);
    • linearne liste;
    • stog;
    • red, dec;
    • stabla.

    Lista je uređen skup koji se sastoji od varijabilni broj elementi na koje su primjenjive operacije uključivanja i isključivanja. Popis koji odražava odnose susjedstva između elemenata naziva se linearni.

    Duljina liste jednaka je broju elemenata koje sadrži; lista nulte duljine naziva se praznom. Linearni povezani popisi su najjednostavnije dinamičke podatkovne strukture. Grafički, veze na listama su prikladno predstavljene pomoću strelica, kao što je prikazano u odjeljku koji opisuje pokazivače. Ako element popisa nije povezan ni s jednim drugim, tada se polje pokazivača ispunjava vrijednošću koja ne pokazuje ni na jedan element (nulti pokazivač). Takva se veza u Pascalu označava s Nil, a na dijagramu je označena prekriženim pravokutnikom. Ispod je struktura pojedinačno povezana lista
    (Sl. 11.4 ), tj. veza ide od jednog elementa liste do drugog u jednom smjeru

    . Ovdje je polje D informacijsko polje koje sadrži podatke (bilo koji tip dopušten u jeziku Pascal), polje N (NEXT) je pokazivač na sljedeći element popisa.

    Dvostruko povezana linearna lista razlikuje se od jednostruko povezane liste po prisutnosti na svakom čvoru liste još jednog pokazivača B (Natrag), koji se odnosi na prethodni element liste (Sl. 11.5).
    ).

    Struktura podataka koja odgovara dvostruko povezanoj linearnoj listi opisana je u Pascalu na sljedeći način:

    marker">

  • stvaranje popisa;
  • dodavanje novog elementa na listu: na početak liste, na kraj liste, iza trenutnog elementa liste, ispred trenutnog elementa liste;
  • uklanjanje elementa s popisa;
  • prelaženje liste radi obrade;
  • traženje čvora na popisu;
  • Metoda grube sile

    Dovršite pretragu(ili brute force metoda iz engleskog gruba sila) - metoda za rješavanje problema pretraživanjem kroz sve moguće opcije. Složenost iscrpne pretrage ovisi o dimenziji prostora svega moguća rješenja zadaci. Ako je prostor rješenja vrlo velik, iscrpna pretraga možda neće dati rezultate nekoliko godina ili čak stoljeća.

    Pogledajte što je "metoda grube sile" u drugim rječnicima:

      Potpuna pretraga (ili metoda “brute sile” od engleskog brute force) je metoda rješavanja problema pretraživanjem svih mogućih opcija. Složenost cjelovite pretrage ovisi o dimenziji prostora svih mogućih rješenja problema. Ako je prostor rješenja... ... Wikipedia

      Sortiranje jednostavnim razmjenama, sortiranje u obliku mjehurića jednostavan je algoritam sortiranja. Ovaj algoritam je najjednostavniji za razumijevanje i implementaciju, ali je učinkovit samo za male nizove. Složenost algoritma: O(n²). Algoritam... ... Wikipedia

      Ovaj izraz ima i druga značenja, vidi Overkill. Brute force (ili gruba sila) je metoda za rješavanje matematičkih problema. Pripada klasi metoda za pronalaženje rješenja iscrpljivanjem svih mogućih... ... Wikipedije

      Naslovnica prvog izdanja brošure “Bail's Papers...” Baleovi kriptogrami su očekivano tri šifrirane poruke koje sadrže podatke o lokaciji blaga zlata, srebra i dragog kamenja, navodno zakopanog na teritoriju ... Wikipedia

      Snefru je kriptografska jednosmjerna hash funkcija koju je predložio Ralph Merkle. (Samo ime Snefru, nastavljajući tradiciju blokovskih šifri Khufu i Khafre, koje je također razvio Ralph Merkle, naziv je egipatskog ... ... Wikipedia

      Pokušaj razbijanja (dekriptiranja) podataka šifriranih blok šifrom. Sve glavne vrste napada odnose se na blok šifre, ali postoje neki napadi koji su specifični samo za blok šifre. Sadržaj 1 Vrste napada 1.1 Općenito ... Wikipedia

      Neurokriptografija je grana kriptografije koja posebno proučava korištenje stohastičkih algoritama neuronske mreže, za enkripciju i kriptoanalizu. Sadržaj 1 Definicija 2 Primjena ... Wikipedia

      Optimalna ruta za trgovačkog putnika kroz 15 najvećih gradova u Njemačkoj. Navedena ruta je najkraća od svih mogućih 43,589,145,600 problema trgovačkog putnika (Traveling salesman ... Wikipedia

      Kriptografska hash funkcija Ime N Hash Stvoreno 1990. Objavljeno 1990. Veličina hash-a 128 bita Broj krugova 12 ili 15 Vrsta hash funkcije N Hash kriptografski ... Wikipedia

      Problem trgovačkog putnika (trgovački putnik) jedan je od najpoznatijih problema kombinatorne optimizacije. Zadatak je pronaći najprofitabilniju rutu koja prolazi kroz navedene gradove barem jednom u... ... Wikipediji


    Traženje podniza u nizu provodi se prema zadanom uzorku, tj. neki niz znakova čija duljina ne prelazi duljinu izvornog niza. Posao pretraživanja je utvrditi sadrži li niz zadani uzorak i naznačiti mjesto (indeks) u nizu ako se pronađe podudaranje.

    Brute force algoritam je najjednostavniji i najsporiji i sastoji se od provjere svih pozicija teksta kako bi se vidjelo odgovaraju li početku uzorka. Ako se početak uzorka podudara, uspoređuje se sljedeće slovo u uzorku iu tekstu, i tako dalje, s najnovijim jednostavnim i najsporijim odgovorom, postoji li takav element ili ne, bez naznake postoji li već sortirano prema nedostatku potpunog podudaranja uzorka ili razlike u sljedećem slovu.

    int BFSearch(char *s, char *p)

    za (int i = 1; strlen(s) - strlen(p); i++)

    za (int j = 1; strlen(p); j++)

    if (p[j] != s)

    if (j = strlen(p))

    Funkcija BFSearch traži podniz p u nizu s i vraća indeks prvog znaka podniza ili 0 ako podniz nije pronađen. Iako je ova metoda, kao i većina brute force metoda, općenito neučinkovita, u nekim je situacijama sasvim prihvatljiva.

    Najbrži među algoritmima opće namjene, dizajniran za traženje podniza u nizu, smatra se algoritmom Boyer-Moore, koji su razvila dva znanstvenika - Boyer (Robert S. Boyer) i Moore (J. Strother Moore), čija je suština sljedeća.

    Boyer-Mooreov algoritam

    Najjednostavnija verzija Boyer-Moore algoritma sastoji se od sljedećih koraka. Prvi korak je izrada tablice pomaka za željeni uzorak. Proces izgradnje stola bit će opisan u nastavku. Zatim se početak retka i uzorak kombiniraju i provjera počinje od posljednjeg znaka uzorka. Ako se zadnji znak uzorka i odgovarajući znak retka kada se preklapaju ne podudaraju, uzorak se pomiče u odnosu na redak za iznos dobiven iz tablice pomaka i ponovno se vrši usporedba, počevši od posljednjeg znaka uzorak. Ako se znakovi podudaraju, uspoređuje se pretposljednji znak uzorka i tako dalje. Ako svi znakovi u uzorku odgovaraju superponiranim znakovima u nizu, tada je podniz pronađen i pretraga je gotova. Ako neki (ne zadnji) znak uzorka ne odgovara odgovarajućem znaku niza, pomičemo uzorak za jedan znak udesno i ponovno počinjemo provjeravati od zadnjeg znaka. Cijeli algoritam se izvršava sve dok se ne pronađe pojavljivanje željenog uzorka ili dok se ne dosegne kraj niza.

    Količina pomaka u slučaju neusklađenosti posljednjeg znaka izračunava se prema pravilu: pomak uzorka mora biti minimalan, kako se ne bi propustilo pojavljivanje uzorka u retku. Ako se određeni znak niza pojavljuje u uzorku, uzorak se pomiče tako da znak niza odgovara krajnjem desnom pojavljivanju tog znaka u uzorku. Ako uzorak uopće ne sadrži taj znak, tada se uzorak pomiče za iznos jednak njegovoj duljini, tako da se prvi znak uzorka superponira na sljedeći znak nakon testiranog znaka retka.

    Vrijednost pomaka za svaki znak uzorka ovisi samo o redoslijedu znakova u uzorku, stoga je zgodno izračunati pomake unaprijed i pohraniti ih u obliku jednodimenzionalnog niza, gdje svaki znak abecede odgovara pomaku u odnosu na zadnji znak uzorka. Objasnimo sve gore navedeno na jednostavnom primjeru. Neka postoji skup od pet znakova: a, b, c, d, e, i trebate pronaći pojavu uzorka "abbad" u nizu "abecccacbadbabbad". Sljedeći dijagrami ilustriraju sve faze algoritma:

    Tablica pomaka za uzorak "abbad".

    Započnite pretragu. Posljednji znak uzorka ne odgovara preklopnom znaku niza. Pomaknite uzorak udesno za 5 pozicija:

    Tri simbola uzorka su se podudarala, ali četvrti nije. Pomaknite uzorak udesno za jedan položaj:

    Posljednji znak opet ne odgovara znaku niza. U skladu s tablicom pomaka, pomaknemo uzorak za 2 položaja:

    Još jednom pomičemo uzorak za 2 položaja:

    Sada, u skladu s tablicom, pomičemo uzorak za jedan položaj i dobivamo željeno pojavljivanje uzorka:

    Implementirajmo navedeni algoritam. Prije svega, trebate definirati vrstu podataka tablice pomaka. Za kodnu tablicu koja se sastoji od 256 znakova, definicija strukture će izgledati ovako:

    BMTable MakeBMTable(char *p)

    za (i = 0; i<= 255; i++) bmt->bmtarr[i] = strlen(p);

    za (i = strlen(p); i<= 1; i--)

    if (bmt->bmtarr] == strlen(p))

    bmt->bmtarr] = strlen(p)-i;

    Sada napišimo funkciju koja vrši pretragu.

    int BMSearch(int startpos, char *s, char *p)

    pos = startpos + lp - 1;

    dok (poz< strlen(s))

    if (p != s) pos = pos + bmt->bmtarr];

    za (i = lp - 1; i<= 1; i--)

    if (p[i] != s)

    return(pos - lp + 1);

    Funkcija BMSearch vraća položaj prvog znaka prvog pojavljivanja uzorka p u nizu s. Ako sekvenca p u s nije pronađena, funkcija vraća 0. Parametar startpos omogućuje vam da navedete poziciju u nizu s na kojoj će započeti pretraživanje. Ovo može biti korisno ako želite pronaći sva pojavljivanja p u s. Za pretraživanje od samog početka niza, postavite startpos na 1. Ako rezultat pretraživanja nije nula, tada da biste pronašli sljedeće pojavljivanje p u s, postavite startpos na vrijednost "prethodni rezultat plus duljina uzorka."

    Binarno (binarno) pretraživanje

    Binarno pretraživanje koristi se kada je niz koji se pretražuje već posložen.

    Varijable lb i ub sadrže redom lijevu i desnu granicu segmenta polja u kojem se nalazi željeni element. Pretraga uvijek počinje ispitivanjem srednjeg elementa segmenta. Ako je željena vrijednost manja od srednjeg elementa, tada morate prijeći na pretragu u gornjoj polovici segmenta, gdje su svi elementi manji od upravo označenog. Drugim riječima, vrijednost ub postaje (m – 1) iu sljedećoj iteraciji provjerava se polovica izvornog niza. Dakle, kao rezultat svake provjere, područje pretrage se prepolovljuje. Na primjer, ako u nizu ima 100 brojeva, tada se nakon prve iteracije područje pretraživanja smanjuje na 50 brojeva, nakon druge na 25, nakon treće na 13, nakon četvrte na 7 itd. Ako je duljina niza n, tada je oko log 2 n usporedbi dovoljno za pretraživanje niza elemenata.

    Metode za razvoj algoritama n Metoda grube sile ("brute force") n Metoda dekompozicije n Metoda smanjenja veličine problema n Metoda transformacije n Dinamičko programiranje n Pohlepne metode n Metode smanjenja pretraživanja n ... © T. A. Pavlovskaya (SPb NRU ITMO) 1

    Metoda grube sile n Izravan pristup rješavanju problema, obično izravno temeljen na iskazu problema i definicijama koncepata koje koristi Primjer: izračunavanje potencije broja množenjem 1 s tim brojem n puta n Primjenjivo na gotovo sve vrste problema n Često se ispostavi da je najjednostavniji za korištenje n Rijetko daje lijepe i učinkovite algoritme n Trošak razvoja učinkovitijeg algoritma može biti previsok ako treba riješiti samo nekoliko instanci problema n Može biti koristan za rješavanje malih instanci problema. n Može poslužiti kao mjera za određivanje učinkovitosti drugih algoritama ©T. A. Pavlovskaya (St. Petersburg National Research University ITMO) 3

    n Primjer: selekcija i sortiranje mjehurića 28 -5 ©T. Pavlovskaya (St. Petersburg National Research University ITMO) 16 0 29 3 -4 56 4

    Iscrpna pretraga je grubi pristup kombinatornim problemima. Uključuje: n generiranje svih mogućih elemenata iz domene definicije problema n odabir onih koji zadovoljavaju ograničenja nametnuta uvjetom problema n traženje željenog elementa (na primjer, optimiziranje vrijednosti ciljne funkcije problema). Primjeri: Problem trgovačkog putnika: pronađite najkraći put prema Razmotrite sve podskupove dati skup od n stavki, danih N gradovima, tako da je svaki grad posjećen, samo izračunajte ukupnu težinu svake od njih kako biste otkrili prihvatljivost, jednom i konačno odredište ispada ono izvorno. odaberite iz važećeg podskupa s maksimalnom težinom. n Nabavite sve moguće rute, generirajući sve probleme s naprtnjačama: zadanih N stavki zadane težine i cijene naprtnjače koja može podnijeti težinu W. Napunite naprtnjaču s permutacijama od n - 1 međugradova, računajući s maksimalnom cijenom. duljina odgovarajućih puteva i pronalaženje najkraćeg. To su NP-teški problemi (ne postoji poznati algoritam koji ih rješava u polinomnom vremenu). n ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 5

    Metoda dekompozicije To je također metoda "podijeli pa vladaj": n Instanca zadatka podijeljena je u nekoliko manjih instanci istog zadatka, idealno iste veličine. n Rješavaju se manje instance problema (obično rekurzivno, iako se ponekad za manje instance koristi neki drugi algoritam). n Ako je potrebno, rješenje izvornog problema nalazi se kombiniranjem rješenja manjih instanci. Metoda dekompozicije idealna je za paralelno računanje. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 7

    Jednadžba rekurentne dekompozicije n Općenito, instanca problema veličine n može se podijeliti u nekoliko instanci veličine n/b, od kojih se traži rješavanje. n Generalizirana jednadžba rekurentne dekompozicije: (1) n radi jednostavnosti, pretpostavlja se da je veličina n jednaka potenciji b. n Redoslijed rasta ovisi o a, b i f. ©T. A. Pavlovskaya (St. Petersburg National Research University ITMO) 8

    Osnovni teorem o dekompoziciji (1) n Možete odrediti klasu učinkovitosti algoritma bez rješavanja same jednadžbe ponavljanja. n Ovaj vam pristup omogućuje određivanje redoslijeda rasta rješenja bez određivanja nepoznatih čimbenika. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 9

    Sortiranje spajanjem Razvrstava dani niz tako da ga dijeli na dvije polovice, rekurzivno sortira svaku polovicu i spaja dvije sortirane polovice u jedan sortirani niz: Sortiraj spajanjem (A) ako je n>1 Prva polovica A -> u niz B Druga polovica A -> u niz C Mergesort(B) Mergesort(C) Merge(B, C, A) // spajanje © Pavlovskaya T. A. (SPb NRU ITMO) 10

    Src="http://present5.com/presentation/54441564_438337950/image-11.jpg" alt="Mergesort (A) if n>1 Prva polovica A -> do niza B Druga polovica A"> Mergesort (A) if n>1 Первая половина А -> в массив В Вторая половина А > в массив С Mergesort(B) Mergesort(C) Меrgе(В, С, А) ©Павловская Т. А. (СПб НИУ ИТМО) 11!}

    Spajanje nizova n Dva indeksa niza nakon inicijalizacije pokazuju na prve elemente spojenih nizova. n Elementi se uspoređuju i manji se dodaje u novi niz. n Indeks manjeg elementa je inkrementiran (pokazuje na element odmah nakon onog koji je upravo kopiran). Ova se operacija ponavlja dok se ne potroši jedan od spojenih nizova. Preostali elementi drugog niza dodaju se na kraj novog niza. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 12

    Analiza sortiranja spajanjem n Neka duljina datoteke bude potencija broja 2. n Broj ključnih usporedbi: C(n) = 2*C(n/2) + Cmerge (n) n > 1, C(1)=0 n Cmerge (n) = n-1 u najgorem slučaju (broj ključnih usporedbi tijekom spajanja) n U najgorem slučaju Cw: d=1 a=2 b=2 Cw(n) = 2*Cw (n/2) +n -1 Cw (n ) (n log n) – prema osn. teorem ©Pavlovskaya T. A. (SPb NRU ITMO) (1) 13

    n Broj ključnih usporedbi izvedenih sortiranjem spajanjem je, u najgorem slučaju, vrlo blizu teoretskog minimalnog broja usporedbi za bilo koji algoritam sortiranja temeljen na usporedbi. n Glavni nedostatak sortiranja spajanjem je potreba za dodatnom memorijom, čija je količina linearno proporcionalna veličini ulaznih podataka. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 14

    Brzo sortiranje Za razliku od sortiranja spajanjem, koje odvaja elemente niza prema njihovom položaju u nizu, brzo sortiranje odvaja elemente niza prema njihovim vrijednostima. 28 56 ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 1 0 29 3 -4 16 15

    Opis algoritma n Odaberite referentni element n Izvršite permutaciju elemenata da dobijete particiju kada svi elementi do neke pozicije s ne prelaze element A [s], a elementi nakon pozicije s nisu manji od njega. n Očito, nakon particioniranja, A [s] je na konačnoj poziciji i možemo neovisno sortirati dva podniza elemenata ispred i iza A [s] (istom ili drugom metodom) © T. A. Pavlovskaya (SPb NRU ITMO) 16

    Postupak za permutaciju elemenata n Učinkovita metoda, na temelju dva prolaza podniza - slijeva nadesno i zdesna nalijevo. Pri svakom prolazu elementi se uspoređuju s referencom. n Prijelaz s lijeva na desno (i) preskače elemente manje od reference i zaustavlja se na prvom elementu koji nije manji od reference. n Prolazak s desna na lijevo (j) preskače elemente veće od reference i zaustavlja se na prvom elementu koji nije veći od reference. n Ako se indeksi skeniranja ne sijeku, mijenjamo pronađene elemente i nastavljamo prolaze. n Ako se indeksi sijeku, zamijenite element podrške s Aj © T. A. Pavlovskaya (St. Petersburg National Research University ITMO) 17

    Učinkovitost brzog sortiranja n Najbolji slučaj: sve particije završavaju u sredini odgovarajućih podnizova n U najgorem slučaju sve particije su takve da je jedan od podnizova prazan, a veličina drugog je za 1 manja od veličine particioniranog niza (ovisnost je kvadratna). n U prosječnom slučaju, pretpostavljamo da se podjela može izvesti u svakoj poziciji s istom vjerojatnošću: Cavg 2 n ln n 1, 38 n log 2 n © T. A. Pavlovskaya (SPb NRU ITMO) 18

    Poboljšanja algoritma n poboljšane metode za odabir elementa podrške n prebacivanje na više jednostavno sortiranje za male podnizove n uklanjanje rekurzije Sva ova poboljšanja mogu smanjiti vrijeme rada algoritma za 20 -25% (R. Sedgwick) © T. A. Pavlovskaya (SPb NRU ITMO) 19

    Obilaženje binarnog stabla Ovo je još jedan primjer korištenja metode dekompozicije. U obilasku prednarudžbe prvo se posjećuje korijen stabla, a zatim lijevo i desno podstablo. n U simetričnom obilasku, korijen se posjećuje nakon lijevog podstabla, ali prije posjeta desnom. n U obrnutom obilasku, korijen se posjećuje nakon lijevog i desnog podstabla. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 20

    Prolazak kroz stablo procedure print_tree(tree); početak print_tree(left_subtree) posjet korijenu print_tree(right_subtree) kraj; 1 6 8 10 20 ©Pavlovskaya T. A. (St. Petersburg State University ITMO) 21 25 30 21

    Metoda smanjenja veličine problema temelji se na korištenju veze između rješenja dane instance problema i rješenja manje instance istog problema. Nakon što se uspostavi takav odnos, može se koristiti ili odozgo prema dolje (rekurzivno) ili odozdo prema gore (nerekurzivno). (primjer - podizanje broja na potenciju) Postoje tri glavne opcije za metodu smanjenja veličine: n smanjenje za konstantan iznos (obično za 1); n smanjenje za konstantan faktor (obično 2 puta); n varijabilno smanjenje veličine. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 23

    Sortiranje umetanjem Pretpostavimo da je problem sortiranja niza dimenzija n-1 riješen. Zatim sve što preostaje je umetnuti An na pravo mjesto: n Pretraživanje niza slijeva na desno n Pretraživanje niza s desna na lijevo n Korištenje binarnog pretraživanja za mjesto umetanja n Iako se sortiranje umetanjem temelji na rekurzivnom pristupu, učinkovitije ga je implementirati odozdo prema gore (iterativno). ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 24

    Implementacija pseudokoda za i = 1 do n - 1 do v = 0 i A[j] > v do A

    Učinkovitost sortiranja umetanjem n Najgori slučaj: izvodi isti broj usporedbi kao sortiranje odabirom n Najbolji slučaj (za inicijalno sortirano polje): uspoređuje samo 1 put za svaki prolaz vanjske petlje n Prosječni slučaj (slučajni niz): izvodi ~2 puta manje usporedbi nego u slučaju silaznog niza. Da. , prosječan slučaj je 2 puta bolji od najgoreg slučaja. Zajedno s superiornom izvedbom za gotovo sortirane nizove, to čini sortiranje umetanjem od ostalih elementarnih (odabir i mjehurić) algoritama. n Modifikacija metode je umetanje nekoliko elemenata odjednom, koji se sortiraju prije umetanja. n Proširenje sortiranja umetanjem, Shell sort, pruža još bolji algoritam za dovoljno sortiranje velike datoteke. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 26

    Generiranje kombinatornih objekata n Najvažniji tipovi kombinatornih objekata su permutacije, kombinacije i podskupovi danog skupa. n Obično se pojavljuju u problemima koji zahtijevaju razmatranje različitih izbora. n Osim toga, postoje koncepti postavljanja i particioniranja. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 28

    Generiranje permutacija Broj permutacija n Neka je zadan n-elementni skup (set). n Prvo mjesto u permutaciji može biti bilo koji element, odnosno postoji n načina za odabir prvog elementa. n Ostalo je (n-1) elemenata za odabir drugog elementa u permutaciji (postoji (n-1) načina za odabir drugog elementa). n Preostalo je (n-2) elemenata za odabir trećeg elementa u permutaciji, itd. n Ukupno, uređen skup od n elemenata može se dobiti: na načine © T. A. Pavlovskaya (SPb NRU ITMO) 29

    Primjena metode smanjenja veličine na problem dobivanja svih permutacija od n Radi jednostavnosti, pretpostavljamo da je skup permutiranih elemenata skup cijelih brojeva od 1 do n. n Zadatak manji za jedan je generirati sve (n - 1)! permutacije. n Pod pretpostavkom da je riješeno, možemo dobiti rješenje većeg problema umetanjem n u svaku od n mogućih pozicija među elementima svake od permutacija od n - 1 elemenata. n Sve permutacije dobivene na ovaj način bit će različite, a njihov ukupan broj: n(n- 1)! = n! n Možete umetnuti n u prethodno generirane permutacije s lijeva na desno ili zdesna na lijevo. Korisno je početi s desna na lijevo i mijenjati smjer svaki put kada prijeđete na novu permutaciju skupa (1, . . . , n - 1). ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 30

    Primjer (uzlazna generacija permutacija) n 12 21 n 123 132 312 321 231 213 © Pavlovskaya T. A. (SPb NRU ITMO) 31

    Johnson-Trotter algoritam Uvodi koncept mobilni element. Svaki element je povezan sa strelicom; element se smatra pokretnim ako strelica pokazuje na manji susjedni element. n Inicijalizirati prvu permutaciju s vrijednošću 1 2. . . n (sve strelice ulijevo) n dok postoji broj mobilnog telefona k do n Pronađite najveći broj mobilnog telefona k Zamijenite k i susjedni broj na koji pokazuje strelica k n n Promijenite smjer strelica za sve brojeve veće od k © Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 32

    Leksikografski poredak n Neka postoji prva permutacija (na primjer, 1234). n Da biste pronašli svaki sljedeći: 1. Skenirajte trenutnu permutaciju s desna na lijevo u potrazi za prvim parom susjednih elemenata tako da je [i]

    Primjer za razumijevanje algoritma 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 431 2 4 321 ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 34

    Broj svih permutacija od n elemenata P(n) = n! ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 35

    Podskupovi n Skup A je podskup skupa B ako bilo koji element koji pripada A također pripada B: A B ili A B n Svaki skup je vlastiti podskup. Prazan skup je podskup bilo kojeg skupa. n Skup svih podskupova označava se s 2 A (također se naziva skup snaga, skup snaga, stupanj skupa, Boolean, eksponencijalni skup). n Broj podskupova konačnog skupa koji se sastoji od n elemenata jednak je 2 n (za dokaz pogledajte Wikipediju) © Pavlovskaya T. A. (SPb NRU ITMO) 36

    Generiranje svih podskupova n Primijenimo metodu smanjenja veličine problema za 1. n Svi podskupovi A = (a 1, . . . , an) mogu se podijeliti u dvije skupine - one koji sadrže element an i one koji ga ne sadrže. n Prva grupa su svi podskupovi (a 1, . . . , an-1); svi elementi druge skupine mogu se dobiti dodavanjem elementa an podskupovima prve skupine. (a 1) (a 2) (a 1, a 2) (a 3) (a 1, a 3) (a 2, a 3) (a 1, a 2, a 3) Pogodno je dodijeliti bitne elemente elementima postavljenih linija: 000 001 010 011 100 101 110 111 n Ostali redovi: gusto; Sivi kod: n 000 001 010 111 100 © T. A. Pavlovskaya (St. Petersburg National Research University ITMO) 37

    Generiranje Grayevih kodova n Grayev kod za n bitova može se rekurzivno konstruirati iz koda za n–1 bita: n pisanjem kodova obrnutim redoslijedom n ulančavanjem izvornih i invertiranih popisa n dodavanjem 0 na početak svakog koda u izvorni popis i 1 na početak kodova u obrnutom popisu. Primjer: n Kodovi za n = 2 bita: 00, 01, 10 n Invertirani popis kodova: 10, 11, 00 n Kombinirani popis: 00, 01, 10, 11, 00 n Nule dodane početnom popisu: 000, 001 , 010 , 11, 00 n Jedinice dodane na obrnuti popis: 000, 001, 010, 111, 100 © Pavlovskaya T. A. (SPb NRU ITMO) 38

    Podskupovi K-elemenata n Broj podskupova k-elemenata n (0 k n) naziva se broj kombinacija (binomni koeficijent): n Izravno rješenje je neučinkovito zbog brzog rasta faktorijela. n U pravilu, generiranje k-elementnih podskupova provodi se leksikografskim redoslijedom (za bilo koja dva podskupa, prvi se generira onaj čiji se indeksi elemenata mogu koristiti za formiranje manjeg k-znamenkastog broja u n- arni brojevni sustav). n Metoda: n prvi element podskupa kardinalnosti k može biti bilo koji od elemenata, počevši od prvog i završavajući s (n-k+1)-im. n Nakon što je indeks prvog elementa podskupa fiksiran, preostaje odabrati k-1 elemenata među elementima čiji su indeksi veći od prvog. n Zatim nastavite na sličan način, smanjujući problem na manju dimenziju dok se zadnji element ne odabere na najnižoj razini rekurzije, nakon čega se odabrani podskup može ispisati ili obraditi. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 39

    Primjer: kombinacije od 6 do 3 #include const int N = 6, K = 3; int a[K]; void rec(int i) ( if (i == K) ( for (int j = 0; j 0 ? a + 1: 1); a[i]

    Svojstva kombinacija n Svaki podskup od n-elemenata danog skupa elemenata odgovara jednom i samo jednom podskupu od n-k-elemenata istog skupa: n © Pavlovskaya T. A. (SPb NRU ITMO) 41

    Rasporedi n Raspored od n elemenata po m je niz koji se sastoji od m različitih elemenata nekog skupa od n elemenata (kombinacije koje se sastoje od zadanih n elemenata po m elemenata i razlikuju se ili u samim elementima ili u redoslijedu elemenata ).Razlike u definicijama kombinacija i postavljanja: n Kombinacija – podskup koji sadrži m elemenata od n (redoslijed elemenata nije važan). n Aranžman je niz koji sadrži m elemenata od n (redoslijed elemenata je važan). Kod formiranja niza bitan je redoslijed elemenata, ali kod formiranja podskupa redoslijed nije bitan. ©Pavlovskaya T. A. (St. Petersburg State University ITMO) 44

    Broj rasporeda n Broj rasporeda od n do m: Primjer 1: Koliko ima dvoznamenkastih brojeva u kojima su znamenka desetica i znamenka jedinica različite i neparne? Osnovni skup: (1, 3, 5, 7, 9) – neparni brojevi, n=5 n Veza – dvoznamenkasti broj m=2, bitan je redoslijed, što znači da se radi o rasporedu “pet sa dva”. n Permutacije se mogu smatrati posebnim slučajem postavljanja s m=n Primjer 2: Na koliko načina možete napraviti zastavu koja se sastoji od tri vodoravne pruge različitih boja, ako postoji materijal od pet boja? ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 45

    Postavljanja s ponavljanjima n Postavljanja s ponavljanjima od n elemenata skupa E = (a 1, a 2, . . . , an) po k - bilo koji konačni niz koji se sastoji od k elemenata zadanog skupa E. n Dva postavljanja s ponavljanjima su smatraju različitim ako barem na jednom mjestu imaju različite elemente skupa E. n Broj različitih postavljanja s ponavljanjima od n do k jednak je nk. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 46

    Particioniranje skupova n Particioniranje skupa je njegovo predstavljanje kao unije proizvoljnog broja po parovima disjunktnih podskupova. n Broj neuređenih particija skupa n-elemenata na k dijelova - Stirlingov broj 2. vrste: n Broj uređenih particija skupa n-elemenata na m dijelova fiksne veličine - multinomni koeficijent: n broj svih neuređenih particija skupa n-elemenata dan je Bellovim brojem: © Pavlovskaya T. A. (SPb NRU ITMO) 47

    Metoda redukcije konstantnim faktorom n Primjer: binarno pretraživanje n Takvi algoritmi su logaritamski i, budući da su vrlo brzi, prilično su rijetki. Metoda redukcije varijabilnim faktorom n Primjeri: pretraživanje i umetanje u binarno stablo pretraživanja, interpolacijsko pretraživanje: © Pavlovskaya T. A. (St. Petersburg State University ITMO) 48

    Analiza performansi n Interpolacijsko pretraživanje zahtijeva u prosjeku manje od log 2 n+1 ključnih usporedbi prilikom pretraživanja popisa od n slučajnih vrijednosti. n Ova funkcija raste tako sporo da se za sve stvarne praktične vrijednosti n može smatrati konstantom. n Međutim, u najgorem slučaju, interpolacijsko pretraživanje degenerira u linearno pretraživanje, koje se smatra najgorim mogućim pretraživanjem. n Interpolacijsko pretraživanje najbolje se koristi za velike datoteke i aplikacije u kojima je usporedba ili pristup podacima skupa operacija. ©Pavlovskaya T. A. (St. Petersburg National Research University ITMO) 49

    Metoda transformacije n Sastoji se od činjenice da se instanca problema transformira u drugu, iz jednog ili drugog razloga koji je lakše riješiti. n Postoje tri glavne verzije ove metode: ©T. A. Pavlovskaya (St. Petersburg National Research University ITMO) 50

    Primjer 1: Provjera jedinstvenosti elemenata niza n Brute-force algoritam uspoređuje sve elemente u paru dok se ne pronađu dva identična ili dok se ne pregledaju svi mogući parovi. U najgorem slučaju, učinkovitost je kvadratna. n Problemu možete pristupiti na drugi način - prvo sortirajte niz, a zatim usporedite samo uzastopne elemente. n Vrijeme rada algoritma je zbroj vremena sortiranja i vremena provjere susjednih elemenata. n Ako koristite dobar algoritam sortiranja, cijeli algoritam za provjeru jedinstvenosti elemenata niza također će imati učinkovitost O (n log n) © T. A. Pavlovskaya (SPb NRU ITMO) 51