minor changes

This commit is contained in:
Kristofers Solo 2025-06-15 00:53:00 +03:00
parent 1681f7fe8e
commit 18dd44645a
Signed by: kristoferssolo
GPG Key ID: 8687F2D3EEE6F0ED
2 changed files with 110 additions and 115 deletions

View File

@ -55,6 +55,8 @@
// Headings // Headings
set heading(numbering: "1.1.") set heading(numbering: "1.1.")
set footnote(numbering: "*")
// Start page numbering // Start page numbering
set page(numbering: "1", number-align: center) set page(numbering: "1", number-align: center)

223
main.typ
View File

@ -5,10 +5,12 @@
#import "layout.typ": indent-par, project #import "layout.typ": indent-par, project
#show: project.with(title: [Theory of Algorithms Cheatsheet], authors: ( #show: project.with(title: [Theory of Algorithms Cheatsheet], authors: (
"Kristofers Solo", "jorenchik" "Kristofers Solo",
"jorenchik",
)) ))
#let teo(title: "Teorēma", ..args) = memo(title: title, ..args) #let teo(title: "Teorēma", ..args) = memo(title: title, ..args)
#let uzd(title: "Uzdevums", ..args) = question(title: title, ..args)
#let TM = $"TM"$ #let TM = $"TM"$
#let qrej = $q_"rej"$ #let qrej = $q_"rej"$
@ -16,10 +18,10 @@
#let halt = $"HALTING"$ #let halt = $"HALTING"$
#let halt2 = $"HALTING"_2$ #let halt2 = $"HALTING"_2$
#let NP = $"NP"$ #let NP = $"NP"$
#let hline = $\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_$ #let hline = line(length: 50%, stroke: 0.5pt)
= Tjūringa Mašīnas = Tjūringa Mašīnas
== Variācijas == Variācijas
Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu. Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu.
#info(title: "Čērča-Tjūringa tēze")[ #info(title: "Čērča-Tjūringa tēze")[
@ -29,17 +31,16 @@ Var būt 3 veida uzdevumi: stāvokļu, tekstuāls, vairāklenšu.
šim nav atrasts pretpiemērs. šim nav atrasts pretpiemērs.
] ]
=== Viena lente<one_tape> === Viena lente <one_tape>
$(q, a) -> (q', a', d)$ -- stāvoklī $q$ redzot $a$, ieraksta $a'$ $(q, a) -> (q', a', d)$ -- stāvoklī $q$ redzot $a$, ieraksta $a'$
un iet virzienā $d space (<- "vai" ->)$. un iet virzienā $d space (<- "vai" ->)$.
=== Divas (vai vairākas fiksētas) lentes === Divas (vai vairākas fiksētas) lentes
$(q, a_1, a_2) -> (q', b_1, b_2, d_1, d_2)$ -- $a_1$, $b_1$, $d_1$ pirmai $(q, a_1, a_2) -> (q', b_1, b_2, d_1, d_2)$ -- $a_1$, $b_1$, $d_1$ pirmai
lentei un $a_2$, $b_2$, $d_2$ otrai lentei. Svarīga atšķirība ir ka lentei un $a_2$, $b_2$, $d_2$ otrai lentei.
vairlāklenšu TM papildus $<-$ un $->$ virzieniem ir $arrow.b$ (stāvēšana uz Svarīga atšķirība ir ka vairlāklenšu #TM papildus $<-$ un $->$ virzieniem ir
vietas). $arrow.b$ (stāvēšana uz vietas). #footnote[Derīgs ar uzdevumiem, kur palīdz
kopēšana/salīdzināšana.]
\* Derīgs ar uzdevumiem, kur palīdz kopēšana/salīdzināšana.
=== Stāvēšana uz vietas === Stāvēšana uz vietas
Nosimulēt stāvēšanu uz vietas jeb $d=0$ var šādi: Nosimulēt stāvēšanu uz vietas jeb $d=0$ var šādi:
@ -49,14 +50,14 @@ Nosimulēt stāvēšanu uz vietas jeb $d=0$ var šādi:
=== Modelis, ko pamatā izmanto šajā kursā! === Modelis, ko pamatā izmanto šajā kursā!
Šajā kursā fokusējas uz TM, kas ir: Šajā kursā fokusējas uz TM, kas ir:
+ Vienas lentes (skat. @one_tape); + Vienas lentes (skat. @one_tape);
+ Bezgalīga vienā virzienā -- pa labi; + Bezgalīga vienā virzienā -- pa labi;
+ Pirmais simbols ir tukšais simbols (`_`); + Pirmais simbols ir tukšais simbols (`_`);
+ Pēc pirmā simbola ir ievade; + Pēc pirmā simbola ir ievade;
+ Pēc ievades ir bezgalīgs tukšu simbolu skaits; + Pēc ievades ir bezgalīgs tukšu simbolu skaits;
+ Sāk uz pirmā ievades simbola (viens pēc pirmā tukšuma). + Sāk uz pirmā ievades simbola (viens pēc pirmā tukšuma).
== Risinājuma shēma == Risinājuma shēma
+ Izdomāt, kā aizstājot simbolus ar $*$ var pārbaudīt virknes derību. + Izdomāt, kā aizstājot simbolus ar $*$ var pārbaudīt virknes derību.
+ Atcerēties par secību -- aiz $a$ var sekot tikai $b slash c$, aiz $b$ var sekot tikai $c$, utt. + Atcerēties par secību -- aiz $a$ var sekot tikai $b slash c$, aiz $b$ var sekot tikai $c$, utt.
+ Doties katrā no virzieniem var doties arī līdz galam jeb tukšumam $\_$. + Doties katrā no virzieniem var doties arī līdz galam jeb tukšumam $\_$.
@ -125,14 +126,14 @@ Vai ieejas virkne $x \# x$, kur $x in {0,1}^*$
] ]
= Sanumurējamība = Sanumurējamība
== Definīcija == Definīcija
- Bezgalīgas kopas $A$, $B$ ir vienāda izmēra, ja ir bijekcija ($1:1$ attiecība) - Bezgalīgas kopas $A$, $B$ ir vienāda izmēra, ja ir bijekcija ($1:1$ attiecība)
$F: A->B$. $F: A->B$.
- $A$ ir sanumurējama ar atkārtojumiem, ja ir attēlojums $F:N->A$, kas par katru - $A$ ir sanumurējama ar atkārtojumiem, ja ir attēlojums $F:N->A$, kas par katru
$a in A$ attēlo vismaz vienu $x in NN$. $a in A$ attēlo vismaz vienu $x in NN$.
#teo[$A$ ir sanumurējama ar atkārtojumiem tad un tikai tad, ja $A$ ir sanumurējama.] #teo[$A$ ir sanumurējama ar atkārtojumiem tad un tikai tad, ja $A$ ir sanumurējama.]
== Sanumerātības pierādījums == Sanumerātības pierādījums
- Kopa ir sanumurējama, ja tajā eksistē bijekcija starp kopas elementiem un - Kopa ir sanumurējama, ja tajā eksistē bijekcija starp kopas elementiem un
naturāliem skaitļiem. Citos vārdos sakot, katram kopas elementam var piešķirt naturāliem skaitļiem. Citos vārdos sakot, katram kopas elementam var piešķirt
unikālu naturālu skaitli. unikālu naturālu skaitli.
@ -219,8 +220,8 @@ Surjekcija: katram $z in ZZ$ eksistē $n in NN$, ka $F(n) = z$.
== Definīcija == Definīcija
- $A <= B$, ja ir ar Tjūringa mašīnu izrēķināms pārveidojums - $A <= B$, ja ir ar Tjūringa mašīnu izrēķināms pārveidojums
- $R$: (ieejas dati $A$) -> (ieejas dati $B$), - $R$: (ieejas dati $A$) $->$ (ieejas dati $B$),
- $B(R(x)) = A(x)$. - $B(R(x)) = A(x)$.
Ja $A <= B$ -- ja var atrisināt $B$, tad var atrisināt $A$. $A$ ir reducējuma Ja $A <= B$ -- ja var atrisināt $B$, tad var atrisināt $A$. $A$ ir reducējuma
@ -233,7 +234,7 @@ Ja $A <= B and A >= B$, tad $A$ un $B$ ir ekvivalentas.
// Jorens: Originally šeit bija sajaukta secība, bet uzdevums ir kinda valīds // Jorens: Originally šeit bija sajaukta secība, bet uzdevums ir kinda valīds
// abās pusēs, kopumā risinājums ir nedaudz problemātisks. // abās pusēs, kopumā risinājums ir nedaudz problemātisks.
#quote[ #uzd[
Dota problēma $halt2(M, x, y) = 1$, kur Tjūringa mašīna $M$ apstājas vismaz uz Dota problēma $halt2(M, x, y) = 1$, kur Tjūringa mašīna $M$ apstājas vismaz uz
vienas no ievadēm $x$ vai $y$. Pierādīt, ka to var vai nevar reducēt uz vienas no ievadēm $x$ vai $y$. Pierādīt, ka to var vai nevar reducēt uz
$halt$, tas ir parādīt $(halt 2 <= halt)$. $halt$, tas ir parādīt $(halt 2 <= halt)$.
@ -276,7 +277,7 @@ Redukcijas analīze:
Tādējādi #halt2 tiek reducēta uz #halt. Tādējādi #halt2 tiek reducēta uz #halt.
= Neatrisināmas (non-decidable) problēmas = Neatrisināmas (non-decidable) problēmas
#let acc = $"ACCEPTING"$ #let acc = $"ACCEPTING"$
#let eqans = $"EQUAL-ANSWERS"$ #let eqans = $"EQUAL-ANSWERS"$
@ -323,7 +324,7 @@ par mašīnu, par tās struktūru etc.
Teorēma "pasaka" mums priekšā, ka jebkuru netriviālu *funkcionālu* īpašību Teorēma "pasaka" mums priekšā, ka jebkuru netriviālu *funkcionālu* īpašību
nevar atrisināt. nevar atrisināt.
== Uzskaitījums == Uzskaitījums
- $halt(M\# x)=1$, ja $M$ apstājas, ja ieejas virkne $=x$. - $halt(M\# x)=1$, ja $M$ apstājas, ja ieejas virkne $=x$.
- $acc(M\# x)=1$, ja $M$ uz ieejas virknes izdod atbildi $1$. - $acc(M\# x)=1$, ja $M$ uz ieejas virknes izdod atbildi $1$.
- $eqans(M\# x \# y)=1$, ja $M$ uz ieejas virknēm $x$ un $y$ izdod vienādas atbildes. - $eqans(M\# x \# y)=1$, ja $M$ uz ieejas virknēm $x$ un $y$ izdod vienādas atbildes.
@ -331,10 +332,10 @@ nevar atrisināt.
- $infinite(M)=1$, ja eksistē bezgalīgi daudzas ieejas virknes $x$, uz kurām $M$ izdod atbildi $1$. - $infinite(M)=1$, ja eksistē bezgalīgi daudzas ieejas virknes $x$, uz kurām $M$ izdod atbildi $1$.
- $equiv(M 1, M 2)=1$, ja $M1(x)=M2(x)$ - $equiv(M 1, M 2)=1$, ja $M1(x)=M2(x)$
- $"PCP"(S_1, S_2)=1$ (Post-correspondance problem), ja divām galībām kopām $A = [a_1, - $"PCP"(S_1, S_2)=1$ (Post-correspondance problem), ja divām galībām kopām $A = [a_1,
a_2, ..., a_n]$ un $B = [b_1, b_2, dots, b_n]$ var izvēlēties indeksu secības a_2, ..., a_n]$ un $B = [b_1, b_2, dots, b_n]$ var izvēlēties indeksu secības
$a_("i1") a_("i2") ... a_("ik")$ = $b_("i1") b_("i2") ... b_("ik")$ (tā lai $a_("i1") a_("i2") ... a_("ik")$ = $b_("i1") b_("i2") ... b_("ik")$ (tā lai
konkatenācijas būtu vienādas); domino kauliņi ar augšu un apakšu, ko saliekot konkatenācijas būtu vienādas); domino kauliņi ar augšu un apakšu, ko saliekot
kopā, globālai augšai un apakšai jāsakrīt. kopā, globālai augšai un apakšai jāsakrīt.
- $"MORTAL-MATRIX"(S)=1$, vai no matricām $M_1, M_2, ..., M_n$ var izveidot - $"MORTAL-MATRIX"(S)=1$, vai no matricām $M_1, M_2, ..., M_n$ var izveidot
secību (ar atkārtojumiem), ka matricu reizinājums būtu 0. secību (ar atkārtojumiem), ka matricu reizinājums būtu 0.
// LININEQ, HAMCYCLE are DECIDABLE! // LININEQ, HAMCYCLE are DECIDABLE!
@ -369,7 +370,7 @@ nevar atrisināt.
#context [ #context [
#set par(justify: false) #set par(justify: false)
== Piemēri (prob. ir neatr) == Piemēri (prob. ir neatr)
=== #halt <= #acc === $halt <= acc$
- #underline("Teorēma"): Ja var atrisināt #acc, tad var atrisināt arī #halt - #underline("Teorēma"): Ja var atrisināt #acc, tad var atrisināt arī #halt
- #underline("Pierādījums"): Attēlojums $R:M->M'$ ar īpašību $halt(M\#x) = acc(M'\#x)$. - #underline("Pierādījums"): Attēlojums $R:M->M'$ ar īpašību $halt(M\#x) = acc(M'\#x)$.
- Tad $halt(M\#x)$ var atrisināt sekojoši: - Tad $halt(M\#x)$ var atrisināt sekojoši:
@ -378,7 +379,7 @@ nevar atrisināt.
- Ja $M$ akceptē/noraida, tad $M'$ akceptē (izdos $1$). - Ja $M$ akceptē/noraida, tad $M'$ akceptē (izdos $1$).
- Ja $M$ neapstājas, $M'$ arī neapstājas. - Ja $M$ neapstājas, $M'$ arī neapstājas.
=== #acc <= #eqans === $acc <= eqans$
- #underline("Zinām"): #acc nav atrisināma - #underline("Zinām"): #acc nav atrisināma
- #underline("Pierādām"): Ja var atrisināt #eqans, tad var atrisināt arī #acc. - #underline("Pierādām"): Ja var atrisināt #eqans, tad var atrisināt arī #acc.
- #underline("Secinām"): #eqans nevar atrisināt. - #underline("Secinām"): #eqans nevar atrisināt.
@ -389,21 +390,21 @@ nevar atrisināt.
- $M'(quote.angle.l.double s quote.angle.r.double)=1$, $M'(x)=M(x)$, ja $x$ nesatur $s$. - $M'(quote.angle.l.double s quote.angle.r.double)=1$, $M'(x)=M(x)$, ja $x$ nesatur $s$.
- $eqans(M'\# x \# quote.angle.l.double s quote.angle.r.double)=acc(M\#x)$. - $eqans(M'\# x \# quote.angle.l.double s quote.angle.r.double)=acc(M\#x)$.
=== #acc <= #one === $acc <= one$
- #underline("Pierādām"): Ja var atrisināt #one, tad var atrisināt arī #acc. - #underline("Pierādām"): Ja var atrisināt #one, tad var atrisināt arī #acc.
- Dots: $M, x$ - Dots: $M, x$
- Jādefinē: $M': one(M') = acc(M\# x)$. - Jādefinē: $M': one(M') = acc(M\# x)$.
- $M'$: nodzēš no lentes ieejas virkni $y$, uzraksta $x$, palaiž $M$ programmu. - $M'$: nodzēš no lentes ieejas virkni $y$, uzraksta $x$, palaiž $M$ programmu.
- Jebkurai $y, M'(y)=M(x)$. - Jebkurai $y, M'(y)=M(x)$.
=== #acc <= #infinite === $acc <= infinite$
- #underline("Pierādām"): Ja var atrisināt #infinite, tad var atrisināt arī #acc. - #underline("Pierādām"): Ja var atrisināt #infinite, tad var atrisināt arī #acc.
- Dots: $M, x$ - Dots: $M, x$
- Jādefinē: $M': infinite(M') = acc(M\# x)$. - Jādefinē: $M': infinite(M') = acc(M\# x)$.
- Jebkurai $y, M'(y)=M(x)$. - Jebkurai $y, M'(y)=M(x)$.
- Ja $M(x)=1$, tad $M'(y)=1$ jebkurai $y$. - Ja $M(x)=1$, tad $M'(y)=1$ jebkurai $y$.
=== #acc <= #equiv === $acc <= equiv$
- #underline("Pierādām"): Ja var atrisināt #equiv, tad var atrisināt arī #acc. - #underline("Pierādām"): Ja var atrisināt #equiv, tad var atrisināt arī #acc.
- Dots: $M, x$ - Dots: $M, x$
- Jādefinē: $M_1, M_2: equiv(M_1, M_2) = acc(M\# x)$. - Jādefinē: $M_1, M_2: equiv(M_1, M_2) = acc(M\# x)$.
@ -488,7 +489,7 @@ ka $L in NP$ un ka $SAT <_p L$ (vai jebkura cita zināma NP-pilna problēma).
Tas, ka problēma ir daļēji atrisināma, nozīmē, ka nav konkrēta un *vispārīga* Tas, ka problēma ir daļēji atrisināma, nozīmē, ka nav konkrēta un *vispārīga*
algoritma, kas vienmēr varētu sniegt pareizu "nē" atbildi gadījumiem ārpus algoritma, kas vienmēr varētu sniegt pareizu "nē" atbildi gadījumiem ārpus
problēmas. problēmas.
Var būt iespējams konstruēt Tjūringa mašīnu, kas apstājas un sniedz Var būt iespējams konstruēt Tjūringa mašīnu, kas apstājas un sniedz
"nē" atbildi noteiktiem gadījumiem ārpus problēmas, bet tas nav garantēts "nē" atbildi noteiktiem gadījumiem ārpus problēmas, bet tas nav garantēts
@ -507,7 +508,7 @@ Problēma $A$, kurai neviena no $A$, $overline(A)$ nav daļēji atrisināma?
- $overline("EQUIV")(M_1, M_2) = 1$, ja $exists x: M_1(x) != M_2(x)$. - $overline("EQUIV")(M_1, M_2) = 1$, ja $exists x: M_1(x) != M_2(x)$.
= Nekustīgo punktu teorija = Nekustīgo punktu teorija
== Nekustīgā punkta teorēma == Nekustīgā punkta teorēma
@ -539,10 +540,10 @@ $F(x)$ ir vienmēr izskaitļojama, jo ja mums ir pieejama $x$ programmas
apraksts, ir iespējams uzbūvēt programmu, kas salīdzina ar brīvi izvēlamu apraksts, ir iespējams uzbūvēt programmu, kas salīdzina ar brīvi izvēlamu
ievadi $y$. ievadi $y$.
Pēc nekustīgā punkta teorēmas eksistē $x$, ka Pēc nekustīgā punkta teorēmas eksistē $x$, ka
$ $
phi_(F(x)) = phi_x. phi_(F(x)) = phi_x.
$ $
+ Tātad eksistē tāds $x$, ka $x$ ir funkcionāli ekvivalenta $F(x)$. + Tātad eksistē tāds $x$, ka $x$ ir funkcionāli ekvivalenta $F(x)$.
@ -570,21 +571,21 @@ $g(n)$.
/* /*
=== Piemērs === Piemērs
$f(n) = 17n^2 + 23n + 4$ $f(n) = 17n^2 + 23n + 4$
$g(n) = n^2$ $g(n) = n^2$
Tad $f(n) in O(n^2)$, jo: Tad $f(n) in O(n^2)$, jo:
$17n^2 + 23n + 4 \leq 17n^2 + 23n^2 + 4n^2 = 44n^2$ $17n^2 + 23n + 4 \leq 17n^2 + 23n^2 + 4n^2 = 44n^2$
tātad $C = 44$. tātad $C = 44$.
*/ */
=== Mazais-o (formālā definīcija) === Mazais-$o$ (formālā definīcija)
$f(n) in o(g(n))$, ja: $f(n) in o(g(n))$, ja:
$ $
lim_(i -> infinity) f(n) / g(n) = 0 lim_(i -> infinity) f(n) / g(n) = 0
$ $
Tas nozīmē, ka funkcija $f(n)$ kļūst nenozīmīga attiecībā pret $g(n)$, $n$ Tas nozīmē, ka funkcija $f(n)$ kļūst nenozīmīga attiecībā pret $g(n)$, $n$
@ -593,18 +594,18 @@ tiecoties uz bezgalību.
/* /*
=== Piemērs === Piemērs
$log(n) \in o(n)$ $log(n) \in o(n)$
jo jebkuram $epsilon > 0$ pietiekami lieliem $n$: jo jebkuram $epsilon > 0$ pietiekami lieliem $n$:
$log(n) <= epsilon * n$. $log(n) <= epsilon * n$.
*/ */
=== $f(n) in O(g(n))$ pamatojuma triks === $f(n) in O(g(n))$ pamatojuma triks
Ja ir pierādījums, ka $f(n) in o(g(n))$, tad automātiski var secināt, ka $f(n) Ja ir pierādījums, ka $f(n) in o(g(n))$, tad automātiski var secināt, ka $f(n)
in O(g(n))$. *Tikai pozitīvajā gadījumā!* Jo mazais $o$ ir stingrāka prasība in O(g(n))$. *Tikai pozitīvajā gadījumā!* Jo mazais $o$ ir stingrāka prasība
par lielo $O$. par lielo $O$.
=== Pamatojuma soļi === Pamatojuma soļi
- Ja funkcija pielīdzināta lielajam $O$: - Ja funkcija pielīdzināta lielajam $O$:
+ Salīdzina funkcijas augstāko pakāpi ar doto $O$ pakāpi. + Salīdzina funkcijas augstāko pakāpi ar doto $O$ pakāpi.
@ -616,30 +617,30 @@ par lielo $O$.
+ Jāievieto dotais robežā $lim_(x->oo)f(x)/g(x)$; + Jāievieto dotais robežā $lim_(x->oo)f(x)/g(x)$;
+ Rezultāts ir 0, patiess, citādi -- nepatiess. + Rezultāts ir 0, patiess, citādi -- nepatiess.
=== Piemērs (lielais-O) === Piemērs (lielais-$O$)
$ 2n^4 + 6n^2 + 17 =^? O(n^4) $ $ 2n^4 + 6n^2 + 17 =^? O(n^4) $
Izteiksme ir patiesa, tā kā kreisās puses izteiksmes augstākā pakāpe jeb kārta Izteiksme ir patiesa, tā kā kreisās puses izteiksmes augstākā pakāpe jeb kārta
ir $4$ un iekš $O$ tā arī ir $4$. ir $4$ un iekš $O$ tā arī ir $4$.
=== Piemērs (lielais-O) === Piemērs (lielais-$O$)
$ 2n^4 + 6n^2 + 17 =^? O(n^3) $ $ 2n^4 + 6n^2 + 17 =^? O(n^3) $
Izteiksme ir aplama, jo kreisajā pusē augstākā pakāpe ir $4$, kamēr labajā ir Izteiksme ir aplama, jo kreisajā pusē augstākā pakāpe ir $4$, kamēr labajā ir
norādīta $3$, un $4$ pakāpes izteiksmi nevar izpildīt $O(n^3)$. norādīta $3$, un $4$ pakāpes izteiksmi nevar izpildīt $O(n^3)$.
=== Piemērs (lielais-O) === Piemērs (lielais-$O$)
$ n^3 + 17n + 4 in^? O(n^3) $ $ n^3 + 17n + 4 in^? O(n^3) $
Jā, $n^3 + 17n + 4 <= n^3 + 17n^3 + 4n^3 = 22n^3$. Jā, $n^3 + 17n + 4 <= n^3 + 17n^3 + 4n^3 = 22n^3$.
=== Piemērs (lielais-O) === Piemērs (lielais-$O$)
$ n^4 + 17n + 4 in^? O(n^3) $ $ n^4 + 17n + 4 in^? O(n^3) $
Nē $n^4 + 17n + 4 > n^4 = n dot n^3$ Nē $n^4 + 17n + 4 > n^4 = n dot n^3$
=== Piemērs (mazais-O) <small-o-example-3> === Piemērs (mazais-$o$) <small-o-example-3>
$ n log^4 n =^? o(n^1.5) $ $ n log^4 n =^? o(n^1.5) $
Ir zināms, ka mazajā $O$ notācijai, ja $lim_(x->oo)f(x)/g(x)$, kur $f(x)$ ir Ir zināms, ka mazajā $O$ notācijai, ja $lim_(x->oo)f(x)/g(x)$, kur $f(x)$ ir
@ -648,7 +649,7 @@ Ievietojot vērtības $ lim_(n->oo) (n log^4 n)/n^1.5=0 $
Tātad vienādojums ir Tātad vienādojums ir
patiess. patiess.
=== Piemērs (mazais-O) === Piemērs (mazais-$o$)
$ 2^n n^2 =^? o(n^3) $ $ 2^n n^2 =^? o(n^3) $
Pēc tās pašas aprakstītās īpašības, kā @small-o-example-3, sanāktu Pēc tās pašas aprakstītās īpašības, kā @small-o-example-3, sanāktu
@ -697,7 +698,7 @@ risina $L$ un izmanto $O(f(n))$ soļus.
Īstām programmām rindiņas var izpildīties atšķirīgā laikā -- tas ir atkarīgs Īstām programmām rindiņas var izpildīties atšķirīgā laikā -- tas ir atkarīgs
apakšprogrammu izsaukumi, procesora operācijām. Taču šajā tas tiek abstrahēts un apakšprogrammu izsaukumi, procesora operācijām. Taču šajā tas tiek abstrahēts un
katra koda rindiņa tiek uzskatīta par vienu soli. katra koda rindiņa tiek uzskatīta par vienu soli.
Lai atrastu koda izpildes laiku: Lai atrastu koda izpildes laiku:
+ Novērtē katras rindiņas "globālo laiku" -- cik tā izpildās ņemot vērā visus + Novērtē katras rindiņas "globālo laiku" -- cik tā izpildās ņemot vērā visus
@ -705,9 +706,9 @@ Lai atrastu koda izpildes laiku:
+ Novērtē kādos gadījumos tā izpildās, ja vispār izpildās. + Novērtē kādos gadījumos tā izpildās, ja vispār izpildās.
+ Izvērtē to kāds gadījums (ievade) būtu vissliktākā un aprēķina tam funkciju + Izvērtē to kāds gadījums (ievade) būtu vissliktākā un aprēķina tam funkciju
no $n$ (skat. @time_analysis_expressions). no $n$ (skat. @time_analysis_expressions).
+ Novērtē šīs funkcijas klasi izmantojot lielā-O notāciju. + Novērtē šīs funkcijas klasi izmantojot lielā-O notāciju.
===== Piemērs ($|a| = |b|"?"$) ===== Piemērs ($|a| =^? |b|$)
Vai ieejas virknē ir vienāds skaits $a$ un $b$? Vai ieejas virknē ir vienāds skaits $a$ un $b$?
+ Virzās no kreisās puses uz labo, aizstājot vienu $a$ un vienu $b$ ar $x$; + Virzās no kreisās puses uz labo, aizstājot vienu $a$ un vienu $b$ ar $x$;
@ -724,48 +725,45 @@ Kopējais soļu skaits:
==== SPACE Definīcija (Precīzs modelis) ==== SPACE Definīcija (Precīzs modelis)
- Ieejas lente - $x_1 ,..., x_n$, var tikai lasīt. - Ieejas lente - $x_1 ,..., x_n$, var tikai lasīt.
- Darba lente sākumā tukša, var arī rakstīt. - Darba lente sākumā tukša, var arī rakstīt.
- $S(x_1, ..., x_N)$ šūnu skaits, kas tiek apmeklētas uz darba lentes. - $S(x_1, ..., x_N)$ šūnu skaits, kas tiek apmeklētas uz darba lentes.
- $S(N) = max S(x_1, ..., x_N)$. - $S(N) = max S(x_1, ..., x_N)$.
$ $
"SPACE"(f(N)) = \ "SPACE"(f(N)) = \
= {L | L "var atrisināt ar Tjūringa" \ = {L | L "var atrisināt ar Tjūringa" \
"mašīnu, kurai" S(N) <= C f(N)}. \ "mašīnu, kurai" S(N) <= C f(N)}. \
$ $
==== NSPACE Definīcija ==== NSPACE Definīcija
$ $
"NSPACE"(f(N)) = \ "NSPACE"(f(N)) = \
= {L | L "ir determinēta" M, "visiem" x, L(x)=M(x), \ = {L | L "ir determinēta" M, "visiem" x, L(x)=M(x), \
"un" M "izmanto " <= c f(N) "šūnas uz darba lentes"}. \ "un" M "izmanto " <= c f(N) "šūnas uz darba lentes"}. \
$ $
#teo( #teo(title: "Savča teorēma", [$"NSPACE"(f(N)) subset.eq "SPACE" (f^2(N))$])
title: "Savča teorēma",
[$"NSPACE"(f(N)) subset.eq "SPACE" (f^2(N))$]
)
==== LOGSPACE Definīcija ==== LOGSPACE Definīcija
$ $
"LOGSPACE" = "SPACE" (log N). "LOGSPACE" = "SPACE" (log N).
$ $
$ $
"LOGSPACE" subset.eq U_c "TIME"(c^(log N)) = \ "LOGSPACE" subset.eq U_c "TIME"(c^(log N)) = \
U_c "TIME" (N^c) = P U_c "TIME" (N^c) = P
$ $
=== Laika-Telpas sakarības === Laika-Telpas sakarības
#teo[ #teo[
Ja $f(n) >= log N$, tad Ja $f(n) >= log N$, tad
$ $
"TIME"(f(N)) subset.eq "SPACE"(f(N)) subset.eq \ "TIME"(f(N)) subset.eq "SPACE"(f(N)) subset.eq \
subset.eq U_c "TIME" (c^(f(N))) subset.eq U_c "TIME" (c^(f(N)))
$ $
] ]
@ -775,10 +773,10 @@ Laiks $O(f(N)) ->$ atmiņa $O(f(N))$.
Sekojošas funkcijas pieaugums pie $x -> infinity$: Sekojošas funkcijas pieaugums pie $x -> infinity$:
$log(x) << x << x \cdot log(x) << x^k << a^x << x! << x^x$ $log(x) << x << x dot log(x) << x^k << a^x << x! << x^x$
- $x$: mainīgais (parasti $n$). - $x$: mainīgais (parasti $n$).
- $k$: jebkurš vesles pozitīvs skaitlis ($k in NN$). - $k$: jebkurš vesels pozitīvs skaitlis ($k in NN$).
- $a$: reāla konstante lielāka par $1$ ($a > 1$). - $a$: reāla konstante lielāka par $1$ ($a > 1$).
Šo hierarhiju var izmantot intuīcijai par to vai funkcija pieder klasei Šo hierarhiju var izmantot intuīcijai par to vai funkcija pieder klasei
@ -790,22 +788,20 @@ _Source; Mathematics for Computer Science, 2018, Eric Lehman, Google Inc._
= Klase P (TODO) = Klase P (TODO)
.
= Klase NP = Klase NP
== NP problēmas == NP problēmas
NP (nederminēti-polinomiālas) problēmas #NP (nederminēti-polinomiālas) problēmas
ir problēmas (2 ekvivalentas definīcijas): ir problēmas (2 ekvivalentas definīcijas):
+ $L in NP$, ja eksistē pārbaudes algoritms - $O(n^c)$ laika Tjūringa mašīna $M$: + $L in NP$, ja eksistē pārbaudes algoritms - $O(n^c)$ laika Tjūringa mašīna $M$:
+ Ja $L(x) = 1$, tad eksistē y: $M(x, y) = 1$. + Ja $L(x) = 1$, tad eksistē y: $M(x, y) = 1$.
+ Ja $L(x) = 0$, tad visiem y: $M(x, y) = 0$. + Ja $L(x) = 0$, tad visiem y: $M(x, y) = 0$.
+ NP = problēmas $L$, ko var atrisināt ar nedeterminētu mašīnu $O(n^c)$ laikā. + #NP = problēmas $L$, ko var atrisināt ar nedeterminētu mašīnu $O(n^c)$ laikā.
Ekvivalence ir pierādīta ar abpusēju pārveidojumu no pārbaudītāja uz nedet. TM Ekvivalence ir pierādīta ar abpusēju pārveidojumu no pārbaudītāja uz nedet.
un atpakaļ. #TM un atpakaļ.
== NP-pilnas probēmas un to redukcijas == NP-pilnas probēmas un to redukcijas
@ -822,12 +818,12 @@ un atpakaļ.
- $A in "NP"$; - $A in "NP"$;
- Ja $B in NP$, tad $B <=_("poly") A$. - Ja $B in NP$, tad $B <=_("poly") A$.
=== 3-SAT problēma === 3-SAT problēma
Vai formulai 3-CNF formā var piemeklēt katra mainīgā vērtības tā, lai formula Vai formulai 3-CNF formā var piemeklēt katra mainīgā vērtības tā, lai formula
būtu 1 (patiess). būtu 1 (patiess).
=== CIRCUIT-SAT problēma === CIRCUIT-SAT problēma
Dota funkcija $F(x_1, ..., x_n)$, kas sastāv no vārtiem (AND, OR, NOT). Dota funkcija $F(x_1, ..., x_n)$, kas sastāv no vārtiem (AND, OR, NOT).
@ -867,35 +863,36 @@ Piemērs AND vārtiem. Nosaucam ievades kā x, y un izvadi kā z: $z = x and y$
#table( #table(
columns: 4, columns: 4,
[*$x$*],[*$y$*],[*$z$*],[*$z = x and z$?*], [*$x$*], [*$y$*], [*$z$*], [*$z = x and z$?*],
[$0$],[$0$],[$0$],[jā], $0$, $0$, $0$, [jā],
[$0$],[$0$],[$1$],[nē], $0$, $0$, $1$, [nē],
[$0$],[$1$],[$0$],[jā], $0$, $1$, $0$, [jā],
[$0$],[$1$],[$1$],[nē], $0$, $1$, $1$, [nē],
[$1$],[$0$],[$0$],[jā], $1$, $0$, $0$, [jā],
[$1$],[$0$],[$1$],[nē], $1$, $0$, $1$, [nē],
[$1$],[$1$],[$0$],[nē], $1$, $1$, $0$, [nē],
[$1$],[$1$],[$1$],[jā], $1$, $1$, $1$, [jā],
) )
Izveidojam pretrunas katrai rindai. Tas ir, konjunkciju katrai rindai ar "nē". Izveidojam pretrunas katrai rindai. Tas ir, konjunkciju katrai rindai ar "nē".
Piemēram, 2\. rindai (0, 0, 1): $x or y or not z$. Piemēram, 2. rindai $(0, 0, 1)$: $x or y or not z$.
Tad uzbūvējam konjunkciju vārtiem: Tad uzbūvējam konjunkciju vārtiem:
$ $
(x or y or not z) and (x or not y or not z) and \ (x or y or not z) and (x or not y or not z) and \
and (not x or y or not z) and (not x or not y or z) and (not x or y or not z) and (not x or not y or z)
$ $
Veido konjunkciju no visiem vārtiem shēmā. Tā kā 3-SAT sagaida 3 mainīgos katrā Veido konjunkciju no visiem vārtiem shēmā. Tā kā 3-SAT sagaida 3 mainīgos katrā
iekavā. Tiem, kas satur 1 vai 2 (identitātes vārti un not vārti attiecīgi), iekavā.
pārveido tos par 3-CNF konjunkciju pievienojot jaunu mainīgo, kas vienā Tiem, kas satur 1 vai 2 (identitātes vārti un not vārti attiecīgi), pārveido tos
formulā ir pozitīvs un otrā -- negācija. par 3-CNF konjunkciju pievienojot jaunu mainīgo, kas vienā formulā ir pozitīvs
un otrā -- negācija.
$ $
(x or not b) = (x or not b or a) and (x or not b or not a) (x or not b) = (x or not b or a) and (x or not b or not a)
$ $
Analoģiski iekavām ar vienu elementu. Rezultātā ir 3-CNF formula, ko var Analoģiski iekavām ar vienu elementu. Rezultātā ir 3-CNF formula, ko var
@ -924,8 +921,8 @@ skaitu originālajā formulā.
$E' := {(u, v) in V times V | (u, v) in.not E}$ $E' := {(u, v) in V times V | (u, v) in.not E}$
Vārdiski. Jauns grafs $G$, kurā ir visas virsotnes no $V$, bet Vārdiski. Jauns grafs $G$, kurā ir visas virsotnes no $V$, bet
visas šķautnes, kas ir $G$ nav $G'$ un pretēji -- visas šķautnes visas šķautnes, kas ir $G$ nav $G'$ un pretēji -- visas šķautnes
kā nav $G$ ir $G'$. kā nav $G$ ir $G'$.
#figure( #figure(
@ -975,7 +972,8 @@ Ir spēkā sakarība $"INDSET"(G, k) = "CLIQUE"(G, k)$.
#table( #table(
columns: 3, columns: 3,
inset: (top: .8em, bottom: .9em), // vert. padding inset: (top: .8em, bottom: .9em),
// vert. padding
[*Funkcija*], [*Atvasinājums*], [*Piezīmes*], [*Funkcija*], [*Atvasinājums*], [*Piezīmes*],
[$x^n$], [$n x^(n-1)$], [], [$x^n$], [$n x^(n-1)$], [],
@ -988,26 +986,21 @@ Ir spēkā sakarība $"INDSET"(G, k) = "CLIQUE"(G, k)$.
[$1 / sqrt(x)$], [$-1 / (2 x^(3/2))$], [], [$1 / sqrt(x)$], [$-1 / (2 x^(3/2))$], [],
) )
\* Ja $x = g(x)$ (kompleksa funkcija), tad pie atvasinājuma \* Ja $x = g(x)$ (kompleksa funkcija), tad pie atvasinājuma
piereizina $g(x)'$. piereizina $g(x)'$.
] ]
== Noderīgas izteiksmes laika analīzē<time_analysis_expressions> == Noderīgas izteiksmes laika analīzē<time_analysis_expressions>
$ $
sum_(i=1)^(n) i = (n(n+1))/(2) \ sum_(i=1)^(n) i = (n(n+1))/(2) \
sum_(i=1)^(n) i^2 = (n(n+1)(2n+1))/(6)\
sum_(i=1)^(n) i^2 = (n(n+1)(2n+1))/(6)\ sum_(i=1)^(n) i^3 = ( (n(n+1))/(2))^2 \
// Geometric series (ratio r \neq 1)
sum_(i=1)^(n) i^3 = ( (n(n+1))/(2))^2 \ r > 1: sum_(i=0)^(n) a*r^i = a * (r^(n+1)-1)/(r-1) quad \
r < 1: sum_(i=0)^(infinity) a*r^i = (a)/(1-r) \
// Geometric series (ratio r \neq 1) // Logarithmic sum
r > 1: sum_(i=0)^(n) a*r^i = a * (r^(n+1)-1)/(r-1) quad \ sum_(i=1)^(n) log i = log(n!) approx n log n - n + O(log n) \
r < 1: sum_(i=0)^(infinity) a*r^i = (a)/(1-r) \ // Exponential sum (appears in brute-force algorithms)
sum_(i=0)^(n) 2^i = 2^(n+1) - 1 \
// Logarithmic sum
sum_(i=1)^(n) log i = log(n!) approx n log n - n + O(log n) \
// Exponential sum (appears in brute-force algorithms)
sum_(i=0)^(n) 2^i = 2^(n+1) - 1 \
$ $