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

  1. -os csoportok
  2. Minden csoportban vesszuk a kozepso elemet -t.
    A fenti megteheto osszehasonlitassal, mert egy -os csoportban meg lehet talalni a kozepsot osszehasonlitassal.
  3. 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.

  1. Bruteforce
FOR i = 1 .. n-m+1
	IF s[i : i+m-1] = p[1 : m] THEN return(i)
  1. (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])
  1. 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]