Medians kereses
Meg szeretnenk talalni a kozepso elemet egy tombnak. Nyilvan, rendezes utan konnyu megadni a kozepso elemet, de lehet-e gyorsabban mint idoben megadni a medians-t?
source: Median of medians
Alapelv:
- Keressuk meg a -adik elemet, azaz azt az elemet aminel darab kisebb elem van.
- Felteszzuk, hogy az elemek kulonbozoek.
- Keressunk elemet, aki nagyjabol kozepen van.
Ket tombbe rendezzuk az adatokat, egy es egy tombbe, ahol es ez megoldhato osszehasonlitassal.
- Ha akkor keszen vagyunk es a megoldas.
- Ha akkor rekurzivan -ben keressuk a -adik elemet.
- Ha akor rekurzivan -ben keressuk a -edik elemet.
keresese
- -os csoportok
- Minden csoportban vesszuk a kozepso elemet -t.
A fenti megteheto osszehasonlitassal, mert egy -os csoportban meg lehet talalni a kozepsot osszehasonlitassal. - Rekurzivan a -k kozul legyen a kozepso.
Mostmar meg van nekunk az ami egy nagyjabol kozepen levo elemt es ezzel mar fel tudjuk bontani es reszekre az adatokat.
Allitas: Legfeljebb elem lesz kisebb mint es nagyobb mint .
Biz.: Elkepzeljuk, hogy az otos csoportok egymas ala vannak irva, minden csoport balrol jobbra no, a csoportok ugy rakjuk hogy az elso elem lefelo no.
[
[a0 < a1 < a2 < a3 < a4],
[b0 < b1 < b2 < b3 < b4],
[c0 < c1 < c2 < c3 < c4],
]
a0 < b0 < c0
A bal also sarok kisebb mint es jobb also sarok nagyobb mint .
Allitas: Legfeljebb osszehasonlitast kell tennunk.
Biz.:
(hf)
Gyorsrendezes (quicksort)
source: quicksort
QuickSort(A[p : r]):
IF p < r THEN
q := Partition(A[p : r])
QuickSort(A[p : q-1])
QuickSort(A[q + 1 : r])
Partition(A[p : r]):
i := RND(low=p, high=r)
pivot := A[i]
SWAP(A[i], A[r]) // a vegere rakjuk a pivot-ot
i := p // tarolohely index
FOR j = p .. r
IF A[j] <= pivot THEN
SWAP(A[i], A[j]) // berakjuk balra a tarolohelyre a kisebb elemet
i++ // a kovetkezo elemet egyel arrabb kell majd rakni
A Partition
fuggveny particionalja a tombnek a [p : r]
slice-jat ugy, hogy az pivot
-nal kisebb elemek balra vannak az pivot
-al megegyezok kozepen es az pivot
-nal nagyobbak jobbra vannk.
Allitas: A -edik ciklus vegen
Tetel: Az osszehasonlitasoknak a varhato erteke
Biz: Vezessuk be a kovetkezo ketto seged fuggvenyt:
- az osszehasonlitasoknak a varhato erteke hosszu resztombon
- az osszehasonlitasoknak a varhato erteke, felteve, hogy elsore a -edik legkisebb elemet valasztottuk.
A fenti ket megfigyelesbol kovetkezik, hogy
legyen
Def.: ha
A fentibol kovetkezik, hogy
itt felhasznaltuk, hogy
Mintakereses
- van egy veges ABC-enk melyre
- van egy mintank
- van egy szovegunk
Van az szoveg amiben csinalunk egy hosszu ablakot es megnezzuk, hogy az ablak megegyezik-e a mintaval.
- Bruteforce
FOR i = 1 .. n-m+1
IF s[i : i+m-1] = p[1 : m] THEN return(i)
- (Horspool) Quicksearch
Elofeldolgozas:
FOR b in Sigma
E[b] := m
FOR j = 1 .. m-1
E[p[j]] := m-j
j := m
WHILE j <= n
IF s[j] = p[m] THEN
IF s[j-m+1 : j] = p[1 : m] THEN return(j-m+1)
j := j + E(s[j])
- KMP (Knuth-Morris-Pratt)
Def.: Az az labfeje, ha min amire ugy, hogy
Tehat tudok az elejere irni betut es megkapom az -et vagy tudok a vegere irni betut es visszakapom az -et.
source: KMP
Elofeldolgozas:
a szo labfejenek a hossza
KMP(p, s, pi)
i := 1
j := 0
WHILE i + j <= n
IF j = m THEN
print(i) // found a match
i := i + j - pi[j]
j := pi[j]
ELSE IF s[i+j] = p[j+1] THEN j := j + 1
ELSE IF j = 0 THEN i := i + 1
ELSE
i := i + j - pi[j]
j := pi[j]