diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/fuggveny_interval.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/fuggveny_interval.png new file mode 100644 index 0000000..31ca9e2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/fuggveny_interval.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek1.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek1.jpg new file mode 100644 index 0000000..a198c22 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek1.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek2.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek2.jpg new file mode 100644 index 0000000..19b872b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/hatarertek2.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_1_3_5_7.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_1_3_5_7.png new file mode 100644 index 0000000..bc50457 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_1_3_5_7.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_51_57.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_51_57.png new file mode 100644 index 0000000..172a9b2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/img/taylor_sinx_51_57.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.pdf new file mode 100644 index 0000000..27a3097 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.tex new file mode 100644 index 0000000..5d5c18d --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/01.Függvények határértéke, folytonossága/tetel1.tex @@ -0,0 +1,1289 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[magyar]{babel} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{fontawesome} +\usepackage{listings} +\usepackage{pgfplotstable} +\usepackage{setspace} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{collectbox} +\usepackage{comment} +\usepackage{float} +\usepackage{svg} +\usepackage{tikz} +%\usepackage{titlesec} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +% A dokument itt kezdődik + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{1. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} +% \pagecolor{black!40} +% \color{white} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + {\Large\bfseries\noindent 1. Függvények határértéke, folytonossága\\} + + \noindent Jelölje a továbbiakban $\overline{\mathbb{R}} = \mathbb{R} \cup \{+\infty, -\infty\}$ (bővített számegyenes)\\ + + \noindent \textbf{Környezet}: Legyen $a \in \mathbb{R}$, és $\delta \in \mathbb{R}^{+}$, ekkor a + \begin{itemize} + \item \textbf{\small \emph{Kétoldali környezet}}: $K_{\delta}(a)\ =\ \Big\{x \in \mathbb{R}\ \Big|\ \emph{d}(x,a) = |x-a|\ <\ \delta \Big\}\ =\ (a - \delta,\ a + \delta)$ + \item \textbf{\small \emph{Bal oldali környezet}}: $K_{\delta}(a-0)\ =\ K(a-0)\ =\ (a - \delta,\ a)$ + \item \textbf{\small \emph{Jobb oldali környezet}}: $K_{\delta}(a+0)\ =\ K(a+0)\ =\ (a,\ a + \delta)$ + \item Ha $a \in \overline{\mathbb{R}}$ és $c \in \mathbb{R}$, akkor \emph{kiterjesztett környezet}ről beszélünk, és + \begin{align*} + K_{c}(+\infty) = \left(c, +\infty \right) = \Big\{ x \in \mathbb{R}\ \Big|\ c < x \Big\}\\ + K_{c}(-\infty) = \left(-\infty, c \right) = \Big\{ x \in \mathbb{R}\ \Big|\ x < c \Big\} + \end{align*} + \end{itemize} + + \paragraph*{Belső pont} + + \noindent Legyen $A \subset \mathbb{R}$ tetszőleges halmaz és $a \in \mathbb{R}$. Az $a$ \textbf{belső pontja} a $A$ halmaznak, ha az $a$-nak van olyan $\delta > 0$ sugarú környezete, amely részhalmaza az $A$-nak ($K_{\delta}(a) \subset A)$.\\ + \noindent \emph{Jelölése}: \textbf{int A} (az A halmaz belső pontjainak halmaza). + + \paragraph*{Torlódási pont} + Az $a \in \overline{\mathbb{R}}$, az $\emptyset \neq H \subset \mathbb{R}$ halmaz \textbf{torlódási pontja}, ha $\forall \delta > 0 : K_{\delta}(a) \cap H$ végtelen halmaz, azaz az $a$ pont minden környezete végtelen sok $H$-beli elemet tartalmaz.\\ + \noindent \emph{Jelölése}: $\textbf{H}\boldsymbol{'}$ (a H halmaz torlódási pontjainak halmaza).\\ + + \noindent Megjegyzések: + \begin{itemize} + \item Az $a \in \mathbb{R}$ torlódási pontja az $A$-nak, ha $\forall \delta > 0: (a - \delta, a + \delta) \cap A$ végtelen halmaz. + \item Az $a = +\infty \in \overline{\mathbb{R}}$ torlódási pontja az $A$-nak, ha $\forall \delta > 0: (\delta, +\infty) \cap A$ végtelen halmaz. + \item Az $a = -\infty \in \overline{\mathbb{R}}$ torlódási pontja az $A$-nak, ha $\forall \delta > 0: (-\infty, -\delta) \cap A$ végtelen halmaz.\\ + \end{itemize} + + \noindent \textbf{Példa 1.} Az $\left\{\ddfrac{1}{n} \Big|\ n = 1, 2, \ldots\right\}$ egyetlen torlódási pontja a \textbf{0}. + + \begin{center} + \begin{tikzpicture} + \draw[-] (0.00,0.00) -- (16.00,00); + + \foreach \x in {0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0} + \draw (\x * 16,0.1) -- (\x * 16,-0.1) node [below] {\x}; + + \foreach\x [evaluate=\x as \y using 1/\x] in {1,...,400} + \draw[red,fill={rgb:black,1;white,4},line width=.1ex,draw=black] (\y * 16,0) circle (.5ex); + + \end{tikzpicture} + \end{center} + \ \\ + \noindent \textbf{Példa 2.} A $\left\{(-1)^{n} \cdot \left(2 - \ddfrac{1}{n}\right) \Big|\ n = 1, 2, \ldots\right\}$ két torlódási pontja a \textbf{-2} és a \textbf{2}. + + \begin{center} + \begin{tikzpicture} + \draw[-] (-8.00,0.00) -- (8.00,00); + + \foreach \x in {-2.0, -1.5, ..., 1.5, 2.0} + \draw (\x * 4,0.1) -- (\x * 4,-0.1) node [below] {\x}; + + \foreach\x [evaluate=\x as \y using ((-1)^\x) * (2 - 1/\x)] in {1,...,400} + \draw[red,fill={rgb:black,1;white,4},line width=.1ex,draw=black] (\y * 4,0) circle (.5ex); + \end{tikzpicture} + \end{center} + \ \\ + \noindent További példák: $\mathbb{N}' = \{+\infty\},\quad \mathbb{Q}' = \overline{\mathbb{R}},\quad \mathbb{Q}^{*'} = \overline{\mathbb{R}},\quad (0,1)' = [0,1]$.\\ +\newpage + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + + \noindent \textbf{Nyílt halmaz}\\ + + \noindent $A$ nyílt halmaz $\iff\ \forall a \in A,\ \exists K(a): K(a) \subset A$, vagyis az $A$ halmaz minden pontja belső pont.\\ + \noindent Másképp: Adott $a,\ b \in \mathbb{R}$, ahol $a < b$. Ekkor az $a$ és $b$ számok által meghatározott nyílt intervallumon az $\left\{ x \in \mathbb{R}\ \big|\ a < x < b\right\}$ halmazt értjük. Jelölése: $\Big(a,b\Big)$ vagy $\Big]a,b\Big[$\\\\ + + \noindent \textbf{Zárt halmaz}\\ + + \noindent Komplementere nyílt halmaz.\\ + \noindent Másképp: Adott $a,\ b \in \mathbb{R}$, ahol $a < b$. Ekkor az $a$ és $b$ számok által meghatározott zárt intervallumon az $\left\{ x \in \mathbb{R}\ \big|\ a \leq x \leq b\right\}$ halmazt értjük. Jelölése: $[a,b]$\\ + + \noindent Legyen $A \subset \mathbb{R},\ A \neq \emptyset$. Azt mondjuk, hogy + \begin{itemize} + \item $A$ \textbf{felülről korlátos} számhalmaz, ha $\exists K \in \mathbb{R}$, hogy bármely $a \in A$ esetén $a \leq K$.\\ Az ilyen $K$ szám az $A$ halmaz egyik felső korlátja.\\ + \end{itemize} + + \noindent Legyen $A \subset \mathbb{R},\ A \neq \emptyset$ \emph{felülről korlátos} halmaz. \\ + Tekintsük a $B := \Big\{K \in \mathbb{R}\ \Big|\ \text{\emph{K} felső korlátja az \emph{A} halmaznak}\Big\}$ halmazt.\\ + Legyen $\alpha \in \mathbb{R}$ a $B$ halmaz legkisebb eleme, azaz olyan szám, amelyre + \begin{itemize} + \item $\alpha \in B$ ($\alpha$ is \emph{felső korlátja} az $A$ halmaznak) + \item bármely $K \in B$ felső korlátra $\alpha \leq K$. A kérdés csupán az, hogy van-e ilyen $\alpha \in \mathbb{R}$. + \end{itemize} + + \noindent Az ilyen $\alpha \in \mathbb{R}$ számot (amely nem feltétlenül eleme az $A$ halmaznak) a halmaz \textbf{felső határának} nevezzük. + \noindent Jelölése: + \[ + \alpha := sup A\ \text{(„az A halmaz szuprémuma”)} + \] + + \noindent A $supA$ két tulajdonsága: + \begin{itemize} + \item bármely $a \in A$ esetén $a \leq supA$ + \item bármely $\varepsilon > 0$ esetén van olyan $a' \in A$, hogy $(supA) -\varepsilon < a'$.\\ + \end{itemize} + + \noindent \textbf{Felső határ axiómája}: Minden \emph{felülről korlátos} $A \subset \mathbb{R},\ A \neq \emptyset$ halmaznak van \emph{legkisebb felső korlátja}.\\ + + \noindent Legyen $A \subset \mathbb{R},\ A \neq \emptyset$. Azt mondjuk, hogy + \begin{itemize} + \item $A$ \textbf{alulról korlátos} számhalmaz, ha $\exists L \in \mathbb{R}$, hogy bármely $a \in A$ esetén $a \geq L$.\\ Az ilyen $L$ szám az $A$ halmaz egyik alsó korlátja.\\ + \end{itemize} + + \noindent Legyen $A \subset \mathbb{R},\ A \neq \emptyset$ \emph{alulról korlátos} halmaz. \\ + Tekintsük a $B := \Big\{L \in \mathbb{R}\ \Big|\ \text{\emph{L} alsó korlátja az \emph{A} halmaznak}\Big\}$ halmazt.\\ + Legyen $\beta \in \mathbb{R}$ a $B$ halmaz legnagyobb eleme, azaz olyan szám, amelyre + \begin{itemize} + \item $\beta \in B$ ($\beta$ is \emph{alsó korlátja} az $A$ halmaznak) + \item bármely $L \in B$ alsó korlátra $\beta \leq L$. + \end{itemize} + + \noindent Az ilyen $\beta \in \mathbb{R}$ számot (amely nem feltétlenül eleme az $A$ halmaznak) a halmaz \textbf{alsó határának} nevezzük. + Jelölése: + \[ + \beta := inf A\ \text{(„az A halmaz infimuma”)} + \] + + \noindent Az $infA$ két tulajdonsága: + \begin{itemize} + \item bármely $a \in A$ esetén $infA \leq a$ + \item bármely $\varepsilon > 0$ esetén van olyan $a' \in A$, hogy $a' < (infA) +\varepsilon$. + \end{itemize} + +% \noindent \textbf{Definíció}. Legyen $I \subset \mathbb{R}$. Azt mondjuk, hogy $I$ \textbf{intervallum}, ha bármely $x_{1}, x_{2} \in I,\ x1 < x2$ esetén minden olyan $x \in \mathbb{R}$, amelyre $x_1 < x < x_2$, fennáll, hogy $x \in I$.\\ + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO }\\ + + \noindent Akkor mondjuk, hogy a $\mathbb{R}$ valamely $I$ részhalmaza \textbf{kompakt}, ha $I$ \emph{korlátos} és \emph{zárt} halmaz.\\ + + \section*{Függvények határértéke} + + \textit{Intuitívan}: Legyen $a$ egy nyílt intervallum egy pontja és tegyük fel, hogy az $f$ függvény értelmezve van ezen az intervallumon, kivéve esetleg magát az $a$ helyet.\\ + Ha az $f(x)$ függvényértékek tetszőlegesen közel kerülhetnek egy $A$ számhoz, amennyiben az $x$ értékek eléggé megközelítik az $a$-t, akkor azt mondjuk, hogy $f$ függvény az $A$ számhoz tart, miközben $x$ tart $a$-hoz.\\ + + \noindent Legyen $f \in \mathbb{R} \rightarrow \mathbb{R},\ a \in D_{f}^{'} \subset \overline{\mathbb{R}}$.\\ + Az $f$ függvénynek az $a \in D_{f}^{'}$ pontban létezik határértéke az $A \in \overline{\mathbb{R}}$, ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x \in \Big(K_{\delta}(a)\setminus\{a\} \cap D_{f} \Big)\text{ esetén }f(x) \in K_{\varepsilon}(A) + \] + + \begin{center} + Jelölés: $\lim\limits_{x \to a}{f(x)} = \lim\limits_{a}{f} = A$ + \end{center} + + \paragraph*{Végesben vett véges határérték\\} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + + \noindent Legyen $f : \mathbb{R} \rightarrow \mathbb{R}$ tetszőleges függvény, $a \in \mathbb{R}$ tetszőleges szám, amelynek valamely $\delta$ sugarú lyukas környezetét $Dom(f)$ tartalmazza. Ekkor az $f(x)$ függvénynek az $a$ pontban (végesben) van véges határértéke, ha van olyan $A \in \mathbb{R}$ valós szám, amelynek minden $\varepsilon > 0$ sugarú környezetéhez (hiba-vagy türéshatár) található az $a$ számnak egy olyan $\delta > 0$ sugarú környezete (küszöbhatár), amelynek minden $x$ eleme esetén $f(x)$ az A-nak $\varepsilon$ sugarú környezetébe esik (vagyis $f(x)$ értéke $A$-tól legfeljebb $\varepsilon$-al tér el).\\ + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO }\\ + + \noindent Legyen $f \in \mathbb{R} \rightarrow \mathbb{R},\ a \in D_{f}^{'} \subset \mathbb{R}$, ekkor + \begin{center} + $\lim\limits_{x \to a}^{}f = A \in \mathbb{R}$\\ + $\Updownarrow$\\ + $\forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x \in D_{f}\quad \Big[0 < \big|x - a\big| < \delta\ : \big|f(x) - A\big| < \varepsilon\Big]$ + \end{center} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + + \noindent Ha az $f$ \emph{identikus leképezés}, azaz minden $x$-re, $f(x) = x$, akkor tetszőleges $a$ esetén + \[ + \lim\limits_{x \to a}f(x) = \lim\limits_{x \to a}x = a + \] + + \noindent Ha az $f$ \emph{abszolút érték függvény}, azaz minden $x$-re $f(x) = \Big|x\Big|$, akkor tetszőleges $a$ esetén + \[ + \lim\limits_{x \to a}f(x) = \lim\limits_{x \to a}\Big|x\Big| = \Big|a\Big| + \] + + \noindent Ha az $f$ \emph{konstans függvény}, azaz minden $x$-re $f(x) = k$ valamely $k$ számra, akkor tetszőleges $a$ esetén + \[ + \lim\limits_{x \to a}f(x) = \lim\limits_{x \to a}k = k + \] + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } +\newpage + \paragraph*{Végesben vett végtelen határérték\\} + + \noindent Legyen $f \in \mathbb{R} \rightarrow \mathbb{R},\ a \in D_{f}^{'} \subset \mathbb{R}$, ekkor\\ + + \noindent \emph{Végesben vett mínusz végtelen határérték}: + \begin{center} + $\lim\limits_{x \to a}f = -\infty$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R}\qquad \exists \delta > 0\qquad \forall x \in D_{f}\quad \Big[0 < \big|x - a\big| < \delta:\ f(x) \boldsymbol{<} K\Big]$ + \end{center} + + \noindent \emph{Végesben vett plusz végtelen határérték:} + \begin{center} + $\lim\limits_{x \to a}f = +\infty$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R}\qquad \exists \delta > 0\qquad \forall x \in D_{f}\quad \Big[0 < \big|x - a\big| < \delta:\ f(x) \boldsymbol{>} K\Big]$ + \end{center} + +% \begin{center} +% \begin{tikzpicture}[scale=1.0] +% \begin{axis}[axis lines=middle,xmin=-5.0,xmax=5.0,ymin=0.0,ymax=2.0, +% xlabel=$\scriptstyle x$, +% ylabel=$\scriptstyle y$, +% xtick={-5,-4,-3,-2,-1,0,1,2,3,4,5}, +% ytick={0,0.5,1.0,2.0}, +% xticklabels={-5,4,$\Big(0 - \delta$,-2,-1,0,1,2,$0 + \delta\Big)$,4,5}, +% extra x ticks={0}, +% tick label style={font=\tiny}] +% \addplot[no marks, line width=2pt,gray,domain=-5.0:-3.1,samples=15] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,blue,domain=-2.9:2.9,samples=40] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,gray,domain=3.1:5.0,samples=15] +% { +% 1/(x^2) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (-3,0) (-3,0.1) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (-3,0.15) (-3,3) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (3,0) (3,0.1) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (3,0.15) (3,3) +% }; +% \addplot+[xcomb,no marks,thick, line width=1pt,red] plot coordinates +% { +% (-2.9,0.1111111) (2.9,0.1111111) +% }; +% \addplot[only marks,mark=o,red] coordinates +% { +% (-3.0,0.1111111) (3.0,0.1111111) +% }; +% \addplot[only marks,mark=*,red] coordinates { (0,0) }; +% %\node[above right, outer sep=2pt] (0.0,0.1111111) {P}; +% \end{axis} +% \end{tikzpicture} +% \begin{tikzpicture}[scale=1.0] +% \begin{axis}[axis lines=middle,xmin=-2.0,xmax=2.0,ymin=0.0,ymax=3.0, +% xlabel=$\scriptstyle x$, +% ylabel=$\scriptstyle y$, +% ytick={0,0.5,1,1.5,2,2.5,3.0}, +% xtick={-2,-1,0,1,2}, +% xticklabels={2,$\Big(0 - \delta$,0,$0 + \delta\Big)$,2}, +% extra x ticks={0}, +% tick label style={font=\tiny}] +% \addplot[no marks, line width=2pt,gray,domain=-2.0:-1.0163,samples=20] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,gray,domain=-2.0:-1.0163,samples=20] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,blue,domain=-0.9845:-0.1,samples=16] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,blue,domain=0.1:0.9845,samples=16] +% { +% 1/(x^2) +% }; +% \addplot[no marks, line width=2pt,gray,domain=1.0163:2.0,samples=20] +% { +% 1/(x^2) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (-1,0) (-1,0.963) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (-1,1.037) (-1,3) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (1,0) (1,0.963) +% }; +% \addplot+[no marks,thick, line width=0.75pt,red,dotted] plot coordinates +% { +% (1,1.037) (1,3) +% }; +% \addplot+[xcomb,no marks,thick, line width=1pt,red] plot coordinates +% { +% (-0.963,1.0) (0.963,1.0) +% }; +% \addplot[only marks,mark=o,red] coordinates +% { +% (-1.0,1.0) (1.0,1.0) +% }; +% \addplot[only marks,mark=*,red] coordinates { (0,0) }; +% %\node[above right, outer sep=2pt] (0.0,1.0) {P}; +% \end{axis} +% \end{tikzpicture} +% \end{center} + + \paragraph*{Végtelenben vett véges határérték\\} + + \noindent \emph{Mínusz végtelenben vett véges határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{-\infty}}^{}f = \textbf{A}$\\ + $\Updownarrow$\\ + $\forall \varepsilon > 0\qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)}\qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{<} \omega:\ \big|f(x) - A\big| < \varepsilon\Big]$ + \end{center} + \noindent \emph{Plusz végtelenben vett véges határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{+\infty}}^{}f = \textbf{A}$\\ + $\Updownarrow$\\ + $\forall \varepsilon > 0\qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)}\qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{>} \omega:\ \big|f(x) - A\big| < \varepsilon\Big]$ + \end{center} + + \noindent \emph{Példa}: $\lim\limits_{x \to +\infty} 2 + \ddfrac{1}{x^{2}} = 2$. \\ + + \noindent Akárhogy választjuk az $\varepsilon > 0$ számot, lesz olyan $K > 0$, hogy ettől az értéktől kezdve minden $x$-re, a függvényértékek $f(x)$ $2$-től vett távolsága kisebb, mint $\varepsilon$. + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=center,xmin=0.0,xmax=5.0,ymin=0.0,ymax=5.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={0,1,2,3,4,5}, + ytick={0,1,2,3,4,5}, + xticklabels={0,$K$,2,3,4,5}, + yticklabels={0,$2 - \varepsilon$,2,$2 + \varepsilon$,4,5}, + extra x ticks={0.0}, + extra y ticks={0.0}, + tick label style={font=\tiny}] + \addplot[no marks, line width=2pt,gray,domain=0.6:1.0,samples=20] {2 + 1/(x^2)}; + \addplot[no marks, line width=2pt,blue,domain=1.01:5.0,samples=60] {2 + 1/(x^2)}; + \addplot[only marks,mark=*,red] coordinates { (0,2) }; + \addplot+[xcomb,no marks,thick, line width=0.3pt,black] plot coordinates + {(0,2) (5,2)}; + \addplot+[xcomb,no marks,dotted, line width=0.75pt,red] plot coordinates + { + (1,3) (5,3) + (1,1) (5,1) + }; + \addplot+[ycomb, line width=1pt,red] plot coordinates + {(1,1) (1,3)}; + \end{axis} + \end{tikzpicture} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=center,xmin=200,xmax=350,ymin=1.999985,ymax=2.0000275, + y tick label style={/pgf/number format/.cd,fixed,precision=7, + set thousands separator={}, + }, + x tick label style={/pgf/number format/.cd, + scaled x ticks = false, + set decimal separator={}, + set thousands separator={}, + }, + extra x ticks={200.0}, + extra y ticks={1.999985}, + xtick={200,250,300,350}, + xtick={100,250,300,350}, + xticklabels={200,250,$K$,350}, + ytick={1.999985,1.999989, 2.0,2.000011,2.0000275}, + yticklabels={1.999985,$2 - \varepsilon$,2,$2 + \varepsilon$,2.0000275}, + tick label style={font=\tiny}] + \addplot[line width=2pt,gray,domain=201:300,samples=5,smooth] {2 + 1/(x^2)}; + \addplot[line width=2pt,blue,domain=300:350,samples=3,smooth] {2 + 1/(x^2)}; + \addplot[only marks,mark=*,red] coordinates { (200,2) }; + \addplot+[xcomb,no marks,thick, line width=0.3pt,black] plot coordinates + {(200,2) (350,2)}; + \addplot+[xcomb,no marks,dotted, line width=0.75pt,red] plot coordinates + { + (300,2.000011) (350,2.000011) + (300,1.999989) (350,1.999989) + }; + \addplot+[ycomb, line width=1pt,red] plot coordinates + {(300,1.999989) (300,2.000011)}; + \end{axis} + \end{tikzpicture} + \end{center} + + \paragraph*{Végtelenben vett végtelen határérték\\} + + \noindent \emph{Mínusz végtelenben vett mínusz végtelen határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{-\infty}}f = \boldsymbol{-\infty}$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R} \qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)} \qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{<} \omega:\ f(x) \boldsymbol{<} K\Big]$ + \end{center} + \noindent \emph{Mínusz végtelenben vett plusz végtelen határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{-\infty}}f = \boldsymbol{+\infty}$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R} \qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)} \qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{<} \omega:\ f(x) \boldsymbol{>} K\Big]$ + \end{center} + + \noindent \emph{Plusz végtelenben vett mínusz végtelen határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{+\infty}}f = \boldsymbol{-\infty}$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R} \qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)} \qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{>} \omega:\ f(x) \boldsymbol{<} K\Big]$ + \end{center} + \noindent \emph{Plusz végtelenben vett plusz végtelen határérték}: + \begin{center} + $\lim\limits_{x \to \boldsymbol{+\infty}}f = \boldsymbol{+\infty}$\\ + $\Updownarrow$\\ + $\forall K \in \mathbb{R} \qquad \exists \omega \in \mathbb{R}\ \text{(küszöbszám)} \qquad \forall x \in D_{f}\quad \Big[x \boldsymbol{>} \omega:\ f(x) \boldsymbol{>} K\Big]$ + \end{center} + + \subsection*{Határérték és algebrai műveletek} + + Legyen $A,\ B,\ \lambda \in \mathbb{R}$, és $\alpha \in \overline{\mathbb{R}}$. Tegyük fel, hogy + \[ + \lim_{x \to \alpha} f(x) = A\qquad \Big|\qquad \lim_{x \to \alpha}g(X) = B + \] + Ekkor léteznek az alábbi határértékek és fennállnak a következő összefüggések: + \begin{enumerate} + \item \emph{Szorzás konstanssal}: $\lim\limits_{x \to \alpha} (\lambda \cdot f) = \left\{ \begin{array}{rl} + \lambda \cdot A &, \text{ha}\ \lambda \neq 0 \\ + 0 &, \text{ha}\ \lambda = 0 + \end{array} \right. + $ + \item \emph{Összeg, különbség}: $\lim\limits_{x \to \alpha} (f \pm g) = A \pm B$ + \item \emph{Szorzat}: $\lim\limits_{x \to \alpha} (f \cdot g) = A \cdot B$ + \item \emph{Hányados}: $\lim\limits_{x \to \alpha}\ddfrac{f}{g} = \ddfrac{A}{B}$ ($B \neq 0$) + \item \emph{Hatványozás}: $\lim\limits_{x \to \alpha} (f^{n}) = A^{n},\ n \in \mathbb{Z}$ (feltéve, hogy $A^{n}$ értelmezve van) + \end{enumerate} +\newpage + \noindent Az "eldönthetetlen" $0^{0}, 1^{\pm\infty}, (\pm\infty)^{0}, (+\infty) + (-\infty),\ 0 \cdot \pm\infty,\ \ddfrac{0}{0},\ \ddfrac{\pm\infty}{\pm\infty}$ limeszeknél a függvényt próbáljuk meg úgy átalakítani, hogy az új kifejezés limesze már eldönthető legyen.\\ + + \noindent Példák: + \[ + \lim\limits_{x \to \infty}x^{2} - x + 2 = \infty -\infty + 2 = ?,\ de + \] + \[ + \lim\limits_{x \to \infty}x^{2} - x + 2 = \lim\limits_{x \to \infty}x^{2}(1 - \ddfrac{1}{x} + \ddfrac{2}{x^{2}}) = \infty \cdot (1 - 0 + 0) = \infty \cdot 1 = \infty + \] + + \[ + \lim\limits_{x \to \infty}\ddfrac{x^{2} - x + 2}{2x^{2}+3} = \ddfrac{\infty}{\infty} = ?,\ de + \] + \[ + \lim\limits_{x \to \infty}\ddfrac{x^{2}(1 - \ddfrac{1}{x} + \ddfrac{2}{x^{2}})}{x^{2}(2+\ddfrac{3}{x^{2}})} = \lim\limits_{x \to \infty}\ddfrac{1 - \ddfrac{1}{x} + \ddfrac{2}{x^{2}}}{2+\ddfrac{3}{x^{2}}} = \lim\limits_{x \to \infty}\ddfrac{\textbf{1} - \underbrace{\ddfrac{1}{x}}_{\rightarrow 0} + \underbrace{\ddfrac{2}{x^{2}}}_{\rightarrow 0}}{\textbf{2}+\underbrace{\ddfrac{3}{x^{2}}}_{\rightarrow 0}} = \ddfrac{\textbf{1}}{\textbf{2}} + \] + + \subsection*{Féloldali határértékek} + + \noindent Az $f$ függvény \textbf{\emph{jobb oldali határértéke}} az $a$ helyen az $A$ szám (jelölése: $\lim\limits_{x \to a^{+}} = \lim\limits_{x \to a+0} = A$),\ ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x\ \Big[\boldsymbol{a < x < a + \delta}\ \Rightarrow \big|f(x) - A\big| < \varepsilon\Big] + \] + + \noindent Az $f$ függvény \textbf{\emph{bal oldali határértéke}} az $a$ helyen az $A$ szám (jelölése: $\lim\limits_{x \to a^{-}} = \lim\limits_{x \to a-0} = A$),\ ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x\ \Big[\boldsymbol{a - \delta < x < a} \Rightarrow \big|f(x) - A\big| < \varepsilon\Big] + \] + + \noindent \textbf{Tétel}. Az $f$ függvénynek pontosan akkor létezik az $a$ helyen határértéke, ha ugyanitt létezik mind a jobb, mind a bal oldali határértéke és ezek egyenlőek, azaz + \[ + \lim\limits_{x \to a^{+}}f(x) = \lim\limits_{x \to a^{-}}f(x) + \Leftrightarrow + A \lim\limits_{x \to a}f(x) + \] + + \section*{Függvények folytonossága} + + \noindent A függvény $a$-beli folytonossága azt jelenti, hogy akármilyen kicsi $\varepsilon$ hibakorlátot is szabunk, mindig lesz az $a$ körül olyan kis $( a-\delta, a+\delta )$ intervallum, amelyen belüli $x$-ekre a függvény $f(x)$ értékei a hibakorlátnál ($\varepsilon$-nál) kisebb mértékben térnek el $f(a)$-tól.\\ + + \noindent \emph{Formálisan}: Az $f : \mathbb{R} \to \mathbb{R}$ függvény az $a \in \mathcal{D}_{f}$ pontban folytonos, ha + \begin{center} + $\forall \varepsilon > 0\qquad \exists \delta > 0$\qquad $\forall x \in K_{\delta}(a) : f(x) \in K_{\varepsilon}\Big(f(a)\Big)$ \\ + $\Updownarrow$\\ + $\forall \varepsilon > 0\qquad \exists \delta > 0$\qquad $\forall x \in \mathcal{D}_{f}\quad \Big[0 < \big|x-a\big| < \delta \Rightarrow \big|f(x)-f(a)\big| < \varepsilon\Big]$\\ + \end{center} + + \noindent A pontbeli folytonosság jelölése: $f \in \mathcal{C}[a]$. + + \subsubsection*{Folytonos függvények és a határérték kapcsolata} + + \noindent Az $f : \mathbb{R} \to \mathbb{R}$ függvény folytonos az $a \in \mathcal{D}_{f} \cap \mathcal{D}'_{f}$ pontban, ha + \[ + \exists \lim\limits_{x \to a}f(x)\ \text{véges határérték és}\ \lim\limits_{x \to a}f(x) = f(a) + \] + + \noindent Ha $f$ a $c$ helyen nincs értelmezve, de létezik az $L = \lim\limits_{c}f$ határérték, akkor az + \[ + F(x) = \left\{\begin{array}{cc} + f(x) & , \text{ha}\ x \neq c \\ + L & , \text{ha}\ x = c + \end{array} + \right. + \] + függvényt az $\textbf{f}$ $\emph{\textbf{c}}$-re való \emph{\textbf{kiterjesztésének}} nevezzük.\\ + + \noindent Például $\ddfrac{\sin{x}}{x}$ folytonosan kiterjeszthető az egész számegyenesen. + \[ + F(x) = \left\{\begin{array}{cc} + \ddfrac{\sin{x}}{x} & , \text{ha}\ x \neq 0 \\ + 1 & , \text{ha}\ x = 0 + \end{array} + \right. + \] + + \noindent \textbf{Állítás:} Az $f: [a,b] \rightarrow \mathbb{R}$ pontosan akkor folytonos, ha + \begin{itemize} + \item $[a, b]$ intervallum minden belső $c$ pontjában $\lim\limits_{x \to c}f = f(c)$ + \item az $a$ végpontban $\lim\limits_{x \to a^{+}}f = f(a)$ + \item a $b$ végpontban $\lim\limits_{x \to b^{-}}f = f(b)$ + \end{itemize} + + \noindent Az $a$ \textbf{megszüntethető szakadási pontja/helye} az $f$ függvénynek, ha + \[ + \exists \lim\limits_{x \to a}f,\ \text{de}\ \lim\limits_{x \to a}f \neq f(a) + \] + + \noindent Példa: + + $f(x) = \left\{ + \begin{array}{rc} + \ddfrac{\sin(x)}{x}, & x \in \mathbb{R}\backslash\{0\} \\ + 0, & x = 0 + \end{array} + \right.$ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2*pi,xmax=2*pi,ymin=-1.2,ymax=1.2, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\small}] + \addplot[no marks,domain=-2*pi:-0.1,samples=50,smooth,line width=2pt,blue]{sin(deg(x))/x}; + \addplot[no marks,domain=0.1:2*pi,samples=50,smooth,line width=2pt,blue]{sin(deg(x))/x}; + \addplot [only marks,mark=*] coordinates { (0,0) }; + \addplot [only marks,mark=o] coordinates { (0,1) }; + \end{axis} + \end{tikzpicture} + \end{center} + + \begin{itemize} + \item $f \in \mathcal{C}[a],\ \forall a \neq 0$ + \item a = 0,\ \text{megszüntethető szakadási hely, mert}\ $\lim\limits_{x \to 0}\ddfrac{sin(x)}{x} = 1 \neq f(0) = 0$ + \end{itemize} + + \noindent Az $a$ \textbf{ugráshelye} az $f$-nek, ha $\lim\limits_{x \to a^{+}}$ és $\lim\limits_{x \to a^{-}}$ végesek, de $\lim\limits_{x \to a^{+}} \neq \lim\limits_{x \to a^{-}}$.\\ + + $f(x) = \left\{ + \begin{array}{rc} + 0, & \text{ha}\ x < 0 \\ + 1, & \text{ha}\ x \geq 0 + \end{array} + \right.$ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-5.0,xmax=5.0,ymin=-1.0,ymax=2.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\small}] + \addplot[no marks,domain=-5.0:-0.1,samples=5,smooth,line width=2pt,blue]{0}; + \addplot [only marks,mark=o] coordinates { (0,0) }; + \addplot [only marks,mark=*] coordinates { (0,1) }; + \addplot[no marks,domain=0.1:5,samples=5,smooth,line width=2pt,blue]{1}; + \end{axis} + \end{tikzpicture} + \end{center} + + \noindent Az $a$ \textbf{hézagpontja} az $f$-nek, ha $\lim\limits_{x \to a^{+}} \pm \infty$ és $\lim\limits_{x \to a^{-}} = \pm \infty$, de $f$ nincs értelmezve $a$-ban.\\ + + \noindent Példa: $\ddfrac{x^2-1}{x-1}$ hézagpontja (x=1)-ben van. + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-5.0,xmax=5.0,ymin=-5.0,ymax=5.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-5,-1,0,1,5}, + ytick={-5,0,1,5}, + tick label style={font=\small}] + \addplot [only marks,mark=o] coordinates { (1,2) }; + \addplot[no marks,domain=-5.0:0.925,samples=100,smooth,line width=2pt,blue]{(x^2-1)/(x-1)}; + \addplot[no marks,domain=1.075:5.0,samples=100,smooth,line width=2pt,blue]{(x^2-1)/(x-1)}; + \end{axis} + \end{tikzpicture} + \end{center} + + \subsubsection*{A műveletek és a folytonosság kapcsolata} + + \noindent Ha $f \in \mathcal{C}[a]$ és $g \in \mathcal{C}[a]$, akkor + \begin{itemize} + \item $\lambda f \in \mathcal{C}[a]$ ($\lambda \in \mathbb{R}$) + \item $f + g \in \mathcal{C}[a], f \cdot g \in \mathcal{C}[a]$. + \item $\ddfrac{f}{g} \in \mathcal{C}[a]$, feltéve hogy $g(a) \neq 0$.\\ + \end{itemize} + + \noindent \textbf{Tétel}: Ha $g \in \mathcal{C}[a]$ és $f(x) \in \mathcal{C}[g(a)]$, akkor $f \circ g \in \mathcal{C}[a]$, azaz $f\big(g(x)\big) \in \mathcal{C}[a]$.\\ + + \noindent \emph{Megjegyzés}: Visszafelé nem feltétlenül igaz az állítás.\\ + Legyen $f : = sgn(x)$ és $g := -sgn(x)$. \\ + Ekkor $f + g$ az azonosan nulla függvény, és $f + g \in \mathcal{C}[0]$, de $f \not \in \mathcal{C}[0]$ és $g \not \in \mathcal{C}[0]$.\\\\ + + \noindent Az $f$ függvény folytonos az $I$ intervallumon, ha az intervallumra megszorított $f|_{I}$ függvény folytonos. Azaz, ha + \[ + \forall \alpha \in I: f \in \mathcal{C}[\alpha] + \] + + \noindent Példa olyan függvényre, amely folytonos egy zárt intervallumban. A $f(x)=\ddfrac{x+1}{x-1}$ függvény például folytonos az $a=3$ pontban a $[2,4]$ intervallumon. + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-8.0,xmax=10.0,ymin=-4.0,ymax=6.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-5,0,1,2,3,4,5,10}, + ytick={-1,0,1,2,3,4,5}, + tick label style={font=\small}] + \addplot[no marks,line width=1pt,blue,domain=-8.0:0.9,samples=150] {(x+1)/(x-1)}; + \addplot[no marks,line width=1pt,blue,domain=1.1:10.0,samples=150] {(x+1)/(x-1)}; + \addplot[no marks,line width=2pt,red,domain=2.0:4.0,samples=150] {(x+1)/(x-1)}; + \addplot [only marks,mark=*] coordinates { (2,3) }; + \addplot [only marks,mark=*] coordinates { (4,5/3) }; + \addplot [only marks,mark=*,blue] coordinates { (3,2) }; + \addplot+[ycomb,no marks] plot coordinates + {(3,0) (3,2)}; + \addplot+[ycomb,no marks, dotted] plot coordinates + {(1,-4) (1,6)}; + \end{axis} + \end{tikzpicture} + \end{center} + + \noindent Az $f$ függvény folytonos, ha értelmezési tartománya minden pontjában folytonos.\\ + \[ + \forall x \in \mathcal{D}_{f} : f \in \mathcal{C}[x],\ \text{akkor}\ f \in \mathcal{C}\ \text{($f$ folytonos függvény)} + \] + + \noindent Példa olyan függvényre, amely az egész számegyenesen folytonos.\\ + Legyen $f(x) = \ddfrac{1}{x^{2} + 2}$ + + \begin{center} + \begin{tikzpicture}[scale=0.8] + \begin{axis}[axis lines=middle,xmin=-10,xmax=10,ymin=0.0,ymax=0.525, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-10,-5,0,5,10}, + ytick={0,0.5}, + extra x ticks={0}, + tick label style={font=\small}] + \addplot[no marks,line width=2pt,blue,domain=-10.0:10.0,samples=250] {1/((x)^2 + 2)}; + \end{axis} + \end{tikzpicture} + \end{center} + + \subsubsection*{Intervallumon folytonos függvények tulajdonságai} + + \textbf{Tétel} \emph{(Bolzano)}. Tegyük fel, hogy valamely $-\infty < a < b < +\infty$ esetén az\\ + $f \in \mathcal{C}[a,b]$ és $f(a) \cdot f(b) < 0$ (ellenkező előjelű), ekkor + \[ + \exists \xi \in (a,b) : f(\xi) = 0 + \] + + \noindent \textbf{Tétel} \emph{(Bolzano-Darboux)}. Ha $f \in C[a,b]$, és legyen $d$ egy tetszőleges szám a $f(a)$ és $f(b)$ között. Ekkor + \[ + \exists c \in [a,b] : d = f(c) + \] + + \noindent Ez előző tétel azt mondja, hogy egy intervallumon folytonos függvény ha felvesz két értéket, akkor e két szám közötti minden értéket felvesz, ami azt jelenti, hogy egy intervallum folytonos képe intervallum. + + \subsection*{Weierstrass-tétel} + + \noindent Ha $f \in \mathcal{C}[a,b]$, akkor van olyan $\alpha, \beta \in [a,b]$, amelyekre teljesül, hogy $\forall x \in [a,b]$-re + \[ + f(\alpha) \leq f(x) \leq f(\beta) + \] + + \noindent Ez a tétel azt mondja, hogy $f_{\big|[a,b]}$ korlátos (hiszen $f(\alpha)$ és $f(\beta)$ között van a függvény minden értéke), sőt van minimuma és van maximuma is az $f_{\big|[a,b]}$ függvénynek. \\ + + \noindent A Bolzano- és a Weierstrass-tétel következménye, hogy egy \emph{zárt}, \emph{korlátos} intervallum folytonos képe is \emph{korlátos} és \emph{zárt} intervallum.\\ + + \noindent \emph{Tétel}: Ha $f \in \mathcal{C}[a,b]$, akkor $f$ korlátos $[a,b]$-ben. + + \paragraph*{Az inverzfüggvény folytonossága} + + \noindent \textbf{Tétel}: Legyen $I \in \mathbb{R}$ intervallum, és $f : I \to \mathbb{R}$ szigorúan monoton. Tegyül fel, hogy $f \in \mathcal{C}[a]$, ahol $a \in I$. Legyen továbbá $b := f(a)$. Ekkor $f^{-1} \in \mathcal{C}[b]$\\ + + \noindent Az $f$ függvény értelmezési tartományának egy $a$ pontjában \textbf{jobbról folytonos}, ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x \ \Big[0 \leq x - a < \delta : \big|f(x) - f(a)\big| < \varepsilon\Big] + \] + + \noindent Az $f$ függvény értelmezési tartományának egy $a$ pontjában \textbf{balról folytonos}, ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x \ \Big[0 \leq a - x < \delta : \big|f(x) - f(a)\big| < \varepsilon\Big] + \] + + \noindent \textbf{Tétel.} (Átviteli elv) Az $f$ függvény akkor és csak akkor folytonos az $a$ pontban, ha értelmezve van az $a$ pont környezetében, és minden $x_{n} \to a$ sorozatra $f(x_{n}) \to f(a)$.\\ + + \noindent Példa olyan függvényre, amely mindenütt értelmezett, de sehol sem folytonos + + \[ + D(x)= \left\{ \begin{array}{rl} + 1 & \text{, ha}\ x \in \mathbb{Q} \\ + 0 & \text{, ha}\ x \not \in \mathbb{Q} + \end{array} + \right. + \] + ahol a $D(x)$ függvény a \emph{Dirichlet} függvény. Ha sorozat minden tagja racionális szám, ilyenkor ez a függvény mindig $1$ értéket ad. Mégsem mondhatjuk, hogy a függvény értékeinek a sorozata tart az egyhez, hiszen bármelyik két racionális szám között végtelen sok irracionális szám van.\\ + + \noindent Az $a$ \textbf{szakadási pontja/helye} az $f$ függvénynek, ha $f$ az $a$ pontban nem folytonos ($f \not \in \mathcal{C}[a]$).\\ + + \noindent \textbf{Példa} olyan függvény, amely egy korlátos, zárt intervallumban végtelen sok helyen szakad. + Legyen + \[ + f:[0,1] \rightarrow \mathbb{R} = \left\{ \begin{array}{cc} + \ddfrac{1}{\Big\lceil\frac{1}{x}\Big\rceil} & ,\ \text{ha}\ x \neq 0 \\ + 0 & ,\ \text{ha}\ x = 0 + \end{array} \right. + \begin{tikzpicture}[scale=0.8] + \begin{axis}[axis lines=middle,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0, + clip=false, + every axis plot/.style={very thick}, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + ytick={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, + tick label style={font=\small}] + \addplot+[jump mark left,mark=none,line width=1.0pt,blue,domain=0.12:1.0,samples=120] {1/(floor(1/x))}; + \addplot[only marks,mark=*, mark size=2pt]coordinates{(0.5,0.5) (1.0,1.0) (0.33333, 0.33333) (0.25, 0.25)}; + \addplot[only marks,fill=white, mark size=2pt]coordinates{(0.5,1.0) (0.33333, 0.5) (0.25, 0.33333) (0.2, 0.25)}; + + \addplot[only marks,mark=*, mark size=1.25pt]coordinates{(0.2,0.2) (0.175,0.1675) (0.15, 0.1425)}; + \addplot[only marks,fill=white, mark size=1.25pt]coordinates{(0.175,0.2) (0.15, 0.1675) (0.1275, 0.1425)}; + + \addplot+[only marks,mark=*, mark size=0.25pt,line width=1.0pt,black,domain=0.01:0.12,samples=100,fill=blue] {1/(floor(1/x))}; + \end{axis} + \end{tikzpicture} + \] + + + \noindent \emph{Állítás:} Ha $\exists \lim\limits_{x \to a^{+}}$ f, és $\lim\limits_{x \to a^{+}} = f(a)$, akkor $f$ \textbf{jobbról folytonos} az $a$-ban.\\ + + \noindent \emph{Állítás:} Ha $\exists \lim\limits_{x \to a^{-}}$ f, és $\lim\limits_{x \to a^{-}} = f(a)$, akkor $f$ \textbf{balról folytonos} az $a$-ban.\\ + + \subsection*{Egyenletes folytonosság} + + \noindent Ha $H \subset \mathbb{R}$ kompakt és $f: H \to \mathbb{R}$ folytonos függvény, akkor $R_{f}$ (a fv. értékkészlete) is kompakt.\\ + + \noindent Akkor mondjuk, hogy az $f : \mathbb{R} \to \mathbb{R}$ függvény a $H \subset D_{f}$ halmazon \emph{egyenletesen folytonos}, ha + \[ + \forall \varepsilon > 0\qquad \exists \delta > 0\qquad \forall x,\ y \in H\ \Big[0 < \big|x-y\big| < \delta : \big|f(x)-f(y)\big| < \varepsilon\Big] + \] + + \subsubsection*{Heine-tétel} + + Ha $H \subset \mathbb{R}$ kompakt halmaz és $\big(f: H \to \mathbb{R}\big) \in \mathcal{C}$, akkor az $f$ a $H$ halmazon egyenletesen folytonos. + +% \subsection*{Sorozatok} + +% Az $f$ függvényt \textbf{sorozat}nak nevezzük, ha $\mathcal{D}_{f} = \mathbb{N}$. Jelölése: $\big(a_{n}\big)$ vagy $\big\{a_{n}\big\}$.\\ + +% \noindent Az $\big(a_{n}\big)$ sorozattal az $n \in N$ számhoz rendelt értéket a sorozat $\textbf{n}$-\textbf{edik tag}jának nevezzük. +% \begin{itemize} +% \item \text{Jelölése}: $a_{n}$ +% \end{itemize} + +% \noindent Ha egy $\big(a_{n}\big)$ sorozat értékkészlete +% \begin{itemize} +% \item $R_{f} = \mathbb{R}$ \emph{valós számsorozat}nak, +% \item $R_{f} = \mathbb{C}$ \emph{komplex számsorozat}nak, +% \item $R_{f} \subset \mathbb{R}^{n}$ (n-dimenziós euklideszi tér) $R^{n}$-beli \emph{vektorsorozat}nak nevezzzük. +% \end{itemize} + +% \paragraph*{Konvergens} + +% Egy $x = (a_{n}) : \mathbb{N} \to \mathbb{R}$ számsorozat konvergens, ha +% \[ +% \exists A \in \mathbb{R},\ \forall \varepsilon > 0,\ \exists k \in \mathbb{N},\ \forall n \in \mathbb{N},\ n > k : \Big|a_{n} - A\Big| < \varepsilon. +% \] +% \noindent Tehát bármilyen kicsi $\varepsilon$ esetén egy sorszám után $k$ a sorozat összes tagja $\varepsilon$ távolságnál közelebb van $A$-hoz.\\ + +% \noindent Ha az $\big(a_{n}\big):\ \mathbb{N} \to \mathbb{R}$ sorozat konvergens, akkor egyetlen olyan $A \in \mathbb{R}$ szám létezik, amelyre a konvergencia (előző def.) teljesül.\\ +% Ezt az $A$ számot az $\big(a_{n}\big)$ \textbf{sorozat határértékének} nevezzük: +% \[ +% lim (a_{n}) := A\qquad (n \to \infty) +% \] + +% \noindent Ha az $\big(a_{n}\big)$ sorozat nem konvergens, akkor \textbf{divergens}nek nevezzük.\\ + +% \noindent Akkor mondjuk, hogy az $a =\big(a_{n}\big)$ valós vagy komplex számsorozat felülről korlátos, ha létezik olyan $K$ szám, hogy minden $n \in \mathbb{N}$ indexre fennáll az $\big|a_{n}\big| \leq K$ egyenlőtlenség, azaz: +% \[ +% \exists K \in \mathbb{R},\ \text{hogy}\ \forall n \in \mathbb{N}: a_{n} \leq K. +% \] +% A $K$ számot a sorozat \textbf{felső korlát}jának nevezzük.\\ + +% \noindent Akkor mondjuk, hogy az $a =\big(a_{n}\big)$ valós vagy komplex számsorozat \textbf{alulról korlátos}, ha létezik olyan $k$ szám, hogy minden $n \in \mathbb{N}$ indexre fennáll az $\big|a_{n}\big| \geq k$ egyenlőtlenség, azaz: +% \[ +% \exists k \in \mathbb{R},\ \text{hogy}\ \forall n \in \mathbb{N}: a_{n} \geq k. +% \] +% A $k$ számot a sorozat \textbf{alsó korlát}jának nevezzük.\\ + +% \noindent Az $A \subset \mathbb{R}$ \textbf{zárt}, ha bármely $(a_{n}): \mathbb{N} \to A$ sorozatnak van olyan $\big(a_{\nu_{n}}\big)$ részsorozata, amely konvergens és $\lim{(a_{\nu_{n}})} \in A$.\\ + + \section*{Hatványsorok} + +% \paragraph*{Függvénysorozat, függvénysor} + +% Az olyan sorozatot, amelynek értékei azonos értelmezési tartománnyal rendelkező függvények, \textbf{függvénysorozat}nak nevezzük.\\ + +% \noindent Az $f_n:D \to \mathbb{R},\ n \in \mathbb{N}$ függvényeknek a közös értélmezési tartománya $D \neq \emptyset$.\\ +% Ezen függvények végtelen összegét nevezzük függvénysornak: +% \[ +% \sum\limits_{n=1}^{\infty}f_n=f_1+f_2+ \ldots+f_n+\ldots = \Big(f_{n}(x)\Big) +% \] + +% \noindent Az $f_1,f_2,f_3,...,f_n,...$ függvények a függvénysor tagjai. Az $\Big(f_{n}(x)\Big)$ sorozat $n$-edik tagja $f_{n}(x)$.\\ + +% \noindent \emph{Megjegyzés}. Az $x$ az adott $f_{n}$ függvény értelmezési tartományából származó valós szám.\\ + +% \noindent \textbf{Definíció}. Egy $\Big(f_{n}(x)\Big)$ függvénysorozatra azt mondjuk, hogy konvergens és tart egy $f(x)$ függvényhez, ha bármely $x$ esetén, amikor tetszőleges pozitív $\varepsilon$ valós számhoz létezik olyan $N_{\varepsilon} \in %\mathbb{Z}^{+}$ küszöbindex, hogy ha $n \in N_{\varepsilon}$, akkor $\Big|f_{n}(x) - f(x)\Big| < \varepsilon$. Az $f(x)$ függvényt \textbf{határfüggvénynek} nevezzük.\\ + +% \noindent \emph{Megjegyzés}. A megfelelő $N_{\varepsilon}$ értéke általában az $\varepsilon$-on kívül az adott $x$ értékétől is függ, mivel a konvergencia sebessége általában minden $x$ esetén más és más.\\ + + \noindent Legyen $x,\ x_{0} \in \mathbb{R}$ és $a =(a_{0}, a_{1},\ldots, a_{n}, \ldots)\quad (a_{n} \in \mathbb{R})_{n \in \mathbb{N}_{0}}$ egy tetszőleges sorozat. \\ + A következő alakú végtelen sort \textbf{hatványsornak} nevezzük. + \[ + a_{0} + a_{1}(x-x_{0}) + a_{2}(x-x_{0})^{2}+ \ldots + a_{n}(x-x_{0})^{n} + \ldots = \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n} + \] + + \begin{itemize} + \item $\boldsymbol{a_{i}}\ (i = 0,1,2\ldots)$ számok a \textbf{hatványsor együtthatói}. + \item $\boldsymbol{x_{0}}$ szám a hatványsor \textbf{középpontja} (centruma). + \item $\textbf{\emph{x}}$ a hatványsor \textbf{változója}. + \end{itemize} + +% \noindent Egy $\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ hatványsorra azt mondjuk, hogy +% \begin{itemize} +% \item \emph{konvergens}, ha $\Big|\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}\Big| < \infty$ valamely $x$ számokra. +% \item \emph{divergens}, ha $\Big|\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}\Big| = \infty$ valamely $x$ számokra. +% \item \emph{abszolút konvergens}, ha $\Big|\sum\limits_{n=0}^{\infty}|a_{n}(x-x_{0})^{n}|\Big| < \infty$ valamely $x$ számokra.\\ +% \end{itemize} + + \noindent A $\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ hatványsor + \begin{itemize} + \item konverges, ha $\left|\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}\right| < \infty$ valamely x értékekre + \item divergens, ha $\left|\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}\right| = \infty$ valamely x értékekre + \item abszolút konvergens, ha $\left|\sum\limits_{n=0}^{\infty}\big|a_{n}(x-x_{0})^{n}\big|\right| < \infty$ valamely x értékekre + \end{itemize} + + \noindent Egy hatványsor \textbf{konvergenciatartománya} alatt azt az $I \in \mathbb{R}$ intervallumot értjük, ahol $\sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ hatványsor konvergens minden $x \in I$ esetén.\\ + + \noindent \emph{Megjegyzés}: Az $I$ intervallum mindig egy az $x_{0}$ középpontra szimmetrikus tartomány, azaz $I = \Big(x_{0} - r,\ x_{0} + r\Big)$. Ezt az $r \in \mathbb{R}$ számot \textbf{konvergenciasugárnak} nevezzük. + + \[ + K_{r}(x_{0}) := \Big\{x \in \mathbb{R}\ \Big|\ \big|x-x_{0}\big| < r\Big\} + \] + + \noindent Az $r$ konvergenciasugarat a hányadoskritérium segítségével is megtalálhatjuk.\\ + Ez esetben a konvergenciasugár a következőképp számolható ki: + \[ + r = \lim\limits_{n \to \infty}^{}\Big|\ddfrac{a_{n}}{a_{n+1}}\Big| \qquad (\text{ha létezik}) + \] + + \noindent Példa: $\sum\limits_{n=0}^{\infty}3^{n} \cdot x^{n}$ konvergenciasugara.\\ + + \[ + \lim\limits_{}^{}\Big|\ddfrac{a_{n}}{a_{n+1}}\Big| = \ddfrac{3^{n}}{3^{n+1}} = \ddfrac{3^{n}}{3 \cdot 3^{n}} = \ddfrac{1}{3} = r + \] + + \noindent Mivel $x^n = (x - 0)^{n}$ szerepel, ezért a hatványsor középpontja 0.\\ + + \noindent Meg kell vizsgálni a konvergenciát a végpontokban is.\\ + + \noindent \textbf{Tétel} (Cauchy-Hadamard): Tekintsük az $r := \ddfrac{1}{\lim\limits_{n \to \infty}^{}\sqrt[n]{|a_{n}|}}$ értéket.\\ + + \noindent Amennyiben + \begin{enumerate} + \item $|x - x_{0}| < r \quad \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ \emph{abszolút konvergens}. + \item $|x - x_{0}| > r \quad \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ hatványsor \emph{divergens}. + \item $|x - x_{0}| = r \quad$ (nem mondható semmi a konvergenciáról) + \end{enumerate} + + \noindent A konvergenciaintervallum végpontjaiban, vagyis $x=r$ és $x=- r$ helyeken külön meg kell vizsgálni, hogy a hatványsor konvergens-e vagy sem.\\ + + \noindent \textbf{Tétel}. A hatványsor összegfüggvénye $f(x) = \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ folytonos. \\ + + \noindent \textbf{Tétel}. Ha a $\sum\limits_{n=0}^{\infty}a_{n}(x - x_{0})^{n}$ hatványsor konvergenciasugara $r > 0$, és összeg-függvénye $f(x)$, akkor minden $x \in (- r,r)$-re fennáll, hogy $f(x)$ tetszőlegesen sokszor differenciálható és a deriváltak a következők: + \[ + f'(x) =\sum\limits_{\boldsymbol{n=1}}^{\infty} a_{n}n(x - x_0)^{n-1} = \sum\limits_{\boldsymbol{n=0}}^{\infty}\boldsymbol{(n+1)} \cdot a_{n+1}(x-x_{0})^{n} + \] + \[ + \vdots + \] + \[ + f^{(k)}(x) = \sum\limits_{n=0}^{\infty}\boldsymbol{(n+k)} \cdot \boldsymbol{(n+k-1)} \cdot \ldots \cdot \boldsymbol{(n+1)} a_{n+k}(x-x_{0})^{n} = \sum\limits_{n=0}^{\infty} \ddfrac{(n+k)!}{n!} a_{n+k}(x-x_{0})^{n} + \] + +% \noindent \textbf{Tétel} (Abel-tétele): Tekintsük a ${\tiny \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}}$ hatványsort, melynek konvergencia sugara $0 < r < \infty$. Amennyiben a hatványsor valamely végpontjában konvergens, azaz +% \[ +% \Big|\sum\limits_{n=0}^{\infty}(-r-x_{0})^{n}\Big| < \infty\quad \text{vagy}\quad \Big|\sum\limits_{n=0}^{\infty}(r-x_{0})^{n}\Big| < \infty\ +% \] +% akkor az $f(x) = \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0})^{n}$ összefüggvény folytonosan kiterjed az adott végpontra is, formálisan: +% \[ +% \lim\limits_{x \to (-r-x_{0})+}^{}f(x) = \sum\limits_{n=0}^{\infty}(-r-x_{0})^{n}\quad \text{illetve}\quad \lim\limits_{x \to (r-x_{0})-}^{}f(x) = \sum\limits_{n=0}^{\infty}(r-x_{0})^{n} +% \] + + \subsection*{Analitikus függvények} + + \noindent Az $f$ függvény az $x_{0}$ pontban \emph{analitikus}, ha $x_{0}$ egy környezetében konvergens hatványsor összegeként áll elő, azaz $\exists r > 0$, hogy + \[ + f(x) = \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0}),\qquad \big(x \in K_{r}(x_{0})\big) + \] + + \noindent Az $f$ függvény egy $I$ intervallumon \emph{analitikus}, ha az intervallum minden pontjában az.\\ + + + \noindent \textbf{Tétel} (Hatványsor egyértelműsége): Ha $f$ \emph{analitikus} $x_{0}$-ban, azaz $\exists r > 0$, hogy $\forall x \in K_{r}(x_{0})$ esetén + \[ + f(x) = \sum\limits_{n=0}^{\infty}a_{n}(x-x_{0}),\ \text{akkor}\ a_{n} = \ddfrac{f^{(n)}(x_{0})}{n!} + \] + + \noindent Ez egyben azt is jelenti, hogy $x_{0}$-ban analitikus függvény egyértelműen fejthető $x_{0}$ középpontú hatványsorba, mégpedig + \[ + f(x) = \sum\limits_{n=0}^{\infty}\ddfrac{f^{(n)}(x_{0})}{n!}(x - x _{0})^{n},\quad x \in K_{r}(x_{0}) + \] + + \noindent \textbf{Következmény}. Minden hatványsor az összegfüggvényének Taylor sora. + + \subsection*{Taylor-polinomok, Taylor-sorok\\} + + \noindent Legyen az $f$ függvény értelmezési tartománya egy $I \subseteq \mathbb{R}$ intervallum és $x_{0}$ az $I$ belső pontja.\\ + Valamint legyen $t_{n}(x)$ olyan $n$-ed fokú polinom, hogy $t^{(k)}(x_{0}) = f^{(k)}(x_{0})$, ahol $k = 0, 1, 2, \ldots, n$.\\ + + \noindent Ekkor az $f(x)$ függvény $x_{0}$ központú + \begin{itemize} + \item \textbf{Taylor-sora}: + \[ + T_{x_0}(f,x) := \sum\limits_{k=0}^{\infty}\underbrace{\ddfrac{f^{(k)}(x_{0})}{k!}}_{a_n} \cdot (x - x_{0})^{k}, + \] + ahol az $f \in D^{\infty}[x_0]$.\\ \\ + Az $x_{0} = 0$ középpontú speciális Taylor-sort \emph{Maclaurin}-sornak nevezzük. Jelölése: $M(x)$. + \item \textbf{$\textbf{n}$-ed fokú Taylor-polinomja}: + \[ + T_{x_0,n}(f,x) := t_{n}(x) = \sum\limits_{k=0}^{n}\ddfrac{f^{(k)}(x_{0})}{k!} \cdot (x - x_{0})^{k}, + \] + ahol az $f \in D^{(n)}[x_0]$. + \end{itemize} + + \subsubsection*{Maradéktagok\\} + + A függvény és az azt approximáló $n$-ed fokú Taylor-polinom különbségét megadó függvényt \textbf{maradéktagnak} nevezzük. + \[ + f(x) - t_{n}(x) = r_{n}(x) + \] + + \noindent \emph{Megjegyzés}: A Taylor-sor és a függvény eltérése épp az $r_{n}$ függvénysorozat határfüggvénye.\\ + + \noindent \textbf{Lagrange-féle maradéktag}: $\xi = x_0 + \alpha(x-x_0) \quad 0 < \alpha < 1$ + \[ + r_{n}^{(L)} = \ddfrac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_{0})^{n+1} + \] +\newpage + + \noindent A Lagrange-féle maradéktag alapján az approximációs hibára a következő korlát adódik:\\ + + \noindent Az $f^{(n+1)}(\xi)$ felülről becsülhető az (n+1)-edik derivált abszolútértékének maximumával.\\ + Ez az érték legyen \textbf{M}.\\ + + \noindent Az $\ddfrac{(x-x_{0})^{n+1}}{(n+1)!}$ pedig majorálható a $\ddfrac{|x-x_{0}|^{n+1}}{(n+1)!}$-sal.\\ + + \noindent Tehát az $n$-ed fokú Taylor-polinom maximális eltérése az $f$ függvénytől az $x$ helyen: + \[ + \Big|r_{n}\Big| = \Big|f(x)-t_{n}(x)\Big| \leq M \cdot \ddfrac{(x-x_{0})^{n+1}}{(n+1)!} + \] + + \noindent \textbf{Következmény}. Ha $\lim\limits_{n \to \infty}r_{n} = 0$, akkor a $t_{n}(x)$ függvény konvergens, és $t_{n}(x) \to f(x)$, így a Taylor-sor előállítja az $f(x)$ függvényt. + + \subsection*{Néhány ismert függvény Taylor-sora, azaz hatványsora\\} + + \noindent Ha egy függvény előáll egy hatványsor összegeként, akkor az csak a függvény Taylor-sora lehet, mert ha egy $f(x)$ függvény hatványsorba fejthető, akkor abból az következik, hogy akárhányszor differenciálható.\\ + Továbbá a hatványsor $n$-edik együtthatója $a_n$ a következő alakban áll elő: + \[ + a_{n} = \ddfrac{f^{(n)}(x_{0})}{n!} + \] + Ez pedig a Taylor-sor definíciója szerint azt jelenti, hogy az $f(x)$ függvényt előállító hatványsor nem más, mint az $f(x)$ Taylor-sora.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.48\linewidth]{img/taylor_sinx_1_3_5_7.png} + \includegraphics[width=0.48\linewidth]{img/taylor_sinx_51_57.png} + \caption{Példa 1., 3., 5. és 7. és az 51. és 57. Taylor polinom.} + \label{fig:newton_pelda} + \end{figure} + +\newpage + \noindent \textbf{${e^{x}}$ hatványsora és konvergencia tartománya}\\ + + \noindent Írjuk fel a $e^{x}$ deriváltjait: + \[ + (e^{x})' = (e^{x})'' = \ldots = (e^{x})^{(n)} = e^{x} + \] + + \noindent Ezeket behelyettesítve az $M(x) = \sum\limits_{n=0}^{\infty}\ddfrac{f^{(n)}(0)}{n!} \cdot x^{n}$ képletbe + \[ + M(x) = 1 + x + \ddfrac{x^2}{2} + \ldots = \sum\limits_{n=0}^{\infty}\ddfrac{x^{n}}{n!} + \] + + \noindent Ezután azt kell megvizsgálni, hogy az így kapott sor konvergál-e az adott függvényhez. A Lagrange-féle maradéktag szerint az $e^{x}$ függvény és a most kapott hatványsor eltérése egy rögzített $x$ helyen: + \[ + r_{n}(x) \leq e^{x} \cdot \ddfrac{x^{n+1}}{(n+1)!} + \] + + \noindent A rögzített $x$ miatt $e^{x}$ egy véges szám, az $\ddfrac{x^{n+1}}{(n+1)!}$ pedig tart 0-hoz, amíg $n$ tart végtelenhez. Ez bármely $x$ valós szám esetén teljesül, tehát a hatványsor az egész számegyenesen konvergál az $e^{x}$ függvényhez.\\ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-5.0,xmax=5.0,ymin=0.0,ymax=5.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-5,0,5,8}, + ytick={0,1,5}, + extra x ticks={0}, + tick label style={font=\small}] + \addplot[no marks,domain=-4.96:4.95,samples=50,smooth,line width=2pt,blue] {exp(x)}; + \end{axis} + \end{tikzpicture} + \end{center} +\newpage + \noindent \textbf{$\sin(x)$ hatványsora és konvergencia tartománya}\\ + + \noindent Írjuk fel a $\sin x$ deriváltjait: + + \begin{center} + $(\sin x)' = \cos x$\\ + $(\sin x)'' = -\sin x$\\ + $(\sin x)''' = -\cos x$\\ + $(\sin x)^{(4)} = \sin x$\\ + $\cdots$ + \end{center} + + \noindent Ezeket behelyettesítve az $M(x) = \sum\limits_{n=0}^{\infty}\ddfrac{f^{(n)}(0)}{n!} \cdot x^{n}$ képletbe + \begin{spacing}{2} + \begin{center} + $M(x) = $\\ + $\ddfrac{f(0)}{0!} + \ddfrac{f'(0)}{1!} + \ddfrac{f''(0)}{2!} + \ddfrac{f'''(0)}{3!} + \ddfrac{f^{(4)}(0)}{4!} + \ddfrac{f^{(5)}(0)}{5!} + \ldots =$\\ + $\ddfrac{\sin(0)}{0!} + \ddfrac{\cos(0)}{1!} + \ddfrac{-\sin(0)}{2!} + \ddfrac{-\cos(0)}{3!} + \ddfrac{\sin(0)}{4!} + \ddfrac{\cos(0)}{5!} + \ldots =$\\ + $\ddfrac{0}{0!} + \ddfrac{1}{1!}x + \ddfrac{0}{2!}x^{2} + \ddfrac{-1}{3!}x^{3} + \ddfrac{0}{4!}x^{4} + \ddfrac{1}{5!}x^{5} + \ldots =$ \\ + $x - \ddfrac{x^3}{3!} + \ddfrac{x^5}{5!} - \ddfrac{x^7}{7!} + \ddfrac{x^9}{9!} - \ldots = \sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n + 1}}{(2n + 1)!}$ + \end{center} + \end{spacing} + + \noindent A Lagrange-féle maradéktagból az approximációs hiba egy rögzített $x$ esetén: + \[ + r_{2n+1}(x) \leq M \cdot \ddfrac{x^{2n+1}}{(2n+1)!} + \] + + \noindent $M = max\Big\{\big|(sin x)^{(2n+1)}\big|\Big\} = 1$. Így $r_{n} \to 0$, ha $n \to \infty$.\\ + + \noindent Tehát a $\boldsymbol{\sin(x) = \sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n+1}}{(2n+1)!}}$ bármely $x \in \mathbb{R}$ esetén.\\ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2*pi,xmax=2*pi,ymin=-1.2,ymax=1.2, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-2*pi,-pi,0,pi,2*pi}, + xticklabels={$-2\pi$,$-\pi$,0,$\pi$,$2\pi$}, + ytick={-1,0,1}, + tick label style={font=\small}] + \addplot[no marks,domain=-2*pi:2*pi,samples=80,smooth,line width=2pt,blue]{sin(deg(x))}; + \end{axis} + \end{tikzpicture} + \end{center} +\newpage + \noindent \textbf{$\cos(x)$ hatványsora és konvergencia tartománya}\\ + + \noindent Írjuk fel a $\cos x$ deriváltjait: + + \begin{center} + $(\cos x)' = -\sin x$\\ + $(\cos x)'' = -\cos x$\\ + $(\cos x)''' = \sin x$\\ + $(\cos x)^{(4)} = \cos x$\\ + $\cdots$ + \end{center} + + \noindent Ezeket behelyettesítve az $M(x) = \sum\limits_{n=0}^{\infty}\ddfrac{f^{(n)}(0)}{n!} \cdot x^{n}$ képletbe + \begin{spacing}{2} + \begin{center} + $M(x) = $\\ + $\ddfrac{f(0)}{0!} + \ddfrac{f'(0)}{1!} + \ddfrac{f''(0)}{2!} + \ddfrac{f'''(0)}{3!} + \ddfrac{f^{(4)}(0)}{4!} + \ddfrac{f^{(5)}(0)}{5!} + \ldots =$\\ + $\ddfrac{\cos(0)}{0!} + \ddfrac{-\sin(0)}{1!} + \ddfrac{-\cos(0)}{2!} + \ddfrac{\sin(0)}{3!} + \ddfrac{\cos(0)}{4!} + \ddfrac{-\sin(0)}{5!} + \ldots =$\\ + $\ddfrac{1}{0!} + \ddfrac{0}{1!}x + \ddfrac{-1}{2!}x^{2} + \ddfrac{0}{3!}x^{3} + \ddfrac{1}{4!}x^{4} + \ddfrac{0}{5!}x^{5} + \ddfrac{-1}{6!}x^{6} + \ldots =$ \\ + $1 - \ddfrac{x^2}{2!} + \ddfrac{x^4}{4!} - \ddfrac{x^6}{6!} + \ldots = \sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n}}{(2n)!}$ + \end{center} + \end{spacing} + + \noindent A Lagrange-féle maradéktagból az approximációs hiba egy rögzített $x$ esetén: + \[ + r_{2n}(x) \leq M \cdot \ddfrac{x^{2n}}{(2n)!} + \] + + \noindent $M = max\Big\{\big|(cos x)^{(2n)}\big|\Big\} = 1$. Így $r_{n} \to 0$, ha $n \to \infty$.\\ + + \noindent Tehát a $\boldsymbol{\cos(x) = \sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n}}{(2n)!}}$ bármely $x \in \mathbb{R}$ esetén.\\ + + \noindent Más megközelítésben: $\cos x = (\sin x)'$. Így a $\cos x$ hatványsorához deriváljuk a $\sin x$ hatványsorát. + + \begin{spacing}{2} + \begin{center} + $M(x) = \Big(\sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n+1}}{(2n+1)!}\Big)' = \sum\limits_{n=0}^{\infty}\Big((-1)^{n}\ddfrac{x^{2n+1}}{(2n+1)!}\Big)' = $\\ + $\sum\limits_{n=0}^{\infty}\Big((-1)^{n}\ddfrac{(2n+1)x^{2n}}{(2n+1)(2n)!}\Big) = \sum\limits_{n=0}^{\infty}(-1)^{n}\ddfrac{x^{2n}}{(2n)!}$ + \end{center} + \end{spacing} + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2*pi,xmax=2*pi,ymin=-1.2,ymax=1.2, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-2*pi,-pi,0,pi,2*pi}, + xticklabels={$-2\pi$,$-\pi$,0,$\pi$,$2\pi$}, + ytick={-1,0,1}, + tick label style={font=\small}] + \addplot[no marks,domain=-2*pi:2*pi,samples=80,smooth,line width=2pt,blue]{cos(deg(x))}; + \end{axis} + \end{tikzpicture} + \end{center} +\newpage + \noindent \textbf{$\sinh(x)\ (sh(x))$ hatványsora és konvergencia tartománya}\\ + + \noindent Írjuk fel a $\sinh x$ deriváltjait: + + \begin{itemize} + \item $(\sinh x)^{(n)} = \cosh x$, ha $n$ páratlan, tehát $(\sinh 0)^{(2n+1)} = 1$ + \item $(\sinh x)^{(n)} = \sinh x$, ha $n$ páros, tehát $(\sinh 0)^{(2n)} = 0$ + \end{itemize} + + \noindent Így a hatványsor $\sinh x = \sum\limits_{n=0}^{\infty}\ddfrac{x^{2n+1}}{(2n+1)!}$\\ + + \noindent A Lagrange-féle maradéktagból az approximációs hiba egy rögzített $x$ esetén: + \[ + r_{2n+1}(x) \leq M \cdot \ddfrac{x^{2n+1}}{(2n+1)!} + \] + + \noindent $M = max\Big\{\big|(\sinh x)^{(2n)}\big|\Big\} = \cosh x = const$. Így $r_{n} \to 0$, ha $n \to \infty$.\\ + + \noindent Tehát a $\boldsymbol{\sinh(x) = \sum\limits_{n=0}^{\infty}\ddfrac{x^{2n+1}}{(2n+1)!}}$ bármely $x \in \mathbb{R}$ esetén.\\ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2*pi,xmax=2*pi,ymin=-180.0,ymax=180.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-2*pi,-pi,0,pi,2*pi}, + xticklabels={$-2\pi$,$-\pi$,0,$\pi$,$2\pi$}, + ytick={-180,-100,-50,0,50,100,180}, + tick label style={font=\small}] + \addplot[no marks,domain=-2*pi:2*pi,samples=50,smooth,line width=2pt,blue]{sinh(x)}; + \end{axis} + \end{tikzpicture} + \end{center} +\newpage + \noindent \textbf{$\cosh(x)\ (ch(x))$ hatványsora és konvergencia tartománya}\\ + + \noindent Írjuk fel a $\cosh x$ deriváltjait: + + \begin{itemize} + \item $(\cosh x)^{(n)} = \sinh x$, ha $n$ páratlan, tehát $(\cosh 0)^{(2n+1)} = 0$ + \item $(\cosh x)^{(n)} = \cosh x$, ha $n$ páros, tehát $(\cosh 0)^{(2n)} = 1$ + \end{itemize} + + \noindent Így a hatványsor $\cosh x = \sum\limits_{n=0}^{\infty}\ddfrac{x^{2n}}{(2n)!}$\\ + + \noindent A Lagrange-féle maradéktagból az approximációs hiba egy rögzített $x$ esetén: + \[ + r_{2n}(x) \leq M \cdot \ddfrac{x^{2n}}{(2n)!} + \] + + \noindent $M = max\Big\{\big|(\sinh x)^{(2n)}\big|\Big\} = \sinh x = const$. Így $r_{n} \to 0$, ha $n \to \infty$.\\ + + \noindent Tehát a $\boldsymbol{\cosh(x) = \sum\limits_{n=0}^{\infty}\ddfrac{x^{2n}}{(2n)!}}$ bármely $x \in \mathbb{R}$ esetén.\\ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2*pi,xmax=2*pi,ymin=0.0,ymax=200.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-2*pi,-pi,0,pi,2*pi}, + xticklabels={$-2\pi$,$-\pi$,0,$\pi$,$2\pi$}, + ytick={-200,-100,-150,-50,-10,0,10,50,100,150,200}, + tick label style={font=\small}] + \addplot[no marks,domain=-2*pi:2*pi,samples=50,smooth,line width=2pt,blue]{cosh(x)}; + \end{axis} + \end{tikzpicture} + \end{center} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.jpg new file mode 100644 index 0000000..c38d1d9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.png new file mode 100644 index 0000000..f3b6be9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.psd b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.psd new file mode 100644 index 0000000..9fb4461 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff.psd differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff_inv.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff_inv.png new file mode 100644 index 0000000..a8be8e5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/diff_inv.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/imderv.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/imderv.png new file mode 100644 index 0000000..25bd2fc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/imderv.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_sin.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_sin.png new file mode 100644 index 0000000..20e9652 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_sin.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x2.png new file mode 100644 index 0000000..1a25427 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x3.png new file mode 100644 index 0000000..7a1b253 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/inflexio_x3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_1.png new file mode 100644 index 0000000..51633d8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_100.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_100.png new file mode 100644 index 0000000..fd4c333 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_100.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_3.png new file mode 100644 index 0000000..009ee78 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_44.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_44.png new file mode 100644 index 0000000..25c85eb Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_44.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_7.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_7.png new file mode 100644 index 0000000..cdce5b0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_7.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_80.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_80.png new file mode 100644 index 0000000..4ddd316 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/interval_80.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.png new file mode 100644 index 0000000..f8f7a91 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.psd b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.psd new file mode 100644 index 0000000..dc9ee69 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex.psd differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex_2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex_2.png new file mode 100644 index 0000000..f62d942 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/konvex_2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.jpg new file mode 100644 index 0000000..c1400a5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.png new file mode 100644 index 0000000..686c1ca Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/lagrange.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/partial_derivatives.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/partial_derivatives.jpg new file mode 100644 index 0000000..50b1313 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/partial_derivatives.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/rolle.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/rolle.png new file mode 100644 index 0000000..9b4f6cb Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/img/rolle.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.pdf new file mode 100644 index 0000000..8ea60a6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.tex new file mode 100644 index 0000000..bda0229 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/02.Differenciál- és integrálszámítás/tetel2.tex @@ -0,0 +1,1722 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[magyar]{babel} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{bigints} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{fancybox} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{makecell} +\usepackage{pgfplots} +\usepackage{textcomp} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} +\DeclareMathOperator\arcsinh{arcsinh} +\DeclareMathOperator\arccosh{arccosh} +\DeclareMathOperator\sh{sinh} +\DeclareMathOperator\ch{cosh} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{2. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\tikzset{declare function={y(\x)=\x^2;}, + plot fill/.style={fill=white!75}, + plot/.style={draw=black!80, thick}, + bar/.style={fill=cyan, draw=white, thick}, + marking/.style={fill=cyan!50!black, draw=cyan!50!black}, + axis/.style={thick, draw=black!65, stealth-stealth} +} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + {\Large\bfseries\noindent 2. Differenciál- integrálszámítás} \\ + + \section*{Jacobi-mátrix, gradiens, parciális derivált} + + \subsection*{Parciális derivált} + + \noindent Legyen $f: \mathbb{R}^2 \to \mathbb{R}$ függvény. Tekintsük az értelmezési tartomány egy $a = (x, y) \in int D_f$ belső pontját. Fektessünk az $a$ ponton az $x$ tengellyel párhuzamos egyenest, ennek egy pontja + \[ + (x + t, y) \qquad t \in \mathbb{R} + \] + lesz, majd vegyük a függvény értékeit ezekben a pontokban: $f(x + t, y)$. \\ + + \noindent Ekkor egy $\phi: \mathbb{R} \to \mathbb{R},\ \phi(t) := f(x + t, y)$ függvényt értelmeztünk, a képe egy, a felületen futó görbe ($\ref{fig:imder}$. ábra). + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/imderv.png} + \caption{} + \label{fig:imder} + \end{figure} + + \noindent Azt mondjuk, hogy az $f$ függvény az $(x,y)$ pontban az első változó szerint parciálisan differenciálható, ha $\phi$ differenciálható a $t = 0$ pontban. Ha $\phi \in D[0]$, akkor az $f$ első változó szerinti parciális deriváltja az $(x,y)$ pontban legyen a $\phi'(0)$, azaz + \[ + \partial_{1}f(x,y) = \lim\limits_{t \to 0}\ddfrac{f(x + t, y) - f(x,y)}{t} + \] + lesz ez a parciális derivált.\\ + + \noindent Látható, hogy az első változó szerinti parciális deriválhatóság csak a felületi görbe simaságát jelenti a $t = 0$ pontban, és a $\boldsymbol{\partial_{1}f(x, y)}$ \emph{ennek a felületi görbének a meredekségét adja}. Az is leolvasható, hogy + \[ + \ddfrac{f(x + t, y) - f(x,y)}{t} \approx \partial_1 f(x,y),\quad \text{ha}\ t \approx 0 + \] + ami úgy is olvasható, hogy csupán az első tengely irányába kimozdulva az $(x, y)$ pontból + \[ + f(x + t, y) \approx f(x,y) + \partial_{1}f (x, y) \cdot t,\quad \text{ha}\ t \approx 0 + \] + Az előzőeknek megfelelően, ha az $(x, y)$ ponton át az $y$ tengellyel párhuzamos egyenest veszünk fel, akkor is kapunk egy $\psi : \mathbb{R} \to \mathbb{R},\ \psi := f(x, y + t)$ felületi görbét.\\ + + \noindent Ha $\psi \in D[0]$, akkor az $f$ második változója szerint parciálisan differenciálható az $(x, y)$ pontban, és + \[ + \partial_2 f(x, y) := \psi'(0) := \lim\limits_{t \to 0} \ddfrac{f(x, y + t) - f(x, y)}{t} + \] + lesz az $f$ második változó szerinti parciális deriváltja az $(x,y)$ pontban. Az előzőkhez hasonló a $\partial_2 f(x, y)$ jelentése is.\\ + + \noindent Gyakran használják még a $\partial_1 f(x, y)$ helyett a $\ddfrac{\partial{f}}{\partial{x}}(x, y),\ f'_{x}(x, y)$ és a $D_1 f(x, y)$ jelöléseket is. Ennek megfelelően a $\partial_2 f(x, y)$ helyett használt jelölések is.\\ + + \noindent Megfigyelhető, hogy az $f$ első változó szerinti parciális deriválhatóságánál a második koordináta, az $y$ nem változik, állandó marad. Ez indokolja, hogy ha egy tetszőleges $(x, y)$ pontban akarjuk például az + \[ + f(x,y) := x^2y^3 + 2x + y \qquad (x,y) \in \mathbb{R}^2 + \] + függvény első változó szerinti parciális deriváltját kiszámítani az $(x,y)$ pontban, akkor a deriválás során az $y$ konstansnak számít, tehát + \[ + \partial_1 f(x,y) = 2xy^3 + 2 + 0 \qquad (x,y) \in \mathbb{R}^2 + \] + Ugyanígy a második változó szerinti parciális deriválás során $x$ számít konstansnak tehát + \[ + \partial_2 f(x, y) = x^{2}3y^{2} + 1 \qquad (x,y) \in \mathbb{R}^2 + \] + + \paragraph*{Derivált mátrix} + + \noindent Most foglalkozzunk a differenciálhatóság fogalmának olyan kialakításával, amely valódi általánosítása a valós-valós függvény differenciálhatóságának.\\ + + \noindent Legyen $f: \mathbb{R}^2 \to \mathbb{R},\ (x,y) \in int D_f$. + + \noindent Azt mondjuk, hogy $f$ \textbf{\emph{differenciálható}} az $(x,y)$ pontban, ha van olyan $A_1, A_2 \in \mathbb{R}$ és olyan \\ + $\alpha: \mathbb{R}^2 \to \mathbb{R}$ függvény, hogy minden olyan\\ + $h = (h_1, h_2) \in \mathbb{R}^2$ vektorra, amelyre $(x + h_1, y + h_2) \in D_f$, teljesül, hogy + \[ + f(x + h_1, y + h_2) - f(x,y) = A_1h_1 + A_2h_2 + \alpha(h_1, h_2) + \] + és + \[ + \lim\limits_{h \to 0} \ddfrac{\alpha(h)}{\Vert h \Vert} = 0 + \] + + \noindent A $\lim\limits_{h \to 0} \ddfrac{\alpha(h)}{\Vert h\Vert} = 0$ az $\alpha(h)$ maradéktag "kicsiségére" utal. Nyilván $\lim\limits_{h \to 0} \alpha(h) = 0$ is igaz, de ha $\alpha(h)$ értékeit elosztjuk a $\Vert h\Vert \approx 0$ kicsi számmal, akkor ezzel "felnagyítjuk" az $\alpha(h)$ értékeit, így ha még ez a hányados is $0$-hoz tart, akkor $\alpha(h)$ igazán "kicsi".\\ + + \noindent Amikor a $h := (h_1, 0)$ alakú, akkor átrendezés és határértékképzés után + \[ + \lim\limits_{h_1 \to 0} \ddfrac{f(x + h_1, y) - f(x ,y)}{h_1} = \lim\limits_{h_1 \to 0}\left(A_1 + \ddfrac{\alpha(h_1, 0)}{|h_1|} \right) = A_1 + \] + amely azt jelenti, hogy ha $f$ differenciálható az $(x, y)$ pontban, akkor $A_1$ csak $\partial_1 f(x, y)$ lehet.\\ + + \noindent A $h := (0, h_2)$ alakú vektorokra pedig az adódnak, hogy $A_2$ csak $\partial_2 f(x, y)$ lehet. Így ha $f$ differenciálható az $(x, y)$ pontban, akkor a függvény $f(x + h_1, y + h_2) - f(x, y)$ megváltozása jól közelíthető a + \[ + \partial_1 f(x, y)h_1 + \partial_2 f(x, y)h_2 + \] + "lineáris" függvénnyel, sőt az elkövetett hiba, az $\alpha(h_1, h_2)$ elhanyagolhatóan kicsi: még a felnagyított $\ddfrac{\alpha(h)}{\Vert h\Vert}$ hányados is 0-hoz közeli, ha $\Vert h \Vert$ kicsi.\\ + + \paragraph*{Differenciálhatóság $\mathbb{R}^2 \to \mathbb{R}$} + + \noindent Mátrixokat felhasználva az $f$ differenciálhatósága azt jelenti, hogy van olyan $\alpha: \mathbb{R}^2 \to \mathbb{R}$ függvény, hogy + \[ + f(x + h_1, y + h_2) - f(x, y) = \Big[\partial_1 f(x,y)\ \partial_2 f(x, y)\Big]\left[\begin{array}{c} h_1 \\ h_2 \end{array}\right] + \alpha(h_1, h_2) + \] + és + \[ + \lim\limits_{h \to 0} \ddfrac{\alpha(h)}{\Vert h \Vert} = 0 + \] + + \noindent Az $f$ differenciálhatóságát az $(x,y) \in int D_f$ pontban jelölje $f \in D[(x,y)]$, és az $f$ deriváltja ebben a pontban + \[ + f'(x,y) := \Big[\partial_1 f(x,y)\ \partial_2 f(x, y)\Big] \in \mathbb{R}^{1 \times 2} + \] + + \noindent Ha $f \in D[(x,y)]$, akkor $f \in \mathcal{C}[(x,y)]$.\\ + + \paragraph*{Differenciálhatóság $\mathbb{R}^n \to \mathbb{R}$} + + \noindent A kétváltozós függvényre kialakított fogalmakat minden nehézség nélkül általánosíthatjuk a sokváltozós függvényekre is. + \noindent Legyen $f: \mathbb{R}^{n} \to \mathbb{R},\ x = \Big(x_1, x_2, \ldots, x_i, \ldots, x_n\Big) \in int D_f$. + \[ + \partial_{i} f(x) := \lim\limits_{t \to 0}\ddfrac{f(x_1, x_2, \ldots, x_{i} + t, \ldots, x_n) - f(x_1, x_2, \ldots, x_i, \ldots, x_n)}{t} + \] + az $f$ $i$-edik változó szerinti parciális deriváltja.\\ + + \noindent Az $f: \mathbb{R}^{n} \to \mathbb{R}$ függvényt az $x \in int D_f$ pontban \emph{differenciálható}nak nevezzük, ha létezik olyan + \[ + A := \Big[A_1\ \ A_2\ \ \ldots\ \ A_n\Big] \in \mathbb{R}^{1 \times n} + \] + és létezik olyan $\alpha:\mathbb{R}^{n} \to \mathbb{R}$ függvény, hogy minden $h \in \mathbb{R}^{n}$ vektorra + \[ + f(x + h) - f(x) = Ah + \alpha(h),\ \text{ahol}\ \lim\limits_{h \to 0} \ddfrac{\alpha(h)}{\Vert h \Vert} = 0 + \] + Itt is igaz, hogy $A_i = \partial_i f(x),\ i = 1, 2, \ldots, n$. Ha $f \in D[x]$, akkor + \[ + f'(x) = \Big[\partial_1 f(x)\ \ \partial_2 f(x)\ \ \ldots\ \ \partial_n f(x)\Big] + \] + + \paragraph*{Differenciálhatóság $\mathbb{R}^n \to \mathbb{R}^k$} + + \noindent Legyen $f:\mathbb{R}^n \to \mathbb{R}^k,\ x \in \int D_f$. Az $f$ függvény differenciálható az $x$ pontban, ha létezik olyan $A \in \mathbb{R}^{k \times n}$, és van olyan $\alpha: \mathbb{R}^{n} \to \mathbb{R}^{k}$ függvény, hogy minden $h \in \mathbb{R}^n$ esetén + \[ + f(x + h) - f(x) = Ah + \alpha(h),\ \text{ahol}\ \lim\limits_{h \to 0} \ddfrac{\alpha(h)}{\Vert h \Vert} = 0 + \] + Most $A_{ij} = \partial_{j}f_i(x)$, és így + \[ + f'(x) = \left[ + \begin{array}{cccc} + \partial_1f_1(x) & \partial_2f_1(x) & \ldots & \partial_nf_1(x) \\ + \partial_1f_2(x) & \partial_2f_2(x) & \ldots & \partial_nf_2(x) \\ + \vdots & \ldots & \ddots & \vdots \\ + \partial_1f_k(x) & \partial_2f_k(x) & \ldots & \partial_nf_k(x) \\ + \end{array} + \right] \in \mathbb{R}^{k \times n} + \] + az $f$ deriváltja az $x$ pontban, ezért \textbf{\emph{Jacobi-mátrix}}nak is nevezik.\\ + + \paragraph*{Grádiens} + + \noindent k = 1 esetén $f:\mathbb{R}^n \to \mathbb{R}$ az $f'(a) \in \mathbb{R}^{1 \times n}$ sormátrix helyett a $grad f(a) := \big(f'(a)\big)^{T}$ vektort használják, azaz + \[ + grad f(a) = \left[ + \begin{array}{c} + \partial_1 f(a) \\ + \partial_2 f(a) \\ + \vdots \\ + \partial_n f(a) \\ + \end{array} + \right] + \] + + \noindent Tehát ebben az esetben az $f'(a)$ Jacobi-mátrix tekinthető egy $\R^n$-beli vektornak, amit az $f$ függvény $a$-beli \textbf{\emph{gradiensének}} nevezünk. \\ + + \noindent Ha $ D := \Big\{a \in D_f : f\in D[a] \Big\} $, akkor az + \begin{align*} + x \mapsto \textrm{grad}f(x) \in \R^n \quad (x \in D) + \end{align*} + függvényt az $f$ függvény \textbf{\emph{gradiens}}ének nevezzük, és grad$f \in \R^n \rightarrow \R^n$ jelöljük.\\ + + \paragraph*{Gradiens mint Jacobi-mátrix sora} + + \noindent Legyen $1 \leq n, m \in \mathbb{N}$. Az $f = \big(f_1, \ldots, f_m\big) \in \R^n \rightarrow \R^m$ függvény akkor és csak akkor differenciálható az $ a \in intD_f$ helyen, ha minden $ i = 1, \ldots, m $ esetén az $f_i \in \R^n \rightarrow \R$ koordináta-függvény differenciálható az $a$-ban.\\ + + \noindent Ha $f\in D[a]$, akkor az $f'(a)$ Jacobi-mátrix a következő alakú: + \begin{align*} + f'(a) = + \begin{bmatrix} + \textrm{grad}f_{1}(a) \\ + \textrm{grad}f_{2}(a) \\ + \vdots \\ + \textrm{grad}f_{m}(a) \\ + \end{bmatrix} + \end{align*} +\newpage + + \paragraph*{Differenciálhatóság és parciális differenciálhatóság} + \begin{itemize} + \item Differenciálhatóság $\Rightarrow$ parciális differenciálhatóság \\ + $ 1 \leq n \in \mathbb{N}, \ h : \R^n \rightarrow \R, $ és $h\in D[a] \ (a \in D_h) $ \\ + $\Rightarrow \forall i = 1,\ldots,n$ : a $h$ függvény $i$-edik változó szerint parciálisan differenciálható az $a$ pontban, és + \begin{align*} + \textrm{grad} h(a) = \big(\partial_1h(a), \ldots, \partial_nh(a)\big) + \end{align*} + + \item Differenciálhatóság $\Leftarrow$ parciális differenciálhatóság \\ + + \noindent \textbf{Tétel}. Ha $f:\mathbb{R}^{n} \to \mathbb{R}^{k}$ és $\exists K(x) \subset D_f$, hogy + \[ + \forall i = 1, \ldots, n\ \text{és}\ \forall j = 1, \ldots, k\ \text{esetén}\ \partial_i f_j \in \mathcal{C}\big[K(x)\big] \Rightarrow f \in D[x] + \] + \end{itemize} + + +% \subsection*{Jacobi-mátrix, gradiens} +% \begin{description} +% \item[Differenciálhatóság] \hfill \\ +% $ 1 \leq n, m \in \mathbb{N}, \quad 1 \leq p,q \leq +\infty,$ + +% $ (\R^n, \lVert . \rVert_p)$ és $ (\R^m, \lVert . \rVert_q)$ normált terek + +% $ f \in \R^n \rightarrow \R^m, \ a \in intD_f $ +% +% Az $f$ függvény differenciálható az $a$ pontban ($ f\in D[a]$) , ha\\ +% létezik olyan $ L \in L(\R^n, \R^m)$ korlátos lineáris leképezés és olyan $ \eta \in \R^n \rightarrow \R^m $ függvény, hogy : +% \begin{align*} +% f(a+h)-f(a) = L(h)+\eta(h)\cdot \lVert h\rVert_p \quad ( h \in \R^n, a+h \in D_f) +% \end{align*} +% ahol +% \begin{align*} +% \eta(h) \longrightarrow 0 \quad (\lVert h\rVert_p \rightarrow 0) +% \end{align*} +% +% Más szóval: +% +% \[ \dfrac{f(a+h)-f(a)-L(h)}{\lVert h\rVert_p} \longrightarrow 0 \quad (\lVert h\rVert_p \rightarrow 0)\] +% \\\\ +% Amennyiben $\forall a\in intD_f : f\in D[a] $, akkor az $f$ differenciálható ($f \in D$) +% \\\\ +% \textit{ +% Megjegyzés:\\ +% A $ \mathbb{K}$ test feletti $ (X, \lVert.\rVert_\bigstar )$, $ (X, \lVert.\rVert_\heartsuit )$ normált terek közötti folytonos leképezés, korlátos lineáris leképezés, ha +% \begin{itemize} +% \item lineáris, azaz +% \begin{align*} +% f(x+\lambda y) = f(x) + \lambda f(y) \quad (x,y \in X, \lambda \in \mathbb{K}) +% \end{align*} +% \item korlátos, azaz +% \begin{align*} +% \exists M \geq 0 : \lVert f(x) \rVert_\heartsuit \leq M\lVert x \rVert_\bigstar \quad (x \in X) +% \end{align*} +% \end{itemize} +% } +% \item[Derivált] \hfill \\ +% $f\in\R^n\rightarrow\R^m $ függvény differenciálható egy $a\in intD_f$ pontban \\ +% $ \Rightarrow \exists! L\in L(\R^n,\R^m)$ korlátos lineáris leképezés + +% Ezt az egyértelműen létező $L \in L(\R^n,\R^m) $ korlátos lineáris leképezést az $f$ függvény $a$ pontbeli deriváltjának nevezzük, és $f'(a)$ szimbólummal % jelöljük. +% \item[Jacobi-mátrix] \hfill \\ +% Az előzőekben szereplő $L := f'(a) $ korlátos lineáris leképezéshez $ \exists!A\in\R^{m\times n}$ mátrix, melyre: +% \begin{align*} +% L(x) = Ax \quad (x\in\R^n) +% \end{align*} +% Ezért: +% $ f'(a) := A $\\ +% az $f$ függvény $a$-beli deriváltja vagy derivált mátrixa, más néven Jacobi-mátrixa. +% \item[Gradiens] \hfill \\ +% $m = 1$ esetén : $ f \in \R^n \rightarrow \R $ +% \begin{align*} +% \textrm{grad}f(a) := f'(a) \in \R^{1\times n} \approx \R^n +% \end{align*} +% \item[Gradiens mint Jacobi-mátrix sora] \hfill \\ +% Legyen $1 \leq n, m \in \mathbb{N}$. Az $f = (f_1, \ldots, f_m) \in \R^n \rightarrow \R^m$ függvény akkor és csak akkor differenciálható az $ a \in intD_f$ helyen, ha minden $ i = 1, \ldots, m $ esetén az +% $f_i \in \R^n \rightarrow \R$ koordináta-függvény differenciálható az $a$-ban. + +% Ha $f\in D[a]$, akkor az $f'(a)$ Jacobi-mátrix a következő alakú: +% \begin{align*} +% f'(a) = +% \begin{bmatrix} +% \textrm{grad}f_{1}(a) \\ +% \textrm{grad}f_{2}(a) \\ +% \vdots \\ +% \textrm{grad}f_{m}(a) \\ +% \end{bmatrix} +% \end{align*} +% \end{description} +% \subsection*{Parciális derivált} +% \begin{description} +% \item[Definíció] \hfill \\ +% Tekintsük a $ h \in \R^n \rightarrow \R $ függvényt és az $a = (a_1, \ldots , a_n) \in D_h $ vektort. Legyen +% \begin{align*} +% D_{h,i}^{(a)} := \Big\{t \in \R : (a_1, \ldots, a_{i-1}, t, a_{i+1}, \ldots, a_n) \in D_h\Big\} \quad (i = 1,\ldots,n) +% \end{align*} +% És legyen: +% \begin{align*} +% h_{a,i} : D_{h,i}^{(a)} \rightarrow \R, \quad \textrm{ melyre: } \quad h_{a,i}(t) := h(a_1, \ldots, a_{i-1}, t, a_{i+1}, \ldots, a_n) \quad (t\in D_{h,i}^{(a)} ) +% \end{align*} +% A $h_{a,i}$ parciális függvények mind egyváltozós valós függvények ($h_{a,i} \in \R \rightarrow\R $) + +% A $ h $ függvény az $a$-ban $i$-edig változó szerint parciálisan deriválható, ha $ h_{a,i} \in D\Big\{a_i\Big\} $. Ekkor: +% \begin{align*} +% \partial_ih(a) := h'_{a,i}(a_i) +% \end{align*} +% valós számot a $h$ függvény $a$-beli, $i$-edik változó szerinti parcális deriváltjának nevezzük. +% \item[Parciális derivált függvény] \hfill \\ +% Tegyük fel, hogy az előző $h$ függvényre: +% \begin{align*} +% D_{h,i} := \Big\{a \in D_h : \textrm{létezik a } \partial_ih(a) \textrm{parciáis derivált}\Big\} \neq \emptyset \qquad (i=1,\ldots,n) +% \end{align*} +% Ekkor a +% \begin{align*} +% x \mapsto \partial_ih(x) \quad (x\in D_{h,i}) +% \end{align*} +% függvényt a $h$ függvény $i$-edik változó szerinti parciális deriváltfüggvényének nevezzük, és a $\partial_ih$ szimbólummal jelöljük. +% \item[Differenciálhatóság és parciális differenciálhatóság] \hfill +% \begin{itemize} +% \item Differenciálhatóság $\Rightarrow$ parciális differenciálhatóság \\ +% $ 1 \leq n \in \mathbb{N}, \ h \in \R^n \rightarrow \R, $ és $h\in D\{a\} \ (a \in D_h) $ \\ +% $\Rightarrow \forall i = 1,\ldots,n$ : a $h$ függvény $i$-edik változó szerint parciálisan differenciálható az $a$ pontban, és +% \begin{align*} +% \textrm{grad}h(a) = (\partial_1h(a), \ldots, \partial_nh(a)) +% \end{align*} + +% \item Differenciálhatóság $\Leftarrow$ parciális differenciálhatóság \\ +% $ 1 \leq n \in \mathbb{N}, \ h \in \R^n \rightarrow \R, $ és $ a \in intD_h $ \\ +% Valamilyen $i = 1,\ldots,n$ esetén: +% \begin{itemize} +% \item Tetszőleges $ x \in K_r(a) $ ($r > 0$ alkalmas) helyen léteznek a $ \partial_jh(x)$ parciális deriváltak $ (i \neq j = 1,\ldots,n)$ és ezek folytonosak +% \item $\exists \ \partial_ih(a)$ parciális derivált +% \end{itemize} +% $\Rightarrow h\in D(a)$ +% \end{itemize} +% \end{description} + + + \section*{Differenciálhatóság} + + \noindent A differenciálhatóság a függvény simaságát jelenti. A differenciálható függvény folytonos, és nincs rajta törés, csúcs. A derivált lényegében annak a mértéke, hogy egy egyváltozós valós függvény görbéjéhez rajzolt érintője milyen meredek.\\ + {\small + \noindent A deriváltból következtethetünk a függvény + \begin{itemize} + \item menetére (azaz, hogy monoton növekvő vagy monoton fogyó-e), + \item szélsőértékeire (lehet-e az adott pontban maximuma vagy minimuma), + \item grafikonjának görbületére (konvex vagy konkáv-e a függvénygörbe) + \item a növekedés mértékére (gyorsan változik-e a függvény vagy lassan) + \item a függvény közelítő értékére, lineárissal történő közelíthetőségére. + \end{itemize} + } + \ \\ + + \noindent \textbf{Definíció}. Legyen $A \subset \mathbb{R},\ a \in A$. Azt mondjuk, hogy $a$ \textbf{\emph{belső pontja}} az $A$ halmaznak, ha $\exists K(a)$, hogy $K(a) \subset A$. Jelölése: $int D_f$\\ + + \noindent Példa:\\ + $A = [0,1]$, akkor $int A = (0,1)$. $A = (5,6]$, akkor $int A = (5,6)$. $A = \{2,3,4\}$, akkor $int A = \emptyset$.\\ + + \noindent Az $f \in \mathbb{R} \to \mathbb{R}$ függvény az $a \in int \mathcal{D}_f$ pontban \textbf{\emph{differenciálható}}, ha + \[ + \exists\ \text{és véges a}\ \lim\limits_{h \to 0} \ddfrac{f(a + h)-f(a)}{h}\ \text{határérték.} + \] + + \noindent Ezt a határértéket az $f'(a)$ szimbólummal jelöljük, és az $f$ függvény $a$ pontbeli deriváltjának (vagy differenciálhányadosának) nevezzük, azaz + + \[ + f'(a) = \lim\limits_{h \to 0} \ddfrac{f(a + h)-f(a)}{h}\quad \underset{(x = a + h)}{\equiv}\quad \lim\limits_{x \to a} \ddfrac{f(x) - f(a)}{x-a} = L \in \mathbb{R} + \] + + \noindent Az $f'(a) = L \in \mathbb{R}$ számot az $f$ függvény $a$ pontbeli \textbf{\emph{differenciálhányados}}ának nevezzük.\\ + + \noindent Ha az $f$ függvény differenciálható az $a$ pontban, akkor ezt $f \in D[a]$ vagy $f \in D\{a\}$-val jelöljük.\\ + + \noindent \textbf{Tétel}. Ha $\boldsymbol{f \in D[a] \Rightarrow f \in C[a]}$. Fordítva nem igaz!\\ + + \noindent A tétel azt mondja ki, hogy az $a$ pontbeli folytonosság a függvény $a$ pontbeli differenciálhatóságának szükséges feltétele.\\ + + \noindent \textbf{Elemi függvények deriváltja} + \begin{center} + \renewcommand{\arraystretch}{1.5} + + $\begin{array}{l|l} + (e^x)' = e^{x} & f'(x) = 0\ (x \in \mathbb{R}) \\ \hline + (x^{n})' = n \cdot x^{n-1},\ \text{ha}\ n \in \mathbb{Z}^{+} & (a^{x})' = a^{x} \cdot \ln a,\ \text{a}\ a > 0 \\ \hline + (\sin x)'= \cos x & (\cos x)'= -\sin x \\ \hline + (\sinh x)' = \cosh x & (\cosh x)' = \sinh x \\ \hline + (\ln x)' = \ddfrac{1}{x},\ \text{ha}\ x > 0 & \log_{a}x = \ddfrac{1}{x} \ddfrac{1}{\ln a} \\ \hline + (\arctan x)' = \ddfrac{1}{1 + x^2} & (\arcsin x)' = \ddfrac{1}{\sqrt{1 - x^2}} \\ \hline + (\arccos x)' = -\ddfrac{1}{\sqrt{1 - x^2}} & (\sqrt{x})' = \ddfrac{1}{2\sqrt{x}}\ \big(x \in (0, +\infty)\big) \\ + \end{array}$ + \renewcommand{\arraystretch}{1} + \end{center} + + \noindent \emph{Geometriai megközelítés}: Legyen $f \in D[a]$. A koordináta rendszer $(a, f(a))$ és egy tőle különböző $(x, f(x))$ pontjain át húzunk egy egyenest (szelőt). Az egyenes meredeksége (iránytangense) + \[ + \ddfrac{f(x) - f(a)}{x - a} (=\Delta_f(a)) + \] + + \noindent Ha $x$ tart az $a$-hoz, akkor a szelők tartanak egy határértékhez, amit érintőnek neveznek, így a szelők meredeksége is tart az érintő meredekségéhez.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/diff.jpg} + \label{diff} + \end{figure} + + \noindent \textbf{Definíció.} \emph{Érintő egyenes}: Ha az $f$ függvény értelmezve az $a$ pont egy környezetében és létezik és véges a + \[ + m = \lim\limits_{h \to 0}\ddfrac{f(a+h) - f(a)}{h} + \] + akkor az $m$ meredekségű az $\big(a, f(a)\big)$ ponton átmenő egyenest az $f$ függvény $a$ pontbeli \textbf{\emph{érintő}}jének nevezzük. Az érintő egyenlete tehát + \[ + y = m \cdot (x-a) + f(a) + \] + + \paragraph*{Deriválási szabályok} + + \noindent Legyen $f$ és $g \in D[a]$, és $\lambda \in \mathbb{R}$ tetszőleges, ekkor + \begin{itemize} + \item $\lambda \cdot f \in D[a]$ és $(\lambda \cdot f)'(a) = \lambda \cdot f'(a)$ + \item $f + g \in D[a]$ és $(f + g)'(a) = f'(a) + g'(a)$ + \item $f \cdot g \in D[a]$ és $(f \cdot g)'(a) = f'(a) \cdot g(a) + f(a) \cdot g'(a)$ + \item $\ddfrac{1}{g(a)} \in D[a]$, ha $g(a) \neq 0$ és $(\ddfrac{1}{g})'(a) = -\ddfrac{g'(a)}{g^{2}(a)}$ + \item $\ddfrac{f}{g} \in D[a]$ és $\big(\ddfrac{f}{g}\big)'(a) = \ddfrac{f'(a) \cdot g(a) + f(a) \cdot g'(a)}{g^2}$, ha $g(a) \neq 0$ + \end{itemize} + + \noindent \textbf{Definíció.} (\emph{Láncszabály}). Ha $g \in D[x]$ és $f \in D[g(x)]$, akkor az $f \circ g \in D[x]$ és + \[ + (f \circ g)'(x) = (f' \circ g)(x) \cdot g'(x) \Leftrightarrow f\big(g(x)\big)' = f'\big(g(x)\big)g'(x) + \] + + \noindent \textbf{Definíció.} (\emph{Inverz függvény deriváltja}). Legyen $f:I \to \mathbb{R},\ I \subset \mathbb{R}$ szigorúan monoton és folytonos függvény. Legyen $a \in I,\ f \in D[a],\ f'(a) \neq 0$.\\ + Ekkor $b := f(a)$ pontban $f^{-1} \in D[a]$ és + \[ + (f^{-1})'(b) = \ddfrac{1}{f'(a)} = \ddfrac{1}{f'\big(f^{-1}(b)\big)} + \] + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/diff_inv.png} + \label{diff} + \end{figure} +\newpage + \section*{Szélsőérték, függvényvizsgálat} + + \subsection*{Szélsőérték} + $ f \in \R \rightarrow \R, a \in \mathcal{D}_f$ + \begin{itemize} + \item \noindent $f$-nek $a$-ban \textbf{\emph{lokális maximuma}} van, ha alkalmas $ r > 0$ mellett: + \[ f(x) \leq f(a) \qquad (x\in K_{r}(a) \subset \mathcal{D}_f)\] + \item \noindent $f$-nek $a$-ban \textbf{\emph{lokális minimuma}} van, ha alkalmas $ r > 0$ mellett: + \[ f(x) \geq f(a) \qquad (x\in K_{r}(a) \subset \mathcal{D}_f)\] + \item \noindent $f$-nek $a$-ban \textbf{\emph{abszolút maximuma}} van, ha: + \[ f(x) \leq f(a) \qquad (x\in \mathcal{D}_f)\] + \item \noindent $f$-nek $a$-ban \textbf{\emph{abszolút minumuma}} van, ha: + \[ f(x) \geq f(a) \qquad (x\in \mathcal{D}_f)\] + \end{itemize} + \paragraph*{Lokális szélsőérték} + $f$-nek $a$-ban lokális szélsőértéke van, ha $a$-ban lokális minimuma vagy maximuma van. + \paragraph*{Abszolút szélsőérték} + $f$-nek $a$-ban abszolút szélsőértéke van, ha $a$-ban abszolút minimuma vagy maximuma van. + \paragraph*{Elsőrendű szükséges feltétel (lokális szélsőértékre)} + $f \in \R \rightarrow \R$ függvénynek $ a \in int\mathcal{D}_f $ helyen lokális szélsőértéke van, és $ f\in D[a]$ \\ + $ \Rightarrow f'\{a\} = 0 $ + + \noindent Az tétel segítségével már nem nehéz belátni a differenciálható függvények vizsgálata szempontjából alapvető fontosságú ún. középérték-tételeket + + \paragraph*{Rolle-tétel} + Legyen $a,b \in \R \ (a 0}\ \ (a, b)$-n $\Rightarrow$ $f$ \textbf{\emph{szigorúan monoton növekedő}} $[a,b]$-n, + \item ha $f' \boldsymbol{\leq 0}\ \ (a, b)$-n $\Rightarrow$ $f$ \textbf{\emph{monoton csökkenő}} $[a,b]$-n, + \item ha $f' \boldsymbol{< 0}\ \ (a, b)$-n $\Rightarrow$ $f$ \textbf{\emph{szigorúan monoton csökkenő}} $[a,b]$-n. + \end{itemize} + + \paragraph*{Szükséges és elégséges feltétel a monotonitásra} + Legyen $a,b \in \R \ (a < b), \ f:\boldsymbol{[a,b]} \rightarrow \R.$\\ + Tegyük fel, hogy $f\in C[a,b]$, $f\in D[(a,b)]$, ekkor + \begin{itemize} + \item $f$ \textbf{\emph{monoton növekedő}} $[a,b]$-n $\Leftrightarrow f' \boldsymbol{\geq 0}\ \ (a, b)$-n, + \item $f$ \textbf{\emph{szigorúan monoton növekedő}} $[a,b]$-n $\Leftrightarrow f' \boldsymbol{\geq 0}\ \ (a, b)$-n, és\\ + $[a,b]$-nek nincs olyan részintervalluma, ami azonosan nulla. + \item $f$ \textbf{\emph{monoton csökkenő}} $[a,b]$-n $\Leftrightarrow f' \boldsymbol{\leq 0}\ \ (a, b)$-n, + \item $f$ \textbf{\emph{szigorúan monoton csökkenő}} $[a,b]$-n $\Leftrightarrow f' \boldsymbol{\leq 0}\ \ (a, b)$-n, és\\ + $[a,b]$-nek nincs olyan részintervalluma, ami azonosan nulla. + \end{itemize} + + \paragraph*{Elégséges feltétel a lokális szélsőérték létezésére} + + \noindent Legyen $a, b \in \mathbb{R}, a < b$ és $f: (a, b) \to \mathbb{R}.$\\ + Tegyük fel, hogy + \begin{itemize} + \item $f \in D[(a, b)]$, + \item egy $c \in (a, b)$ pontban $f'(c) = 0$ és + \item $f'$ előjelet vált $c$-ben. + \end{itemize} + Ekkor ha + \begin{itemize} + \item $f'$ függvény \emph{negatívból pozitívba} ($\boldsymbol{-} \longrightarrow \boldsymbol{+}$) megy át, akkor a $c$ pont az $f$ függvénynek \textbf{\emph{lokális minimumhelye}}, + \item $f'$ függvény \emph{pozitívból negatívba} ($\boldsymbol{+} \longrightarrow \boldsymbol{-}$) megy át, akkor a $c$ pont az $f$ függvénynek \textbf{\emph{lokális maximumhelye}}. + \end{itemize} + + \paragraph*{Másodrendű elégséges feltétel a lokális szélsőérték létezésére} + + \noindent Legyen $a, b \in \mathbb{R}, a < b$ és $f: (a, b) \to \mathbb{R}.$\\ + Tegyük fel, hogy + \begin{itemize} + \item $c \in (a, b)$ pontban $f \in D^2[c]$, + \item $f'(c) = 0$, + \item $f''(c) \neq 0$. + \end{itemize} + Ekkor $c$ lokális szélsőértékhelye az $f$ függvénynek, ha + \begin{itemize} + \item $f''(c) > 0$, akkor $f$-nek $c$-ben \textbf{\emph{lokális minimuma}} van, + \item $f''(c) < 0$, akkor $f$-nek $c$-ben \textbf{\emph{lokális maximuma}} van. + \end{itemize} + + \paragraph*{Konvex és konkáv függvények} + + \emph{Megjegyzés}. Valós-valós függvények konvexitását és konkávitását intervallumon fogjuk értelmezni. Intervallumon mindig nem üres és nem egyetlen pontból álló $\mathbb{R}$-beli halmazt értünk.\\ + + \noindent Az $I \subset \R$ intervallumon értelmezett $f:I\rightarrow \R$ függvény, és\\ + $\forall a, b \in I,\ a < b$ és $\forall \lambda \in (0,1)$ esetén + \begin{itemize} + \item $f\ \textit{\textbf{konvex} [szigorúan konvex]}\ \Leftrightarrow\ f\big(\lambda a + (1 - \lambda)b\big)\ \boldsymbol{\leq}\ [<]\ \lambda f(a) + (1 - \lambda)b$ + \item $f\ \textit{\textbf{konkáv} [szigorúan konkáv]}\ \Leftrightarrow\ f\big(\lambda a + (1 - \lambda)b\big)\ \boldsymbol{\geq}\ [>]\ \lambda f(a) + (1 - \lambda)b$ + \item $f\ \textit{\textbf{konvex} [szigorúan konvex]}\ \Leftrightarrow\ \forall c \in I\ \text{esetén}\ \ f' \boldsymbol{\nearrow}\ \ [\uparrow]$. + \item $f\ \textit{\textbf{konkáv} [szigorúan konkáv]}\ \Leftrightarrow\ \forall c \in I\ \text{esetén}\ \ f' \boldsymbol{\searrow}\ \ [\downarrow]$. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/konvex.png} + \caption{Konvex függvény} + \end{figure} + + \noindent Legyen $\alpha, \beta \in \mathbb{R},\ \alpha < \beta$, és tegyük fel, hogy $f \in D(\alpha, \beta)$, ekkor $\big(\forall x \in (\alpha, \beta)\big)$ + \begin{itemize} + \item $f\ \textit{\textbf{konvex}}\ \Leftrightarrow\ f''(x) \boldsymbol{\geq} 0$. + \item $f\ \textit{\textbf{konkáv}}\ \Leftrightarrow\ f''(x) \boldsymbol{\leq} 0$. + \item $f''(x) \boldsymbol{>} 0 \Rightarrow$ \emph{f} \emph{\textbf{szigorúan konvex}} $(\alpha, \beta)$-n. + \item $f''(x) \boldsymbol{<} 0 \Rightarrow$ \emph{f} \emph{\textbf{szigorúan konvex}} $(\alpha, \beta)$-n. + \end{itemize} + + \paragraph*{Többször differenciálható függvények} + + \noindent Az $f$ függvény \textbf{\emph{kétszer deriválható}} az $a$ pontban, ha $\exists r > 0: f \in D(K_{r}(a))$ és $f' \in D[a]$.\\ + Ekkor a második derivált jele és definíciója: + \[ + f''(a) = (f')'(a) \qquad (\text{Jelölése:}\ f \in D^{2}[a]) + \] + + \noindent Az \textbf{\emph{$f$ függvény $n$-szer deriválható $a$-ban}}, ha $\exists r > 0: f \in D^{(n-1)}(K_{r}(a))$ és $f^{(n-1)} \in D[a]$.\\ + Ekkor a $k$-adik derivált jele és definíciója: + \[ + f^{n}(a) = (f^{(n-1)})'(a) \qquad (\text{Jelölése:}\ f \in D^{n}[a]) + \] + + \section*{Riemann-integrál, parciális integrálás, integrálás helyettesítéssel.} + + \paragraph*{Határozatlan integrál} + + \noindent Az integrálást lényegében a deriválás ,,inverz" műveleteként értelmezhetjük: egy adott függvény határozatlan integrálja minden olyan függvény, amelynek deriváltja az adott függvény.\\ + + \noindent Azt mondjuk, hogy a $F(x)$ függvény \emph{\textbf{primitív függvénye}} az $f(x)$ függvénynek az $(a, b)$ intervallumon, ha $F(x)$ deriválható $(a, b)$-ben és minden $x \in (a, b)$ esetén $F'(x) = f(x)$. + + \noindent A primitív függvények összességét $f$ határozatlan integráljának nevezzük.\\ + + \noindent Az $f$ függvény primitív függvényeinek összességét $\bigintsss f(x)$-szel vagy $\bigintsss f$-el illetve $\bigintsss f dx$-szel jelöljük és $f$ \textbf{\emph{határozatlan integráljának}} nevezzük. Tehát + \[ + \bigintsss{f} := \bigintssss f(x)dx := \Big\{F:I \rightarrow \R,\ F \in D\ \text{és}\ F' = f \Big\}\ \text{\footnotesize (ez esetben $f$ neve: \emph{\textbf{integrandus}}}) + \] + + \noindent \textbf{Tétel.} Ha $F$ primitív függvénye $f$-nek, akkor az $F + c$ alakú függvények, ahol $c$ tetszőleges konstans, az $f$ függvény összes primitív függvénye, azaz + \[ + \bigintsss f = \Big\{F + c: c \in \mathbb{R}\Big\} + \] + + \noindent Például: $f(x) = \sqrt{x}$ függvény az egyik primitív függvénye. + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=0.0,xmax=1.5,ymin=0.0,ymax=1.3,legend pos=north west,ymajorgrids=true, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\small}] + \addplot[no marks,domain=0.0:1.4,samples=150,smooth,line width=2pt,blue]{sqrt(x)}; + \addlegendentry{$\sqrt{x}$} + \addplot[no marks,domain=0.0:1.4,samples=150,smooth,line width=1pt,red]{(2/3) * x^(3/2)}; + \addlegendentry{$\bigintssss \sqrt{x}$} + \end{axis} + \end{tikzpicture} + \end{center} + + \noindent \textbf{Tétel.} Folytonos függvénynek van primitív függvénye, pontosabban Ha $f(x)$ folytonos az $[a,b]$ zárt intervallumon, akkor van olyan $F(x)$ függvény, amelyik folytonos az $[a,b]$-n és primitív függvény $(a,b)$-n.\\ + + \paragraph*{Alapintegrálok} + + \noindent Azokat az integrálokat, amelyek valamilyen elemi függvény deriválásának megfordításakor keletkeznek, elemi integráloknak nevezzük.\\ + \renewcommand{\arraystretch}{2} + \noindent $\begin{array}{ll} + \bigintss x^n\ dx = \ddfrac{x^{n+1}}{n+1}$,\ ahol $n \neq -1,\ \text{speciálisan:}\ \bigintss 1 d x = x & \\ + \bigintss \ddfrac{1}{x}\ dx = \ln |x| & \bigintss x^{\alpha}\ dx = \ddfrac{1}{\alpha + 1}x^{\alpha + 1},\ \alpha \neq 1 \\ + \bigintss a^x\ dx = \ddfrac{1}{\ln a} a^x \ln a,\ \text{ahol}\ a > 0,\ a \neq 1 & \bigintss e^{x}\ dx = e^{x} \\ + \bigintss \sin{x}\ dx\ = -\cos x & \bigintss \cos x\ dx = \sin x \\ +% \bigintss \ddfrac{1}{\cos^2x}\ dx = \tan x & \bigintss \ddfrac{1}{\sin^2x}\ dx = -\cot x \\ +% \bigintss \ch x\ dx = \sh x & \bigintss \sh x\ dx = \ch x \\ +% \bigintsss \ddfrac{1}{\cosh^2x}\ dx = \tanh x & \bigintsss \ddfrac{1}{\sinh^2x}\ dx = -\coth x \\ +% \bigintsss \ddfrac{1}{\sqrt{1 - x^2}}\ dx = \arcsin{x} & \bigintsss \ddfrac{1}{\sqrt{1 + x^2}}\ dx = \arcsinh{x} \\ +% \bigintsss \ddfrac{1}{\sqrt{x^2 - 1}}\ dx = \arccosh x & + \end{array}$\\ + \renewcommand{\arraystretch}{1} + + \subsection*{Integrálási szabályok} + + \paragraph*{Műveleti szabályok} + + \begin{itemize} + \item Összeget és különbséget lehet tagonként integrálni, tehát: + \[ + \bigintssss f = F,\ \bigintssss g = G \Longrightarrow \bigintssss \big[f \pm g \big] = F + G + \] + \item A konstansszorzó az integrál elé kiemelhető, azaz tetszőleges $c$ esetén: + \[ + \bigintssss c \cdot f = c \bigintssss f + \] + \item \emph{Lineáris helyettesítés}. $f(ax + b)$ alakú integrandus $a, b \in \mathbb{R},\ a \neq 0$ és $F$ egy primitív függvénye $f$-nek: + \[ + \bigintssss f(ax + b)dx = \ddfrac{F(ax + b)}{a} + \] + Példa: + \[ + \bigintssss \sin (3x - 4)dx = \ddfrac{-cos(3x - 4)}{3} + \] + \item \emph{Helyettesítés hatványfüggvénybe}. $f^{(n)}(x)f'(x)$ alakú integrandus: ($n \neq 1$) + \[ + \bigintssss f^{(n)}(x)f'(x) dx = \ddfrac{f^{(n+1)}(x)}{n+1} + \] + Példa: + \[ + \bigintssss {(2x^2+5)4x}\ dx = \ddfrac{(2x^2+5)^6}{6} + \] + \item $\ddfrac{f'(x)}{f(x)}$ alakú integrandus: + \[ + \bigintssss \ddfrac{f'(x)}{f(x)} dx = \left\{ \begin{array}{cc} + \ln f(x): & I \subseteq \Big\{x: f(x) > 0\Big\} \\ + \ln(-f(x)): & J \subseteq \Big\{x: f(x) < 0\Big\} + \end{array} + \right. + \] + \emph{Megjegyzés}: Itt \emph{I} és \emph{J} intervallum, a továbbiakban a fenti értelemben használjuk az $\bigintss \ddfrac{f'(x)}{f(x)} dx = \ln \Big|f(x)\Big|$ jelölést.\\ + \ \\ + Például: + \[ + \bigintssss \ddfrac{2^x}{2^x-3} dx = \ddfrac{1}{\ln 2}\ln\Big|2^x-3\Big| + \] + \end{itemize} + + \subsection*{Határozott integrál} + + \noindent A gyakorlati életben, amikor konkrét integrálok kiszámítására van szükségünk, főként határozott integrálokat számolunk. + \noindent Néhány, a határozott integrál fogalmára vezető probléma. + + \begin{itemize} + \item A függvénygrafikon alatti terület. + \item A munka értelmezése és kiszámítása. + \item A nyomóerő meghatározása.\\ + \end{itemize} + + \paragraph*{Riemann-integrál} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize\\ + \noindent Ismert, hogy az $u > 0$, $v > 0$ oldalú téglalap területe $u\cdot v$. Állapodjunk meg abban, hogy ha $u > 0$ és $v < 0$, akkor $u\cdot v$ a téglalap „előjeles területe” legyen.\\ Nézzük meg mi is az, hogy a + \[ + H := \Big\{(x, y)\ \big|\ x \in [0, 1], y \in [0, x^2]\Big\} + \] + „parabola alatti tartománynak” mi lehet a területe. + + \noindent Osszuk fel a $[0, 1]$ intervallumot $n$ egyenlő részre. Az osztópontok + \[ + x_0 = 0,\ x_1 = \ddfrac{1}{n},\ x_2 = \ddfrac{2}{n},\ \ldots,\ x_n = \ddfrac{n}{n}. + \] + Legyen $S_n := \ddfrac{1}{n} \cdot \Big(\dfrac{1}{n}\Big)^2 + \ddfrac{1}{n} \cdot \Big(\ddfrac{2}{n}\Big)^2 + \ldots + \ddfrac{1}{n} \cdot \Big(\ddfrac{n}{n}\Big)^n$, azaz olyan téglalapok területének az összege, amelyeknek az alapja $\ddfrac{1}{n}$, a magassága pedig az $id^2$ függvény osztópontokban vett függvényértéke ($\ref{fig:intsqr}$. ábra).\\ + + \begin{figure}[H] + \centering + \begin{center} + \begin{tikzpicture}[x=1.5cm,line cap=round, line join=round] + \foreach \k [count=\z] in {1/2} + { + \begin{scope}[shift=(0:\z)] + \path [plot fill] plot [domain=0:2] (\x,{y(\x)}) -| cycle; + \foreach \x in {0, 1/2, 1, 3/2, 2, 5/2} + \path [bar,draw=black,fill=white] (\x,0) |- (\x+1/2, {y((\x+\k))/2}) |- cycle; + \path [plot] plot [domain=0:3] (\x,{y(\x)/2}); + \path [axis] (0,5.0) |- (4.0,0); + \foreach \t [count=\x from 0] in {0,\frac{1}{n},\frac{2}{n},\ldots,\frac{i}{n},\ldots,\frac{n}{n}} + \path [axis, -] (\x/2,0) -- ++(0,-3pt) node [below] {$\t$}; + \draw (2.6175cm,2pt) node[above] + {\small $\big(\frac{i}{n}\big)^2$}; + \end{scope} + } + \end{tikzpicture} + \end{center} + \caption{} + \label{fig:intsqr} + \end{figure} + + \noindent $S_n$ egy „lépcsősidom” területe. Ha növeljük az $n$ osztópontszámot, akkor a lépcsősidomok egyre jobban illeszkednek a $H$ halmazhoz, így elvárható, hogy az $\big(S_n\big)$ sorozat határértéke éppen a $H$ halmaz területe legyen.\\ + Felhasználva, hogy minden $k \in N$ esetén $1^2 + 2^2 + \ldots + k^2 = \ddfrac{k(k+1)(2k+1)}{6}$, + \begin{center} + $\lim S_n = \lim\ddfrac{1}{n^3} (1^2 + 2^2 + \ldots + n^2) = \lim \ddfrac{1}{n^3}\ddfrac{n(n + 1)(2n + 1)}{6}=$\\ + $\lim \ddfrac{2n^2 + 3n + 1}{6n^2} = \lim\ddfrac{2 + \ddfrac{3}{n} + \ddfrac{1}{n^2}}{6}=\ddfrac{1}{3}$ + \end{center} + \noindent Legyen tehát a $H$ halmaz területe $\ddfrac{1}{3}$.\\ + + \noindent Ezt a gondolatmenetet általánosítjuk. + $\triangleleft$ \faLightbulbO}\\ + + \noindent Legyen $f : [a, b] \to \mathbb{R}$ függvény. + Legyen + \[ + \tau := x_0, x_1, x_2, \ldots, , x_i, \ldots, x_n \subset [a, b], + \] + ahol + \[ + a = x_0 < x_1 < x_2 < \ldots < x_{i-1} < x_i < \ldots < x_n = b + \] + az $[a,b]$ intervallum egy felosztása.\\ + + \noindent Minden $[x_i-1, x_i]$ intervallumban vegyük fel egy $\xi_i$ pontot (i=1,2,\ldots,n). \\ + + \noindent Készítsük el az $f$ függvény $\tau$ felosztáshoz tartozó közelítő összegét: + \[ + \sigma(\tau) := f(\xi_1)(x_1-x_0)+f(\xi_2)(x_2-x_1)+ \ldots + f(\xi_n)(x_n-x_{n-1}) = \sum\limits_{i=1}^{n} f(\xi_i)(x_i-x_{i-1}). + \] + + \noindent (Ez a $\sigma(\tau)$ felel meg a bevezető példa $S_n$ lépcsősidom területének, ott a $\xi_i$ pontot mindig az intervallum jobb szélén vettük fel.)\\ + Akkor mondjuk a függvényt integrálhatónak, ha a $\sigma(\tau)$ közelítő összegek „finomodó” felosztások során tetszőlegesen közel kerülnek egy számhoz. Pontosabban:\\ + + \noindent \textbf{Definíció}. Azt mondjuk, hogy az $f : [a, b] \to \mathbb{R}$ függvény integrálható az $[a,b]$ intervallumon, ha van olyan $I \in \mathbb{R}$ szám, hogy bármilyen $\varepsilon > 0$ hibakorláthoz van olyan $\delta > 0$, hogy az $[a, b]$ intervallum minden olyan $\tau$ felosztására, amelyben + \[ + \max \Big\{x_{i} - x_{i-1} \big| i = 1, 2, \ldots, n\Big\} < \delta + \] + és a $\tau$ felosztáshoz tartozó $[x_{i-1},\ x_i]$ intervallumokban vett tetszőleges $\xi_{i} \in [x_{i-1},\ x_i]$ pontok esetén a + \[ + \sigma(\tau) = \sum\limits_{i=1}^{n} f(\xi_{i})(x_i - x_{i-1}) + \] + közelítő összegre + \[ + \big| \sigma(\tau) -I \big| < \varepsilon + \] + Ha $f$ integrálható az $[a, b]$ intervallumon, akkor ezt $f \in R[a, b]$ jelölje (Riemann tiszteletére, aki az integrált ilyen módon bevezette), és legyen + \[ + \bigintssss\limits_{a}^{b} f := I. + \] + („integrál a-tól b-ig”). Továbbá ekkor azt mondjuk, hogy a + \[ + H := \Big\{(x, y)\ \big|\ x \in [a, b],\ \begin{array}{rc} + y \in [0, f(x)],\ \text{ha}\ &f(x) \geq 0 \\ + y \in [f(x), 0],\ \text{ha}\ &f(x) < 0 + \end{array} + \Big\} + \] + halmaznak („görbe alatti tartomány”) van előjeles területe, és ez a terület az $I \in \mathbb{R}$ szám. + Röviden úgy szoktak hivatkozni erre a fogalomra, hogy bevezetve a $\Delta x_i := x_{i} - x_{i-1}$ jelölést, + \[ + \lim\limits_{\Delta x_i \to 0}^{} f(\xi_{i}) \Delta x_{i} = I + \] + vagy + \[ + \lim\limits_{\Delta x \to 0}^{} \sum f(\xi) \Delta x = \bigintssss\limits_{a}^{b} f(x)dx. + \] + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Könnyű látni, hogy ha $f : [a, b] \to \mathbb{R}$, $f(x) = c$ egy konstans függvény, akkor + \[ + \lim\limits_{x_{i} \to 0}^{} f(\xi_{i}) \Delta x_{i} = \lim\limits_{\Delta x_{i} \to 0}^{} \sum\limits_{i=1}^{n} c(x_{i} - x_{i-1}) = c(b-a), + \] + amint ezt a szemlélet alapján is vártuk, tehát $f \in R[a, b]$ és $\bigintssss\limits_{a}^{b} f = c(b-a)$. + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{Az integrálhatóság feltételei} + + \noindent Legyen $f:[a,b] \to \mathbb{R}$ korlátos és $\tau$ egy felosztása $[a,b]$-nek. Az + \[ + \omega(f, \tau) = S(f, \tau) - s(f, \tau) + \] + valós számot az $f$ függvény $\tau$-hoz tartozó \textbf{\emph{oszcillációs összeg}}ének nevezzük.\\ + + \noindent \emph{Riemann-kritérium}: Egy $f:[a,b] \to \mathbb{R}$ korlátos függvény akkor és csak akkor Riemann-integrálható, ha $\forall \varepsilon > 0$ számhoz $\exists \tau$ felosztása $[a,b]$-nek úgy, hogy $\omega(f, \tau) < \varepsilon$.\\ + + \noindent \textbf{Tétel}. Ha $f:[a,b] \to \mathbb{R}$ folytonos függvény, akkor $f$ Riemann-integrálható ($f \in R[a,b]$).\\ + + \noindent \textbf{Tétel}. Ha $f:[a,b] \to \mathbb{R}$ monoton függvény, akkor $f$ Riemann-integrálható ($f \in R[a,b]$).\\ + + \subsubsection*{A Riemann-integrál és a műveletek kapcsolata} + + \noindent Ha $f \in \mathcal{C}[a,b]$, akkor $f \in R[a,b]$. Ha $f \in R[a,b]$ és $f \in R[b,c]$, akkor $f \in R[a,c]$, sőt + \[ + \bigintssss\limits_{a}^{b} f + \bigintssss\limits_{b}^{c} f = \bigintssss\limits_{a}^{c} f + \] + + \noindent Tehát az integrálási intervallum részekre bontásával az eredeti integrál a részeken vett integrálok összegével egyezik meg.\\ + + \noindent Ha $f \in R[a,b]$ és $\lambda \in \mathbb{R}$, akkor $\lambda \in R[a,b]$, és + \[ + \bigintssss\limits_{a}^{b} \lambda f = \lambda \bigintssss\limits_{a}^{b} f + \] + + \noindent Ha $f,g \in R[a,b]$, akkor $f + g \in R[a,b]$, és + \[ + \bigintssss\limits_{a}^{b} (f + g) = \bigintssss\limits_{a}^{b} f + \bigintssss\limits_{a}^{b} g + \] + + \noindent Ha $f,g \in R[a,b]$, akkor $f \cdot g \in R[a,b]$. Nincs rá általános képlet.\\ + + \noindent Ha $f,g \in R[a,b]$, és $f(x) \geq g(x)\ \forall x \in [a,b]$, akkor + \[ + \bigintssss\limits_{a}^{b} f \geq \bigintssss\limits_{a}^{b} g + \] + + \noindent Ha $f \in R[a,b]$, akkor + \[ + \left|\bigintssss\limits_{a}^{b} f\right| \leq \bigintssss\limits_{a}^{b} |f| + \] + + \noindent A határok felcserélésével előjelváltás történik. + \[ + \bigintssss_{a}^{b}f(x)dx = -\bigintssss_{b}^{a}f(x)dx + \] + + \section*{Newton-Leibniz-formula} + + \noindent A határozott és a határozatlan integrál kapcsolatát a Newton-Leibniz formula adja meg: + \noindent Legyen $f:[a,b] \to \mathbb{R}\ $ Riemann integrálható és $F:[a,b] \to \mathbb{R}$ folytonos függvény úgy, hogy $\forall x \in (a,b)$-re az $F$ differenciálható $x$-ben és $F'(x) = f(x)$. Ekkor + \[ + \bigintss_{a}^{b}f(x)dx := F(b) - F(a) + \] + \noindent Jelölés: $F(b) - F(a) = \Big[F(x)\Big]_{a}^{b}$. Így tehát a határozott integrál kiszámolásához is lényegében primitív függvényt kell keresnünk, ezért a határozatlan integrál esetében látott szabályok és módszerek itt is érvényben maradnak.\\ + + \subsection*{Parciális intergrálás} + + \noindent A parciális integrálás egy igen fontos módszer, mert segítségével szorzat alakban megadott (vagy olyanná alakítható) integrandusok nagyrészét kiszámíthatjuk. Maga a módszer a szorzat függvény deriválási szabályából adódik: + \[ + \bigintssss fg' = fg - \bigintssss f'g + \] + + \noindent Az ötlet tehát, hogy a szorzat alakban megadott függvény egyik tényezőjét f-nek, másik tényezőjét $g \textquotesingle$-nek választva átírjuk az integrált. A megfelelő megválasztás alapja, hogy $f \textquotesingle g$-t könnyebben lehet integrálni mint $fg \textquotesingle$-t. + + \noindent Nem mindegy azonban, hogy melyik függvényt választjuk $f$-nek, illetve $g$-nek.\\ + + \paragraph*{Parciális integrálás határozott esetben\\} + + Legyen $ f,g:[a,b] \to \mathbb{R}$ függvények az $[a,b]$ intervallumon differenciálhatók, és deriváltfüggvényük is folytonos.\\ + Ekkor az $f \cdot g' + f' \cdot g$ is folytonos, és $(f \cdot g)' = f' \cdot g + f \cdot g'$-t figyelembe véve a Newton-Leibniz-formula alapján + \[ + \bigintssss\limits_{a}^{b} \Big(f'(x)g(x) + f(x)g'(x)\Big)dx = f(b)g(b) - f(a)g(a) + \] + átrendezve azt kapjuk, hogy + \[ + \bigintssss\limits_{a}^{b} f'(x)g(x) = f(b)g(b) - f(a)g(a) - \bigintssss\limits_{a}^{b}f(x)g'(x) dx + \] + + \noindent Természetesen ezt akkor tudjuk alkalmazni, ha a jobb oldalon álló integrál kiszámolható.\\ + + \paragraph*{Helyettesítéses integrálás} + + \noindent A helyettesítéses integrálás módszere nagyon sokszor segítségünkre lehet a legkülönfélébb estekben is. Lényege, hogy az integrandusban valamilyen kifejezést helyettesítünk egy új változóval, ez által egy könnyebben integrálható kifejezést kapunk, amit kiintegrálunk, majd a végén visszahelyettesítjük az eredeti kifejezést.\\ + + \noindent Az eljárás lényege tehát a következő: + Legyen $g(x) = t$, ekkor $g'(x) = \ddfrac{dt}{dx}$, és ezért $g'(x) dx = dt$, vagyis: + \[ + \bigintssss f(g(x))g\textquotesingle (x) dx = \bigintssss f(t) dt = F(t) = F(g(x)) + \] + \noindent Példa: + \[ + \bigintssss \ddfrac{3}{\cos^{2}(2x-3)} dx = \bigintssss \ddfrac{3}{\cos^{2}t}\ddfrac{dt}{2} = \ddfrac{3}{2} \tan t = \ddfrac{3}{2}\tan (2x-3) + \] + + \paragraph*{Harározott esetben} + \[ + \bigintssss\limits_{a}^{b} f(g(x))g\textquotesingle (x) dx = \bigintssss\limits_{g(a)}^{g(b)} f(t) dt = [F(t)]_{g(a)}^{g(b)} + \] + + \noindent Példa: Határozzuk meg az egység sugarú (negyed-)kör területét. + + \noindent Az origó középpontú 1 sugarú kör egyenlete: $x^2 + y^2 = 1$, ezért az első síknegyedet választva az explicit függvénykapcsolatot az $y = \sqrt{1 - x^2}$ képlet írja le. A meghatározandó integrál tehát: $\bigintssss\limits_{0}^{1} \sqrt{1 - x^2} dx$.\\ + Alkalmazzuk az $x = \sin{y}$ helyettesítést $\Rightarrow dy = \ddfrac{1}{\sqrt{1- x^2}}dx$ + \[ + \bigintssss\limits_{0}^{1} \sqrt{1 - x^2} dx = \bigintssss\limits_{0}^{\ddfrac{\pi}{2}} 1 - \sin^{2}(y) dy = \bigintssss\limits_{0}^{\ddfrac{\pi}{2}} \cos^{2}(y) dx = \ddfrac{1}{2} \bigintssss\limits_{0}^{\ddfrac{\pi}{2}} 1 + \cos(2y) dy = \ddfrac{1}{2}\Big[y + \ddfrac{\sin(2y)}{2}\Big]_{0}^{\ddfrac{\pi}{2}} = \ddfrac{\pi}{4} + \] + + \paragraph*{Integrálszámítás alkalmazása} + + \begin{itemize} + \item Függvények alatti terület kiszámítása + \item Síkidomok területének kiszámítása + \item Forgástestek felszínének kiszámítása + \item $R^{n}$-beli görbék ívhosszának kiszámítása + \end{itemize} + +% \section*{A kezdeti érték probléma} +% \begin{description} +% \item[Differenciál egyenlet] \hfill \\ +% $ 0 < n \in \mathbb{N}, \ I \subset \R$ nyílt intervallum, \\ +% $ \Omega := I_1 \times \ldots \times I_n \subset \R^n$, ahol $ I_1,\ldots,I_n \subset \R$ nyílt intervallum \\ +% $f:I\times\Omega \rightarrow \R^n, \ f \in C $ + +% Határozzuk meg a $ \varphi \in I \rightarrow \Omega$ függvényt úgy, hogy: +% \begin{itemize} +% \item $ D_{\varphi} $ nyílt intervallum +% \item $ \varphi \in D $ +% \item $ \varphi'(x) = f(x, \varphi(x)) \quad (x \in D_{\varphi}) $ +% \end{itemize} +% +% Ezt a feladatot nevezzük differenciálegyenletnek. +% \item[Kezdeti érték probléma] \hfill \\ +% Ha az előzőekhez még adottak: $ \tau \in I$, és $ \xi \in \Omega$ \\ +% Illetve a $\varphi$ függvényre még teljesül: +% \begin{itemize} +% \item $\tau \in D_{\varphi}$ és $ \varphi(\tau) = \xi $ +% \end{itemize} +% +% Akkor kezdeti érték problémának (Cauchy feladatnak) nevezzük. +% \end{description} + + \section*{Lineáris, ill. magasabb rendű lineáris differenciálegyenletek} + + \noindent Az olyan egyenleteket, melyben az ismeretlen függvény deriváltja, illetve deriváltjai szerepelnek, differenciál-egyenleteknek nevezzük. Tehát egy differenciálegyenletben szerepelhetnek: + \begin{itemize} + \item konstansok; + \item egy vagy több független változó; + \item az ismeretlen függvény, illetve függvények közönséges, illetve parciális deriváltja, illetve deriváltjai. + \end{itemize} + + \paragraph*{Differenciálegyenletek osztályozása} + + \noindent Ha a differenciálegyenletben egyetlen független változó van, akkor a derivált közönséges derivált. Ebben az esetben \textbf{\emph{közönséges differenciálegyenlet}}ről beszélünk.\\ + + \noindent Ha a differenciálegyenletben kettő vagy több független változó van, akkor a derivált parciális derivált. Ekkor a szóban forgó egyenlet egy \textbf{\emph{parciális differenciálegyenlet}}.\\ + + \noindent Ha az ismeretlen függvények száma egynél több, akkor az ismeretlen függvények számával egyenlő számú differenciálegyenletből álló \textbf{\emph{differenciálegyenlet-rendszer}}rel van dolgunk.\\ + + \noindent A \textbf{\emph{differenciálegyenlet rendje}} az egyenletben szereplő legmagasabb rendű derivált rangjával egyenlő.\\ + + \noindent A közönséges differenciálegyenletek közül azokat, amelyekben az ismeretlen függvény és ennek a deriváltjai legfeljebb csak első hatványon fordulnak elő és szorzatuk nem szerepel, \textbf{\emph{lineáris differenciálegyenlet}}nek nevezzük. Ellenkező esetben \textbf{\emph{nemlineáris differenciálegyenlet}}ekről beszélünk.\\ + + \noindent Ha a közönséges differenciálegyenletben van olyan tag, amely állandó, vagy amelyben csak a független változó szerepel, akkor a differenciálegyenlet \textbf{\emph{inhomogén differenciálegyenlet}}. Ellenkező esetben azt mondjuk, hogy a differenciálegyenlet \textbf{\emph{homogén differenciálegyenlet}}.\\ + + \noindent Ha a közönséges differenciálegyenletben a függvényt és a deriváltjait tartalmazó tagok állandók, akkor az egyenletet \textbf{\emph{állandó együtthatós differenciálegyenlet}}nek nevezzük. Ellenkező esetben \textbf{\emph{függvényegyütthatós differenciálegyenlet}}ről beszélünk.\\ + + \noindent Egy $f$ függvényt a \textbf{\emph{differenciálegyenlet megoldásának}} nevezünk, ha deriváltjaival együtt azonosan kielégíti a differenciál-egyenletet.\\ + + \noindent Egy $f$ függvényt az n-edrendű differenciálegyenlet \textbf{\emph{általános megoldásának}} nevezünk, ha deriváltjaival együtt azonosan kielégíti a differenciálegyenletet és pontosan $n$ db egymástól függetlenül megválasztható szabad paramétert tartalmaz.\\ + + \noindent Egy $f$ függvényt az n-edrendű differenciálegyenlet \textbf{\emph{partikuláris megoldásának}} nevezünk, ha deriváltjaival együtt azonosan kielégíti a differenciálegyenletet és legfeljebb $n-1$ db egymástól függetlenül megválasztható szabad paramétert tartalmaz.\\ + + \noindent \emph{Megjegyzés}: A szabad paraméterek helyébe egy-egy (valós) számot helyettesítve a differenciálegyenlet valamely megoldását kapjuk.\\ + + \noindent Adott egy $D \subset \mathbb{R} \times \mathbb{R}^{n}\ (n \in \mathbb{N})$ tartomány és $f:D \to \mathbb{R}^n$ folytonos függvény.\\ + + \noindent Keresünk: $I \subset \mathbb{R}$ nyílt intervallumot és $\varphi: I \to \mathbb{R}^n$ differenciálható függvényt, amelyre + \begin{itemize} + \item $(t, \varphi(t)) \in D\qquad (\forall t \in I)$ + \item $\varphi'(t) = f(t, \varphi(t))\qquad (\forall t \in I)$ + \end{itemize} + + \noindent Ezt a feladatot explicit \textbf{\emph{elsőrendő közönséges differenciálegyenletnek}} nevezzük.\\ + + + \noindent Jelölése: + \begin{equation} \label{eu_eq1} + x'(t) = f(t, x(t)) \qquad \text{vagy}\ \qquad x' = f \circ (id, x) + \end{equation} + + \noindent Ha ilyen $I$ intervallum és $\varphi$ függvény létezik, akkor azt mondjuk, hogy a $\varphi$ az $(1)$ \textbf{\emph{differenciálegyenlet megoldása}} $I$-n. +\newpage + \subsubsection*{Kezdetiérték probléma} + + Legyen $D \subset \mathbb{R} \times \mathbb{R}^{n}\ (n \in \mathbb{N})$ tartomány és $f:D \to \mathbb{R}^{n}$ folytonos függvény, $(p_1, p_2) \in D \subset \mathbb{R} \times \mathbb{R}^{n}$ pedig tetszőleges pont. A $\varphi: I \to \mathbb{R}^n$ differenciálható függvény az + \begin{equation} \label{eu_eq2} + x' = f(t, x(t)), \qquad x(p_1) = p_2 + \end{equation} + \emph{kezdetiérték-probléma} egy megoldása, ha + \begin{itemize} + \item $\varphi$ az $x' = f(t, x(t))$ differenciálegyenlet egy megoldása $I$-n, + \item $p_1 \in I$ + \item $\varphi(p_1) = p_2$ + \end{itemize} + + \noindent Továbbiakban kezdetiérték-probléma = K.É.P. + + \paragraph*{Kezdeti érték megoldására vonatkozó kérdések} + + \begin{enumerate} + \item A megoldás létezése + \item A megoldások egyértelműsége + \item A megoldások előállítása + \begin{itemize} + \item pontos megoldás (megoldóképlet) + \item közelítő megoldás + \end{itemize} + \item A megoldások függése (például) a kezdeti értéktől + \item Minőségi vizsgálatok: A megoldások bizonyos tulajdonságainak (például periodicitás) vizsgálata a differenciálegyenlet ismerete nélkül + \end{enumerate} + + \paragraph*{A megoldás létezése} + + \noindent \textbf{Tétel}. (Cauchy-Peano-féle egzisztenciatétel): Tegyük fel, hogy a $D \subset \mathbb{R} \times \mathbb{R}^{n}\ (n \in \mathbb{N})$ tartományon értelmezett és $f:D \to \mathbb{R}^{n}$ függvény folytonos. Ekkor bármely $(p_1, p_2) \in D$ esetén az + \[ + x' = f(t, x(t)), \qquad x(p_1) = p_2 + \] + \emph{kezdetiérték problémának van megoldása}. + + \paragraph*{A megoldások egyértelműsége} + + \noindent A K.É.P globálisan \textbf{\emph{egyértelműen oldható meg}}, ha létezik olyan $\tilde{I} \subset \mathbb{R}$ nyílt intervallum és olyan $\tilde{\varphi}: \tilde{I} \to \mathbb{R}$ megoldása a kezdetiérték-problémának, hogy annak bármely más megoldása $\tilde{\varphi}$ egy leszűkítése. Ebben az esetben a $\tilde{\varphi}$ függvény a kezdetiérték-probléma \textbf{\emph{teljes megoldásának}} nevezzük.\\ + + \noindent A K.É.P egy $\varphi^{*}: I^{*} \to \mathbb{R}^{n}$ megoldás \textbf{\emph{maximális megoldás}}, ha nincs olyan $\varphi^{*}$-től különböző megoldás, amelyiknek a leszűkítése $\varphi^{*}$ lenne. Ha $\varphi$ teljes megoldás $\Rightarrow$ $\varpi$ maximális megoldás is. (fordítva nem igaz).\\ +\newpage + \noindent Az K.É.P \textbf{\emph{lokálisan egyértelműen oldható meg}}, ha a $(p_1, p_2) \in \mathbb{R} \times \mathbb{R}^{n}$ pontnak létezik olyan $k(p_1, p_2) \subset \mathbb{R} \times \mathbb{R}^{n}$ környezete, hogy az $f$ függvényt erre leszűkítve a megfelelő K.É.P megoldása már globálisan egyértelmű.\\ + + \noindent \textbf{Tétel}. Ha K.É.P minden $(p_1, p_2) \in D$ esetén lokálisan egyértelműen oldható meg, akkor minden K.É.P megoldása globálisan egyértelmű is.\\ + + \noindent \textbf{Tétel}. (\emph{Picard–Lindelöf-féle egzisztencia\text{-} és unicitástétel}): Legyen $n \in \mathbb{N},\ D \subset \mathbb{R} \times \mathbb{R}^{n}$ egy tartomány és $(p_1, p_2) \in D$. Tegyük fel, hogy + \begin{itemize} + \item az $f: D \to \mathbb{R}^{n}$ függvény folytonos D-n + \item az $f$ függvény a $(p_1, p_2)$ pontban a második változójában lokális Lipschitz-feltételeknek tesz eleget, azaz + \begin{center} + $\exists k(p_1, p_2) \subset D \qquad \text{és}\qquad L_{(p_1, p_2)} > 0$,\ \text{hogy}\\ + $\Vert f(t, \overline{u}) - f(t, \overline{\overline{u}})\Vert \leq L_{(p_1, p_2)}\Vert\overline{u} - \overline{\overline{u}}\Vert \qquad (\forall (t, \overline{u}),\ (t, \overline{\overline{u}}) \in k(p_1, p_2))$ + \end{center} + \end{itemize} + Ekkor a K.É.P létezik megoldása és az lokálisan (sőt globálisan) egyértelmű.\\ + + \subsubsection*{Szétválasztható változójú (szeparábilis) differenciálegyenletek\\} + + \noindent Tegyük fel, hogy $I, J \in \mathbb{R}$ nyílt intervallum, $\Omega := I \times J$ és + \[ + g: I \to \mathbb{R}, \quad h : J \to \mathbb{R} + \] + folytonos függvények. Ekkor az + \begin{equation} \label{eu_eq3} + x'(t) = g(t) h(x(t))\qquad \text{vagy}\qquad x' = g \cdot h \circ x + \end{equation} + feladatot \textbf{\emph{szétválasztható változójú}} (vagy \textbf{\emph{szeparábilis}}) differenciálegyenletnek nevezzük.\\ + + \noindent Ha $(p_1, p_2) \in I \times J$, akkor az + \begin{equation} \label{eu_eq4} + x' = g(t)h(x(t)),\qquad x(p_1) = p_2 + \end{equation} + feladat a (\ref{eu_eq3}) egyenletre vonatkozó \emph{\textbf{kezdetiérték-probléma}}.\\ + + \noindent \emph{Megjegyzés}: Az elnevezés onnan ered, hogy az ilyen differenciálegyenletek átrendezhetők úgy, hogy az $y$ változó csak az egyik, az $x$ változó pedig csak a másik oldalon forduljon elő.\\ + + \noindent Példa:\\ + + \noindent $y' = \ddfrac{x^2 + x}{2y} \Rightarrow y1 = (x^2 + x) \cdot \ddfrac{1}{2y}$.\\ + \noindent $y'x + y' - y^2 + 2y = 0 \Rightarrow (y^2 - 2y)\cdot \ddfrac{1}{x+1}$. +\newpage + \subsection*{Elsőrendű lineáris differenciálegyenletek} + + \noindent Tegyük fel, hogy $I \subset \mathbb{R}$ nyílt intervallum és $f,g: I \to \mathbb{R}$ folytonos függvények. Ekkor az + \begin{equation}\label{eu_eq5} + x'(t) + f(t)x(t) = g(t) \qquad (t \in I) + \end{equation} + feladatot elsőrendű lineáris differenciálegyenletnek nevezzük.\\ + + \noindent Ha $(p_1, p_2) \in I \times \mathbb{R}$, akkor az + \[ + x'(t) + f(t)x(t) = g(t), \qquad x(p_1) = p2 \qquad (t \in I) + \] + feladat az (\ref{eu_eq5}) egyenletre vonatkozó \textbf{\emph{kezdetiérték-probléma}}.\\ + + \paragraph*{A feladat megoldása homogén-inhomogén módszerrel} + + \noindent Tekintsük először az + \begin{equation}\label{eu_eq6} + x' + f x = 0 + \end{equation} + homogén lineáris differenciálegyenletet, amelynek általános megoldása + \[ + \varphi(t) = c \cdot e^{-\bigintsss\limits_{a}^{t}f(s) ds} = c \cdot \varphi_0(t) \qquad (t \in I) + \] + alakú, ahol $a \in I$ rögzített pont és $c$ tetszőleges valós szám.\\ + + \noindent Az + \begin{equation}\label{eu_eq7} + x' + f x = g + \end{equation} + inhomogén egyenletre a következő teljesül: ha $\psi_1$ és $\psi_2$ (\ref{eu_eq7}) megoldásai, akkor a $\psi := \psi_1 - \psi_2$ függvény kielégíti a (\ref{eu_eq6}) egyenletet.\\ + + \noindent Ebből következik, hogy ha ismerjük az inhomogén egyenlet egy $\psi_p$ (partikuláris) megoldását, akkor (\ref{eu_eq7}) tetszőleges megoldása + \[ + \psi = \varphi + \psi_p + \] + alakú, ahol $\varphi$ homogén egyenlet egy megoldása.\\ + + \noindent Az előbbi megoldás a következő formában egyszerűbben megjegyezhető: + \begin{center} + \ovalbox{\makecell{inhomogén egyenlet \\ általános megoldása}} = \ovalbox{\makecell{homogén egyenlet \\ általános megoldása}} + \ovalbox{\makecell{az inhomogén egyenlet \\ egy partikuláris megoldása}} + \end{center} + + \noindent Az inhomogén egyenlet egy partikuláris megoldását a Lagrange-tól eredő állandók variálásának a módszerével határozzuk meg.\\ + + \noindent Tegyük fel, hogy $I \subset \mathbb{R}$ nyílt intervallum $f,g: I \in \mathbb{R}$ folytonos függvények és $(p1_, p_2) \in I \times \mathbb{R}$. Ekkor az + \[ + x' + fx = g,\qquad x(p_1) = p_2 + \] + kezdetiérték probléma globálisan egyértelműen oldható meg. A $\psi$ teljes megoldás értelmezési tartománya az egész $I$ intervallum, és a teljes megoldás + \[ + \psi(t) = \xi \cdot \varphi_{0}(t) + \varphi_{0}(t) \bigintssss\limits_{p_1}^{t}(\varphi_{0}(s))^{-1}g(s) ds \qquad (t \in I) + \] + (ez a Cauchy-féle formula), ahol + \[ + \varphi_{0}(t) := e^{\bigintssss\limits_{p_1}^{4}f(s) ds} \qquad (t \in I) + \] + a homogén egyenlet egy megoldása.\\ + + \noindent Az $x' + fx = g$ inhomogén egyenlet megoldásai a + \[ + \psi(t) = c\varphi_{0}(t) + \psi_{part}(t) = c\varphi_{0}(t) + \varphi_{0}(t)\bigintssss\limits_{p_1}^{t}(\varphi_{0}(s)) g(s) ds \qquad (t \in I,\ c \in \mathbb{R}) + \] + függvények, illetve ezek leszűkítései.\\ + + \noindent \textbf{Tétel}. (\emph{Szuperpozíció elve}): Tegyük fel, hogy $\psi_{1}$ megoldása az + \[ + x' + fx = g_1 + \] + egyenletnek, $\psi_2$ pedig megoldása az + \[ + x' + fx = g_2 + \] + egyenletnek, akkor $\psi_1 + \psi_2$ megoldása az + \[ + x' + fx = g_1 + g_2 + \] + egyenletnek.\\ + + \paragraph*{n-ed rendű lineáris differenciálegyenletek} + + \noindent Legyen $n \in \mathbb{N},\ I \subset \mathbb{R}$ nyílt intervallum, és tegyük fel, hogy az $a_i: I \to \mathbb{R}$ $(i = 0,1, \ldots, n-1)$ és a $b:I \to \mathbb{R}$ függvények folytonosak. Ekkor az + \[ + x^{(n)} + a_{n-1}x^{(n-1)} + \ldots + a_{1}x' + a_{0}x = b + \] + feladatot \emph{n}\textbf{\emph{-edrendű lineáris differenciálegyenletnek}} nevezzük. Ha $b \equiv 0$, akkor az egyenlet \textbf{\emph{homogén}}, az ellenkező esetben \textbf{\emph{inhomogén}}. \textbf{\emph{Állandó együtthatós}} az egyenlet, ha az $a_i\ (i = 0, 1, \ldots, n-1)$ együtthatók valós számok.\\ + + \noindent Legyen $n \in \mathbb{R},\ I \subset \mathbb{R}$ nyílt intervallum, és tegyük fel, hogy az + \[ + a_i : I \to \mathbb{R} \qquad (i = 0, 1, \ldots, n-1)\ \text{és a}\ b: I \to \mathbb{R} + \] + függvények folytonosak. Ha $p \in I$ és $s_1, s_2, \ldots, s_{n-1} \in \mathbb{R}$, akkor az + \begin{center} + $x^{(n)} + a_{n-1}x^{(n-1)} + \ldots + a_{1}x' + a_{0}x = b$\\ + $x(p) = s_0,\ \quad x'(p) = s_1,\ \ldots,\ x^{(n-1)}(p) = s_{n-1}$ + \end{center} + feladatot az n-edrendű lineáris differenciálegyenletre vonatkozó \textbf{\emph{kezdetiérték-problémának}} nevezzük.\\ + + \noindent \textbf{A megoldások létezése és egyértelműsége.} Az n-edrendű lineáris differenciálegyenletre vonatkozó tetszőleges kezdetiérték-probléma globálisan egyértelműen oldható meg, és minden teljes megoldás értelmezési tartománya az egész $I$ intervallum.\\ +\newpage + \noindent \textbf{A megoldáshalmaz szerkezet} + \begin{itemize} + \item A homogén n-endrendű lineáris differenciálegyenlet teljes megoldásainak az $\mathcal{M}_{h}$ halmaza n-dimenziós lineáris tér $\mathbb{R}$ felett. + \item Legyen $\psi_{p}$ az \textbf{\emph{inhomogén}} n-edrendű lineáris differenciálegyenlet egy (partikuláris) megoldása. Ekkor az egyenlet tetszőleges megoldása + \[ + \psi = \varphi + \psi_{part} + \] + alakú, ahol $\varphi$ a homogén egyenlet egy megoldása. + \end{itemize} + + \noindent A homogén egyenlet $\mathcal{M}_{h}$ megoldáshalmazának egy bázisát a homogén egyenlet egy \textbf{\emph{alaprendszerének}} nevezzük.\\ + \begin{enumerate} + \item megjegyzés: A fenti megoldás a következő formában egyszerűbben megjegyezhető: + \begin{center} + \ovalbox{\makecell{inhomogén egyenlet \\ általános megoldása}} = \ovalbox{\makecell{homogén egyenlet \\ általános megoldása}} + \ovalbox{\makecell{az inhomogén egyenlet \\ egy partikuláris megoldása}} + \end{center} + \item megjegyzés: Inhomogén egyenlet megoldásának előállításához tehát ismernünk kell + \begin{itemize} + \item a homogén egyenlet egy alaprendszerét és + \item az inhomogén egyenlet egy partikuláris megoldását. + \end{itemize} + \end{enumerate} + + \noindent Az állandók variálásának a módszerével a homogén egyenlet alaprendszerének (n lineárisan független megoldásának) az ismeretében egy partikuláris megoldás már előállítható.\\ + + \noindent Ez az jelenti, hogy inhomogén egyenlet megoldásához elegendő a homogén egyenlet egy alaprendszerét meghatározni. Az alaprendszer előállítására azonban csak az állandó együtthatós egyenletek esetében van általános módszer.\\ + + \noindent \textbf{Az állandók variálásának a módszere}: Tekintsük az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = b(t) \qquad (t \in I) + \] + inhomogén egyenletet, valamint a neki megfelelő + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = 0 \qquad (t \in I) + \] + homogén egyenletet. + + \noindent Legyen $\varphi_1, \varphi_2, \ldots, \varphi_n$ a homogén egyenlet egy alaprendszere. Ekkor az inhomogén egyenlet egy partikuláris megoldása előállítható a + \[ + \psi_{p}(t) = c_1(t)\varphi_{1}(t) + \ldots + c_n(t)\varphi_{n}(t) \qquad (t \in I) + \] + alakban, ahol a $c'(t) := (c'_{1}(t), \ldots, c'_{n}(t))^{T}$ függvénynek a következő lineáris algebrai egyenletrendszer a megoldásai + \begin{equation}\label{eu_eq8} + \Phi(t) \cdot c'(t) = \begin{array}{c} + 0 \\ + 0 \\ + \vdots \\ + b(t) + \end{array} \qquad (t \in I) + \end{equation} + ahol + \[ + \Phi(t) := \left[ \begin{array}{ccc} + \varphi_1(t) & \ldots & \varphi_n(t) \\ + \varphi'_1(t) & \vdots & \varphi'_n(t) \\ + \vdots & \ddots & \vdots \\ + \varphi_1^{n-1}(t) & \ldots & \varphi_n^{n-1}(t) + \end{array}\right] \qquad (t \in I) + \] + a Wronski-féle mátrix.\\ + + \noindent \emph{Megjegyzés}: A $\psi_{p}$ partikuláris megoldás előállításához tehát először meg kell oldani a (\ref{eu_eq8}) lineáris algebrai egyenletrendszert a $c'_{1}(t), \ldots, c'_{n}$ ismeretlen függvényekre, amelyekből már integrálással előállíthatók a számukra szükséges $c_1(t), c_2(t), \ldots, c_{n}(t)\ (t \in \mathbb{R})$ függvények.\\ + + \noindent \textbf{Tétel}. (\emph{Szuperpozíció elve}): Tegyük fel, hogy $\psi_{1}$ megoldása az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = b_1 + \] + egyenletnek, $\psi_2$ pedig megoldása az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = b_2 + \] + egyenletnek, akkor $\psi_1 + \psi_2$ megoldása az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = b_1 + b_2 + \] + egyenletnek.\\ + + \paragraph*{Az állandó együtthatós n-edrendű homogén lineáris differenciálegyenlet egy alaprendszerének az előállítása} + + \noindent Legyen $n \in \mathbb{N}$ és $a_0, a_1, \ldots, a_{n-1} \in \mathbb{R}$. Az + \begin{equation}\label{eu_eq9} + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = 0 + \end{equation} + feladatot \emph{n}\textbf{\emph{-edrendű állandó együtthatós homogén lineáris differenciálegyenletnek}} nevezzük.\\ + + \noindent \textbf{Tétel}. Tegyük fel, hogy az + \begin{equation}\label{eu_eq10} + x^{(n)} + a_{n-1}x^{(n-1)} + \ldots + a_{1}x' + a_{0}x = 0 \qquad (a_0, a_1, \ldots, a_{n-1} \in \mathbb{R}) + \end{equation} + egyenlet + \[ + K(z) = z^{n} + a_{n-1}z^{n-1} + \ldots + a_1z + a_0 + \] + karakterisztikus polinomjának a $\lambda$ szám $m$-szeres gyöke. Ekkor + \[ + \varphi_1(t) = e^{\lambda t},\ \varphi_2(t) = te^{\lambda t}, \ldots, \varphi_m(t) = t^{m-1}e^{\lambda t} \qquad (t \in \mathbb{R}) + \] + függvények a (\ref{eu_eq10}) egyenlet lineárisan független valós megoldásai. + + \paragraph*{Az állandó együtthatós n-edrendű inhomogén lineáris differenciálegyenlet egy partikuláris megoldásának az előállítása} + + \noindent \emph{Megjegyzés}: Az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = b(t) \qquad (t \in I) + \] + állandó együtthatós n-edrendű inhomogén lineáris differenciálegyenlet egy partikuláris megoldásának az előállításához felhasználhatjuk az állandók variálásának a módszerét. Ez elvben mindig célhoz vezet, azonban esetenként meglehetősen fáradságos, sok számolást igénylő eljárás. Ezért "megbecsülendők" azok a módszerek, amelyek révén más úton juthatunk el egy partikuláris megoldáshoz. Egy ilyen módszer a próbafüggvény-módszer, amelyik bizonyos speciális jobboldal, vagyis b függvény esetén alkalmazható.\\ + + \noindent \textbf{Tétel}. (\emph{Próbafüggvény-módszer}) Tekintsük az + \[ + x^{(n)}(t) + a_{n-1}x^{(n-1)}(t) + \ldots + a_{0}x(t) = P(t)e^{\alpha t}\big(c \sin{(\beta t)} + d \cos (\beta t)\big) \qquad (t \in \mathbb{R}) + \] + egyenletet, ahol $a_0, a_1, \ldots, a_{n-1};c;d;\alpha;\beta$ valós számok és $P$ egy polinom.\\ + + \noindent Legyen $\mu := \alpha + i\beta$ és\\ + $\tilde{k} := \left\{\begin{array}{cl} + 0, & \text{ha}\ \mu\ \text{nem gyöke a homogén egyenletrendszer karakterisztikus polinomjának}\\ + k, & \text{ha}\ \mu\ \text{\emph{k}-szoros gyöke a homogén egyenletrendszer karakterisztikus polinomjának} + \end{array}\right. + $ + + \noindent Ekkor az egyenletnek létezik + \[ + \psi_{p}(t) = t^{\tilde{k}}G(t) \cdot e^{\alpha t}\big(A \sin(\beta t) + B \cos (\beta t)\big) + \] + alakú megoldása, ahol $A, B \in \mathbb{R}$ és $G$ egy legfelejebb $deg(P)$-edfokú polinom. + +% \paragraph*{n-ed rendű lineáris differenciálegyenletek} + +% \noindent Legyen $n \in \mathbb{N},\ I \subset \mathbb{R}$ nyílt intervallum, és tegyük fel, hogy az $a_i : I \to \mathbb{R}\ (i = 0,1,\ldots, n-1)$ és a $b: I \to \mathbb{R}$ függvények folytonosak. Ekkor az +% \[ +% x(n) + a_{n-1}x(n-1) + \ldots + a_1x' + a_0x = b +% \] +% feladatot $n$-edrendű lineáris differenciálegyenletnek nevezzük. Ha $b \equiv 0$, akkor az egyenlet homogén, ellenkező esetben inhomogén. Állandó együtthatós az egyenlet, ha az $a_i\ (i = 0,1,\ldots,n-1)$ együtthatók valós számok.\\ + +% \section*{Lin diff egyenletek másképp} + +% \subsection*{Lineáris differenciálegyenletek} + +% \noindent Legyen $y$ az ismeretlen $g$ és $h$ pedig ismert egyváltozós függvények. Ekkor az +% \[ +% y' + g(x)y = h(x) +% \] +% alakra hozható differenciálegyenletet \textbf{\emph{elsőrendű lineáris differenciálegyenlet}}nek nevezzük.\\ + +% \noindent Például: +% \begin{itemize} +% \item $y' + (x-2)y = x^2 -3x + 16$\ -\ \text{lineáris} +% \item $y' + 2y^2 = x^3 - 1$\ -\ \text{nem lineáris} +% \end{itemize} + +% \noindent Legyen $y$ az ismeretlen $f$ és $g$ pedig ismert egyváltozós függvények. Ekkor az +% \[ +% y' = f(x)g(y) +% \] +% alakra hozható differenciálegyenletet \textbf{\emph{szétválasztható változójú differenciálegyenlet}}nek nevezzük.\\ + + +% \noindent Az \emph{elsőrendű lineáris differenciálegyenlet} \emph{\textbf{homogén}}, ha a következő alakra hozható. +% \[ +% y' + g(x)y = 0 \qquad (\text{azaz}\ h\ \text{zavaró függvény} \equiv 0) +% \] + +% \noindent \emph{Megjegyzés}: A lineáris jelző arra utal, hogy $y$ és $y'$ mindegyike csak első hatványon szerepel a differenciálegyenletben.\\ + +% \noindent Az elsőrendű lineáris differenciálegyenlet állandó együtthatójú, ha a differenciálegyenlet +% \[ +% y' + g(x)y = h(x) +% \] +% alakjában a $g(x)$ függvény konstans, azaz az egyenlet a következő alakú +% \[ +% y' + ky = h(x) +% \] + +% \noindent \textbf{Tétel}. Az $y' + ky = 0$ elsőrendű állandó együtthatós lineáris homogén differenciálegyenlet általános megoldása: +% \[ +% y = Ce^{-kx} +% \] + +% \noindent --------------------- +% \begin{description} +% \item[Definíció] \hfill \\ +% A lineáris differenciálegyenlet olyan differenciálegyenlet, melyre:\\ +% $ n=1, \quad I,I_1 \subset \R $ nyílt intervallumok, $f:I\times I_1 \rightarrow \R$, ahol \\ +% $g,h : I \rightarrow \R, \ g,h \in C, \ I_1 := \R$ és \\ +% $f(x,y) := g(x)\cdot y + h(x) \quad (x \in I, y \in I_1 = \R) $\\ +% $ \Rightarrow \varphi'(x) = f(x, \varphi(x)) = g(x) \cdot \varphi(x) + h(x) \quad (x \in D_{\varphi})$ +% \item[Homogenitás] \hfill \\ +% A lineáris differenciálegyenlet homogén ha $ h \equiv 0$ (különben inhomogén) +% \item[Kezdeti érték probléma] \hfill +% \begin{itemize} +% \item Minden lineáris differenciálegyenletre vonatkozó kezdeti érték probléma megoldható és \\ +% $\forall \varphi, \psi $ megoldásokra: $ \varphi(t) = \psi(t) \quad (t \in D_{\varphi} \cap D_{\psi} )$ +% \item Minden homogén lineáris differenciálegyenlet ($\varphi : I \rightarrow \R$) megoldása a következő alakú: \\ +% $ c\varphi_0$, ahol \\ +% $c \in \R$ és $\varphi_0(t) = e^{G(t)} \quad (G:I\rightarrow\R, \ G \in D, $ és $ G' = g)$ +% \item Állandók variálásának módszere:\\ +% $ \exists m:I\rightarrow\R, \ m \in D : m\cdot\varphi_0$ megoldása az (inhomogén) lineáris differenciálegyenletnek +% \item Partikuláris megoldás: \\ +% $M := \Big\{ \varphi : I \rightarrow \R : \varphi'(t) = g(t)\cdot\varphi(t) + h(t) \ (t \in I)\Big\} $ \\ +% $M_h := \Big\{ \varphi : I \rightarrow \R : \varphi'(t) = g(t)\cdot\varphi(t) \ (t \in I)\Big\} $\\ +% $\Rightarrow \forall \psi \in M : M = \psi + M_h = \Big\{\varphi + \psi : \varphi \in M_h\Big\}$\\ +% (És itt $\psi$ az előzőek alapján $m\cdot\varphi_0$ alakban írható) +% \item Példa: Radioaktív bomlás: \\ +% $ m_0 > 0$ - kezdeti anyagmennyiség \\ +% $ m \in \R \rightarrow \R $ - tömeg-idő függvénye, ahol \\ +% $m(t)$ - a meglévő anyag mennyisége \\ +% $ m \in D \Rightarrow \dfrac{m(t) - m(t+\Delta t)}{\Delta t} \quad (\Delta t \neq 0) $ - átlagos bomlási sebesség \\ +% $ \dfrac{m(t) - m(t+\Delta t)}{\Delta t} \xrightarrow[\Delta t \rightarrow 0]{} -m'(t) $, ami megfigyelés alapján $ \approx m(t)$ \\ + +% azaz: \\ +% $ m'(t) = - \alpha \cdot m(t) \quad (t\in\R, 0 < \alpha \in \R)$\\ +% $ m(0) = m_0 $ \\ +% \rule{3cm}{0.2pt} \\ +% Homogén lineáris differenciálegyenlet (kezdeti érték probléma): \\ +% $ g \equiv -\alpha, \ \tau :=0, \ \xi := m_0 $ \\ +% $ \Rightarrow G(t) = -\alpha t \quad (t\in\R) \Rightarrow \varphi_0(t) = e^{-\alpha t} \quad (t \in \R)$ \\ +% $ \Rightarrow \exists c \in \R : m(t) = c\cdot e^{-\alpha t} \quad (t \in \R)$, ahol \\ +% $m(0) = c = m_0 \Longrightarrow m(t) = m_0e^{-\alpha t} \quad (t \in \R)$ \\ +% Ha $ T \in \R : m(T) = \dfrac{m_0}{2} $ (felezési idő) \\ +% $\Rightarrow \dfrac{m_0}{2} = m_0e^{-\alpha T} \Rightarrow \dfrac{1}{2} = e^{-\alpha T} \Rightarrow e^{\alpha T} = 2$ \\ +% $\Rightarrow T = \dfrac{ln(2)}{\alpha} $ +% \end{itemize} +% \end{description} +% \subsection*{Magasabb rendű lineáris differenciálegyenletek} +% \begin{description} +% \item[Definíció] \hfill \\ +% $ 0 < n \in \mathbb{N}, I \subset \R$ nyílt, $ a_0, \ldots ,a_{n-1} :I \rightarrow \R$ folytonos és $ c: I \rightarrow \R$ folytonos. \\ +% Keressünk olyan $ \varphi \in I \rightarrow \mathbb{K}$ függvényt, melyre: +% \begin{itemize} +% \item $ \varphi \in D^n$ +% \item $ D_{\varphi}$ nyílt intervallum +% \item $ \varphi^{(n)}(x) + \sum\limits_{k=0}^{n-1}a_k(x) \cdot \varphi^{(k)}(x) = c(x) \quad (x \in D_{\varphi}) $ +% \end{itemize} + +% Ezt $n$-edrendű lineáris differenciálegyenletnek nevezzük. ($n=1$ esetben Lineáris diff. egyenlet). Ha még: \\ +% $ \tau \in I, \ \xi_0, \ldots , \xi_{n-1} \in \mathbb{K}$ és +% \begin{itemize} +% \item $ \tau \in D_{\varphi}$ és $ \varphi^{(k)}(\tau) = \xi_k \quad (k = 0\ldots,n-1) $ +% \end{itemize} +% Akkor Kezdeti érték problémáról beszélünk. + +% \item[Homogenitás] \hfill \\ +% Amennyiben $c(x) = 0$ homogén $n$-edrendű lineáris differenciálegyenletről beszélünk. Tehát homogén és inhomogén egyenletek megoldásainak halmazai: \\ +% $ M_h := \Big\{\varphi : I \rightarrow \mathbb{K} : \varphi \in D^n, \ \varphi^{(n)} + \sum\limits_{k=0}^{n-1}a_k\cdot\varphi^{(k)} = 0 \Big\} $ \\ +% $ M := \Big\{\varphi : I \rightarrow \mathbb{K} : \varphi \in D^n, \ \varphi^{(n)} + \sum\limits_{k=0}^{n-1}a_k\cdot\varphi^{(k)} = c \Big\} $ \\ +% (Itt $M_h \ n$-dimenziós lineáris tér, így valamilyen $ \varphi_1,\ldots,\varphi_n \in M_h$ bázist, más néven alaprendszert alkot.) +% \item[Állandó együtthatós eset] \hfill \\ +% Ebben az esetben $a_0,\ldots,a_{n-1} \in \R$ +% \begin{itemize} +% \item Karakterisztikus polinom szerepe \\ +% Legyen $P(t) := t^n + \sum\limits_{k=0}^{n-1}a_kt^k \quad (t \in \mathbb{K})$ karakterisztikus polinom és \\ +% $ \varphi_\lambda(x) := e^{\lambda x} \quad (x \in \R, \lambda \in \mathbb{K}) $ \\\\ +% Ekkor: $ \varphi_\lambda \in M_h \Longleftrightarrow P(\lambda) = 0 $\\ +% Sőt ha $ \lambda $ $r$-szeres gyöke $P$-nek, és \\ +% $ \varphi_{\lambda,j}(x) := x^je^{\lambda x} \ (j = 0..r-1, x\in\R)$, akkor: +% $ \varphi_{\lambda,j} \in M_h \Longleftrightarrow \varphi_{\lambda, j}^{(n)}+\sum\limits_{k=0}^{n-1}a_k\varphi_{\lambda, j}^{(k)} $ \\ +% azaz $P(\lambda)^{(j)} = 0 \quad (j = 0..r-1)$ +% \item Valós megoldások \\ +% Legyen $ \lambda = u+iv \quad (u,v \in \R, v\neq0, i^2 = -1) $ \\ +% $ \Rightarrow $ az $ x \mapsto x^je^{ux}cos(vx)$, és $x \mapsto x^je^{ux}sin(vx)$ függvények valós alaprendszert (bázist) alkotnak ($M_h$-ban) +% \end{itemize} +% \item[Példa: Rezgések] \hfill \\ +% Írjuk le egy egyenes mentén, rögzített pont körül rezgőmozgást végző $m$ tömegű tömegpont mozgását, ha ismerjük a megfigyelés kezdetekor elfoglalt helyét és az akkori sebességét! \\ +% $ \varphi \in \R \rightarrow \R, \varphi \in D^2$ : kitérés-idő függvény \\ +% $ m > 0 $ : tömeg \\ +% $ F \in \R \rightarrow \R $ : kitérítő erő \\ +% $ \alpha > 0 $ : visszatérítő erő, mely arányos $ \varphi $-vel \\ +% $ \beta \geq 0 $ : fékezőerő, mely arányos a sebességgel. \\ +% $ \Longrightarrow $ (Newton-féle mozgástörvény alapján):\\ +% $ m \cdot \varphi'' = F - \alpha\varphi-\beta\varphi'$\\ +% $ \varphi(0) = s_0, \varphi'(0) = s'_0 $\\ +% \rule{4cm}{0.2pt} \\ +% Másodrendű lineáris differenciál egyenlet (kezdeti érték probléma)\\ +% Standard alakba írva: $ \varphi'' + \dfrac{\beta}{m}\varphi' + \dfrac{\alpha}{m}\varphi = \dfrac{F}{m} $ + +% Tekintsük kényszerrezgésnek a periodikus külső kényszert, amikor: \\ +% $ \dfrac{F(x)}{m} = Asin(\omega x ) \quad [A>0$ (amplitúdó), $ \omega > 0$ (kényszerfrekvencia)] \\ +% Ekkor $ \omega_0 := \sqrt{\dfrac{\beta}{m}} $ - saját frekvencia\\ +% és $\varphi''(x) + \omega_0^2\varphi(x) = Asin(\omega x) $ \\ +% Melynek karakterisztikus polinomja : $ P(t) = t^2+\omega_0^2 \quad (t \in \R) $ \\ +% Megoldásai: $ \lambda = \pm \ \omega_0i $ \\ + +% Korábban láttuk, hogy ha $ \lambda = u+iv$ akkor $ x \mapsto x^je^{ux}cos(vx)$, és $x \mapsto x^je^{ux}sin(vx)$ függvények valós alaprendszert (bázist) alkotnak ($M_h$-ban). Így $ \varphi(x) = c_1cos(\omega_0x) + c_2sin(\omega_0x) $ alakban írható mely fázisszög segítségével: $ d\cdot sin(\omega_0x+\delta) \quad (d = \sqrt{c_1^2+c_2^2}, \delta \in \R)$ alakra átírható. Így: \\ +% $ M_h = \Big\{ d\cdot sin(\omega_0x+\delta)\Big\}$ + +% Ekkor már könnyen megadhatunk egy partikuláris megoldást: +% \begin{itemize} +% \item $\omega \neq \omega_0$ esetén partikuláris megoldás: \\ +% $ x \rightarrow q\cdot sin(\omega x) $\\ +% És $ q = \dfrac{A}{\omega_0^2-\omega^2} $ kielégíti a $-q\omega^2sin(\omega x)+\omega_0^2q\cdot sin(\omega x) = Asin(\omega x) $ egyenletet. +% Tehát: \\ +% $ \varphi(x) = d\cdot sin(\omega_0x + \delta)+\dfrac{A}{\omega_0^2-\omega^2}sin(\omega x) $ megoldás két harmonikus rezgés összege. +% \item $ \omega = \omega_0 $ (rezonancia) esetén partikuláris megoldás: \\ +% $ x \rightarrow qx\cdot cos(\omega x) $\\ +% És $ q = \dfrac{-A}{2\omega} $ kielégíti a $-2q\omega \cdot sin(\omega x)- q\omega^2x\cdot cos(\omega x) +\omega^2qx\cdot cos(\omega x) = Asin(\omega x) $ egyenletet. +% Tehát: \\ +% $ \varphi(x) = d\cdot sin(\omega x + \delta)-\dfrac{A}{2\omega}x\cdot cos(\omega x) $ megoldás egy harmonikus és egy aperiodikus rezgés összege.\\ +% (Ebben az esetben az idő (x) elteltével a $\varphi $ értéke nő. Bizonyos modellekben ez a "rendszer szétesését" idézi elő) +% \end{itemize} +% \end{description} +\newpage + \subsection*{Kiegészítés} + + \paragraph*{Darboux-integrál} + + \noindent Legyen$ -\infty < a < b < \infty$ és $, f:[a,b] \rightarrow \R, f $ korlátos függvény + + \noindent A $ \{a,b\} \subset \tau \subset [a,b]$ véges halmaz egy felosztása $[a,b]$-nek. \\ + + \noindent Ha $\tau$ n+1 elemű és elemeit $x_0, x_1, \ldots, x_n$ jelöli, akkor $\tau = \Big\{x_0, x_1, \ldots, x_n \Big\} $, ahol + \[ + a := x_0 < x_1 < \ldots < x_n := b \qquad (n \in \mathbb{N}) + \] + + \noindent Megjegyzés: Az intervallumok nem feltétlenül azonos hosszúságúak.\\ + + \noindent Továbbá legyen:\\ + \[ + m_i := m_i(f) := \inf\Big\{f(x): x_i \leq x \leq x_{i+1} \Big\} = \inf f(x_{i+1} - x_i) \qquad (i = 0,\ldots,n-1) + \] + \[ + M_i := M_i(f) := \sup\Big\{f(x): x_i \leq x \leq x_{i+1} \Big\} = \sup f(x_{i+1} - x_i) \qquad (i = 0,\ldots,n-1) + \] + + \noindent valamint\\ + \noindent az $f$ függvény $\tau$-hoz tartozó alsó integrálközelítő összege\\ + \[ + s(f, \tau) := \sum\limits_{i=0}^{n-1} m_i\big(x_{i+1} - x_i\big) + \] + \noindent az $f$ függvény $\tau$-hoz tartozó felső integrálközelítő összege + \[ + S(f, \tau) := \sum\limits_{i=0}^{n-1} M_i\big(x_{i+1} - x_i\big) + \] + + \noindent Példa felosztás finomítására: 3, 7, 44\\ + $\begin{array}{ccc} + \includegraphics[width=0.32\textwidth]{img/interval_3.png} & \includegraphics[width=0.32\textwidth]{img/interval_7.png} \includegraphics[width=0.32\textwidth]{img/interval_44.png} + \end{array}$\\ + + \noindent Legyen $ \Gamma := \Big\{ \tau \subset [a,b] $ felosztás $\Big\}$ $[a,b]$ intervallum felosztásainak halmaza.\\ + + \noindent Legyen $\tau_1 \in \Gamma$ és $\tau_2 \in \Gamma$ felosztásai $[a,b]$-nek. Azt mondjuk, hogy $\tau_2$ finomítása $\tau_1$-nek, ha $\tau_1 \subset \tau_2$. + \noindent A $\tau_1$ és $\tau_2$ közös finomítása $\tau_1 \cup \tau_2$.\\ + + \noindent Ha $f:[a,b] \to \mathbb{R}$ korlátos és $\tau_1 \subset \tau_2$ az $[a,b]$ felosztásai, akkor + \[ + s(f, \tau_1) \leq s(f, \tau_2) \wedge S(f, \tau_1) \geq S(f, \tau_2) + \] + Így, ha $\tau_1, \tau_2 \in \Gamma$ tetszőleges felosztás (nem feltételenül egymás finomításai), akkor + \[ + s(f, \tau_1) \leq s(f, \tau_1 \cup \tau_2) \leq S(f, \tau_1 \cup \tau_2) \leq S(f, \tau_2) + \] + emiatt\\ + + \noindent Az $ \Big\{ s(f, \tau): \tau \in \Gamma \Big\} $ felülről korlátos, illetve az $ \Big\{ S(f, \tau): \tau \in \Gamma \Big\} $ alulról korlátos.\\ + + \noindent Ha $f:[a,b] \to \mathbb{R}$ korlátos, az + + \[ + I_*(f) := sup\Big\{ s(f, \tau) : \tau \in \Gamma \Big\} + \] + \[ + I^*(f) := inf\Big\{ S(f, \tau) : \tau \in \Gamma \Big\} + \] + valós számokat az $f$ függvény ($[a,b]$ intervallumon vett) alsó, illetve felső Darboux-integráljának nevezzük.\\ + + \noindent A definíciók alapján: $\forall \tau_1, \tau_2 \in \Gamma : s(f, \tau_1) \leq I_*(f) \leq I^*(f) \leq S(f, \tau_2) $\\ + + \noindent Az $ f $ függvény Riemann-integrálható, ha $ I_*(f) = I^*(f) $, ekkor legyen \\ + \[ + \bigintssss_{a}^{b}f := \bigintssss_{[a,b]}f := \bigintssss_{a}^{b}f(x) dx := I_*(f) = I^*(f) + \] + az $f$ függvény Riemann-integrálja (határozott integrálja). Jelölése: $ f \in \mathcal{R}[a,b].$\\ + + \noindent \emph{Megjegyzés}: A határozott integrál ez esetben egy valós szám, míg a határozatlan integrál primitív függvények összessége.\\ + + \paragraph*{Parciális integrálás} + + \noindent \emph{Példa (1)}: $\bigintssss{x \cdot e^x dx}$\\ + Legyen + $\begin{array}{c|c} + f = e^{x} & g' = x \\ \hline + f' = e^{x} & g = \bigintssss x dx \\ + \end{array}$\\ + + \noindent Ekkor a választás nem megfelelő, mert ebben az esetben $\bigintssss x \cdot e^x = e^{x} \cdot \ddfrac{x^2}{2} - \bigintssss{e^{x} \cdot \ddfrac{x^2}{2}}$.\\ + + \noindent Itt most $x$ helyett lett egy $x^2$, ami semmiképp sem tekinthető egyszerűbb alaknak.\\ + + \noindent Ezért $\bigintssss{e^x \cdot x dx}$ legyen + $\begin{array}{c|c} + f = x & g' = e^{x} \\ \hline + f' = 1 & g = e^{x} \\ + \end{array}$\\ + Ekkor + \[ + \bigintssss{x \cdot e^x dx} = x \cdot e^x - \bigintssss{1 \cdot e^x dx} = x \cdot e^x - e^x + C + \] + + \noindent \emph{Példa (2)}: $\bigintssss{x^2 \cdot e^x dx}$\\ + Legyen + $\begin{array}{c|c} + f = x^2 & g' = e^{x} \\ \hline + f' = 2x & g = e^{x} \\ + \end{array}$\\ + Ekkor + \[ + \bigintssss{x^2 \cdot e^x dx} = x^2 \cdot e^x - \underbrace{\bigintssss{2x \cdot e^x dx}}_{\text{ez tovább egyszerűsíthető}} = + \] + $\begin{array}{c|c} + f = 2x & g' = e^{x} \\ \hline + f' = 2 & g = e^{x} \\ + \end{array}$\\ + \[ + \bigintssss{2x \cdot e^x dx} = 2x \cdot e^x - 2 \bigintssss{e^x} + \] + Ezt visszahelyettesítve + \[ + \bigintssss{x^2 \cdot e^x dx} = x^2 \cdot e^x - \Big(2x \cdot e^x - 2 \bigintssss{e^x}\Big) + C = + \] + + \noindent Jellemzően, ha a függvény $x^{n} \cdot (e^{x}|\sin x|\cos x)$, akkor az $x^{n}$ legyen az $f$. $x^{n} \cdot (\ln x|\arctan x|\log x)$ esetén pedig fordítva.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize\\ + \noindent Alapvetően 3 típust különböztetünk meg az integrandus alapján: + \begin{itemize} + \item Hatványfüggvénnyel szorzott exponenciális, trigonometrikus, hiperbolikus függvények\\ + + Ekkor mindig a hatványfüggvényt érdemes $f$-nek, a másik szorzótényezőt pedig $g \textquotesingle$-nek elnevezni. + \[ + Pl: \bigintssss 5x \sinh 2x dx = \ddfrac{5x \cos 2x}{2} - \bigintssss \ddfrac{5 \cosh 2x}{2}dx = \ddfrac{5x \cosh 2x}{2} - \ddfrac{5 \sinh 2x}{4} + \] + \emph{Megjegyzés}: Ha a hatványfüggvény 1-nél magasabb fokú, akkor többször egymás után kell alkalmaznunk a módszert. + \item Logarimus-, area-, arcus függvények és ezekkel szorzott hatványfüggvények.\\ + + Ekkor mindig a logaritmus függvényt érdemes $f$-nek és a másik szorzótényezőt $g \textquotesingle$-nek elnevezni. + \[ + Pl: \bigintssss -2x \ln x dx = -x^2 \ln x - \bigintssss -x^2\ddfrac{1}{x} dx = -2 x^2 \ln x + \ddfrac{x^2}{2} + \] + \item Exponenciális függvény és trigonometrikus, illetve hiperbolikus függvények szorzata\\ + + Ekkor a választásunk tetszőleges, minden esetben célhoz érünk, ha a módszert kétszer egymás után alkalmazzuk, majd a kiindulást a kapott eredménnyel összehasonlítjuk. + \begin{center} + $Pl:\ \bigintsss e^x \sin x dx = -e^x \cos x + \bigintsss e^x \cos x dx = -e^x \cos x + e^x \sin x - \bigintsss e^x \sin x dx$\\ + $\Downarrow$ \\ + $\bigintsss e^x \sin x dx = \ddfrac{-e^x \cos x + e^x \sin x}{2}$ + \end{center} + \end{itemize} + + \noindent Megjegyzés: Szögfüggvények szorzatát is lehet parciálisan integrálni, ám ekkor sokszor a szorzat megfelelő átalakítások után összeggé alakítható, így sokszor azt célszerűbb integrálni. \\ + $\triangleleft$ \faLightbulbO}\\ + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/hurmodszer.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/hurmodszer.png new file mode 100644 index 0000000..1f4b314 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/hurmodszer.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/newton_pelda.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/newton_pelda.png new file mode 100644 index 0000000..a758d5a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/newton_pelda.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/szelomodszer.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/szelomodszer.png new file mode 100644 index 0000000..bace934 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/img/szelomodszer.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.pdf new file mode 100644 index 0000000..70409f6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.tex new file mode 100644 index 0000000..33e4783 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/03.Numerikus módszerek/tetel3.tex @@ -0,0 +1,1797 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper,bindingoffset=0.2in, + left=1.5cm,right=1.5cm,top=1.25cm,bottom=1.5cm,% + footskip=.35in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{collectbox} +\usepackage{comment} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{makecell} +\usepackage{pgfplotstable} +\usepackage{tikz} +\usepackage{titlesec} +\usepackage[magyar]{babel} + +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\titleformat*{\section}{\Large\bfseries} +\titleformat*{\subsection}{\large\bfseries} +\titleformat*{\subsubsection}{\normalsize\bfseries} +\titleformat*{\paragraph}{\small\bfseries} +\titleformat*{\subparagraph}{\footnotesize\bfseries} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + +\newcommand{\mybox}{% + \collectbox{% + \setlength{\fboxsep}{4pt}% + \fbox{\BOXCONTENT}% + }% +} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{3. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + \begin{center} + {\Large\bfseries\noindent 3. Numerikus módszerek} \\ + \end{center} + + \section*{Iterációs módszerek: Lineáris egyenletrendszerekre és nemlineáris egyenletekre.} + + \textbf{Definíció.} Egy $m$ egyenletből álló, $n$-ismeretlenes \emph{lineáris egyenletrendszer általános alakja}: + \[ + \begin{array}{ccccccccc} + a_{11}x_{1} & + & a_{12}x_{2} & + & \ldots & + & a_{1n}x_{n} & = & b_{1} \\ + a_{21}x_{1} & + & a_{22}x_{2} & + & \ldots & + & a_{2n}x_{n} & = & b_{2} \\ + & & & & & & \vdots & \vdots & \vdots \\ + a_{m1}x_{1} & + & a_{m2}x_{2} & + & \ldots & + & a_{mn} & = & b_{m} \\ + \end{array} + \] + + \noindent Az egyenletrendszer átírható $A\underline{x} = \underline{b}$ formába is, ahol\\ + \[ + A = \left( + \begin{array}{cccc} + a_{11} & a_{12} & \ldots & a_{1n} \\ + a_{11} & a_{22} & \ldots & a_{2n} \\ + \vdots & \vdots & \ddots & \vdots \\ + a_{m1} & a_{m2} & \ldots & a_{mn} \\ + \end{array} + \right), \quad + \underline{x} = \left( + \begin{array}{c} + x_{1} \\ + x_{2} \\ + \vdots \\ + x_{m} \\ + \end{array} + \right), \quad + \underline{b} = \left( + \begin{array}{c} + b_{1} \\ + b_{2} \\ + \vdots \\ + b_{m} \\ + \end{array} + \right) + \]\\ + + \noindent Az $a_{ij}$ együtthatókból képzett $A$ mátrixot az egyenletrendszer \emph{együtthatómátrixa}. Ha ezt kibővítjük a $\underline{b}$ vektor $b_{i}$ komponenseiből képzett oszlopvektorral, akkor az egyenletrendszer $m \times (n+1)$-es \emph{kibővített mátrixát} kapjuk, amit $A|\underline{b}$-vel jelölünk.\\ + \[ + A|\underline{b} = \left( + \begin{array}{ccccc} + a_{11} & a_{12} & \ldots & a_{1n} & b_{1} \\ + a_{11} & a_{22} & \ldots & a_{2n} & b_{2} \\ + \vdots & \vdots & \ddots & \vdots & \vdots \\ + a_{m1} & a_{m2} & \ldots & a_{mn} & b_{n} \\ + \end{array} + \right) + \]\\ + + \noindent \textbf{Tétel 1.} (Kronecker–Capelli-tétel): Az $A\underline{x} = \underline{b}$ \emph{akkor és csak akkor megoldható}, ha az $A$ együtthatómátrix és az $A|\underline{b}$ kibővített mátrix rangja megegyezik: $\boldsymbol{r(A) = r(A|\underline{b})}$.\\ + + \noindent \textbf{Tétel 2.} Ha az egyenletrendszer megoldható és + \begin{itemize} + \item $r(A) < n$, akkor végtelen sok megoldás van, ha + \item $r(A)=n$, akkor egyértelmű a megoldás. + \end{itemize} + + \section*{Lineáris egyenletrendszerek iterációs módszerei} + + \noindent A lineáris algebrai egyenletrendszerek megoldási módszerei:\emph{direkt} illetve az \emph{iterációs módszerek}. Direkt módszereknek azokat a módszereket nevezzük, amelyekkel pontosan számolva az egyenletrendszer pontos megoldását kapnánk. Ezek közé tartoznak az eliminációs módszerek, a felbontási módszerek és a Cramer-szabály. Hátrányuk, hogy csak kisebb méretű egyenletrendszerek oldhatók meg velük reális időn belül. Így a gyakorlati feladatok esetén (amelyekben gyakran nagy méretű az együtthatómátrix) az iterációs módszereket használjuk, melyek nagy előnye a direkt módszerekkel szemben a kisebb tárigény, valamint kihasználhatók a gyakran meglévő hozzávetőleges információk is a megoldás várható értékeiről.\\ + + \noindent Tegyük fel, hogy az $A\underline{x}=\underline{b}$ egyenletrendszer együtthatómátrixa négyzetes ($A \in \mathbb{R}^{n \times n}$) és determinánsa nullától különbözik ($det A \neq 0$). Ekkor az 2. tételből következően az egyenletrendszernek egyetlen megoldása létezik. Az iterációs módszerek ezen egyértelmű megoldás közelítő meghatározására adnak lehetőséget.\\ + + \noindent Az iterációs módszerek általában olyan konvergens sorozatot konstruálnak, melyek határértéke az egyenletrendszer megoldása.\\ + + \noindent A lineáris egyenletrendszert (LER) vektorsorozatokkal közelítjük, törekedve a minél gyorsabb konvergenciára. + Az iterációs módszereknek a lényege a következő átalakítás: + \[ + \mybox{$A\underline{x} = \underline{b} \Longleftrightarrow \underline{x} = B\underline{x} + \underline{r}$} + \] + Ilyen alak létezik, sőt nem egyértelmű, hanem sokféle lehet, és a különböző átalakítások szolgáltatják a különféle iterációs módszereket. A $B$-t \emph{átmenetmátrixnak} nevezzük.\\ + + \noindent \textbf{Kontrakció}: A $\varphi: \mathbb{R}^{n} \to \mathbb{R}^{n}$ függvény \emph{kontrakció}, ha + \begin{center} + $\exists 0 \leq q < 1 : \forall \underline{x}, \underline{y} \in \mathbb{R}^{n}: \Vert \varphi(\underline{x}) - \varphi(\underline{y}) \Vert \leq q \Vert \underline{x} - \underline{y} \Vert$ + \end{center} + \noindent A $q$ értéket \emph{kontrakciós együtthatónak} nevezzük.\\ + + \noindent Példa kontrakcióra: $\ddfrac{1}{2}\cos x,\ x \in [0,\ddfrac{\pi}{2}]$ \Big| $\ddfrac{3 - x^2}{3},\ x \in [0,1]$ \Big| $2 + e^{-x},\ x \in [1, +\infty)$.\\ + + \noindent \textbf{Banach-féle fixponttétel}: Legyen $\varphi: \mathbb{R}^{n} \to \mathbb{R}^{n}$ kontrakció a $q$ + kontrakciós együtthatóval.\\ + + \noindent Ekkor a következő állítások igazak: + + \begin{enumerate} + \item $\exists! \underline{x}^{*} \in \mathbb{R}^{n}: \underline{x}^{*} = \varphi(\underline{x}^{*})$. Azt mondjuk, hogy $\underline{x}^{*}$ az $\varphi$ függvény + fixpontja. + + \item $\forall \underline{x}^{(0)} \in \mathbb{R}^{n}$ kezdőérték esetén az $\underline{x}^{(k+1)} = \varphi(\underline{x}^{(k)}) \quad (k \in \mathbb{N})$ rekurzióval definiált sorozat konvergens, és a határértéke az $\underline{x}^{*}$, azaz + \[ + \lim \limits_{k\to\infty} \underline{x}^{(k)} = \underline{x}^{*} + \] + + \item teljesül az alábbi hibabecslés: + \begin{center} + $\Vert \underline{x}^{(k)} - \underline{x}^{*}\Vert \leq \ddfrac{q^{k}}{1-q} \Vert \underline{x}^{(1)} - \underline{x}^{(0)}\Vert$. + \end{center} + \end{enumerate} + + \noindent Az egyenletrendszer megoldása így az $\varphi: \mathbb{R}^{n} \rightarrow \mathbb{R}^{n},\ \varphi(\underline{x}) = B\underline{x} + \underline{r}$ függvény fixpontjának keresésére vezethető vissza.\\ + + \noindent Ez esetben tehát csak azt kell biztosítani, hogy $\varphi$ kontrakció legyen, és csak alkalmazni kell rá a fixpont tételt. + \[ + \boldsymbol{\Vert \varphi(x) - \varphi(y) \Vert} = \Vert B\underline{x} + \underline{r} - (B\underline{y}+\underline{r}) \Vert = \Vert B\underline{x} - B\underline{y} \Vert \boldsymbol{= \Vert B(\underline{x} - \underline{y}) \Vert \leq \Vert B \Vert \Vert x - y \Vert} + \] + + \noindent Tehát, ha a $B$ mátrix valamely indukált vagy illeszkedő normája kisebb egynél, akkor az $\varphi$ függvény kontrakció, és a fixponttétel alkalmazható.\\ +\newpage + \noindent \textbf{Tétel:} (\textbf{\emph{Elégséges feltétel a konvergenciára}}): Ha a lineáris egyenletrendszer $B$ \lword{átmenetmátrixára} $\Vert B \Vert < 1$, akkor tetszőleges $\underline{x}^{(0)}$-ból indított $\underline{x}^{(k+1)} := B\underline{x}^{(k)} + \underline{r}$ iteráció konvergál az $A\underline{x} = \underline{b}$ lineáris egyenletrendszer megoldásához.\\ + + \noindent A konvergencia vizsgálatakor lehet, hogy a fenti elégséges feltétel nem teljesül, ezért nézzük a konvergencia szükséges és elégséges feltételét.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \textbf{Lemma.} Legyen $B \in \mathbb{R}^{n \times n}$. Ekkor $\forall \varepsilon > 0$ esetén $\exists \Vert B \Vert$ indukált norma, úgy hogy + \[ + \Vert B \Vert < \rho(B) + \varepsilon + \] + + \noindent ahol $\rho(B)$ a $B$ mátrix spektrálsugara, vagyis + + \[ + \rho(B) = \inf\limits_{\Vert \ \Vert \text{indukált}} \Vert B \Vert \qquad \forall B \in \mathbb{R}^{n \times n} + \] + \noindent $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Tétel:} (\textbf{\emph{Szükséges és elégséges feltétel a konvergenciára}}): + Tetszőleges $\underline{x}^{(0)} \in \mathbb{R}^{n}$-ból indított $\underline{x}^{(k+1)} := B\underline{x}^{(k)} + \underline{r}$ iteráció konvergál az $A\underline{x} = \underline{b}$ lineáris egyenletrendszer megoldásához $\Longleftrightarrow \rho(B) < 1$.\\ + + \noindent Tehát a következőkben a különböző iterációs eljárások esetén az $\underline{x} = B\underline{x} + \underline{r}$ átalakítás után képezzük az $\underline{x}^{(k+1)} = B\underline{x}^{(k)} + \underline{r}$ iterációt valamilyen $\underline{x}^{(0)}$ kezdőértékkel. + + \subsection*{Jacobi-iteráció} + + \noindent Vegyük az $A\underline{x}=\underline{b}$ egyenletrendszert, és tegyük fel, hogy $A \in \mathbb{R}^{n \times n}$ és $det(A) \neq 0$. Ekkor az egyenletrendszernek létezik egyértelmű megoldása.\\ + + \noindent Írjuk fel az egyenletrendszer komponensenkénti alakját: + \begin{center} + $A\underline{x}=\underline{b} \Leftrightarrow a_{i,1}x_1 + \ldots + a_{i,n}x_{n} = b_i\qquad (i = 1, \ldots, n) \quad (1)$ + \end{center} + + \noindent Tegyük fel, hogy $a_{ii} \neq 0 \quad (i = 1, \ldots, n)$.\\ + + \noindent Ekkor az $(1)$ átírható $a_{ii}$-vel leosztva és átrendezve: + \[ + x_{i} = -\Big[\ddfrac{a_{i,1}}{a_{i,i}}x_1 + \ddfrac{a_{i,2}}{a_{i,i}}x_2 + \cdots + \ddfrac{a_{i,i-1}}{a_{i,i}}x_{i-1} + \ddfrac{a_{i,i+1}}{a_{i,i}}x_{i+1} + \cdots + \ddfrac{a_{i,n}}{a_{i,i}}x_{n} \Big] + \ddfrac{b_{i}}{a_{i,i}} \qquad (\forall i = 1, \ldots, n) + \] + + \noindent Ebből felépíthető egy iteráció, ahol $x_{i}^{(k)}$ az $i$-edik ismeretlen $k$-adik közelítése: + \[ + x_{i}^{(k+1)} = -\Big[\ddfrac{a_{i,1}}{a_{i,i}}x_1^{(k)} + \cdots + \ddfrac{a_{i,n}}{a_{i,i}}x_n^{(k)}\Big] + \ddfrac{b_{i}}{a_{i,i}}\quad {\small\text{ahol}\ x_{i}^{(0)}\ \text{tetszőleges érték és}\ k = 0, 1, \ldots.} + \] + + \noindent Összevont alakban: + \begin{displaymath} + \mybox{ + $\boldsymbol{\underline{x}^{(k+1)}_{i}} := + -\ddfrac{1}{a_{i,i}} + \Bigg( + \sum_{\substack{j=1\\ j \not = i}}^{n} a_{i,j}\boldsymbol{\underline{x}_{j}^{(k)}} - \underline{b}_{i} + \Bigg) + \; (i = 1, \ldots, n)$ + } + \end{displaymath} + + \noindent Az iteráció felírható mátrixos alakban is. Továbbra is $det(A) \neq 0$. Ekkor létezik legalább egy elemi szorzata a mátrixnak - a determináns definíciója - szerint, amelyik nem nulla, így pusztán sorcserével elérhető, hogy az $A$ mátrix diagonálisában csupa nemnulla elem álljon.\\ + + \noindent Ekkor az $A$ mátrixnak elkészíthető a következő felbontása + \[ + A = L + D + U + \] + ahol \emph{L}: alsó háromszög mátrix, \emph{D}: diagonális mátrix, \emph{U}: felső háromszög mátrix.\\ + + \noindent Ekkor azonos átalakításokkal a következő relációk érvényesek: + + \begin{center} + $A\underline{x} = \underline{b} \Leftrightarrow (L + D + U)\underline{x} = \underline{b}$ \\ + $D\underline{x} = -(L+U)\underline{x}+\underline{b}$ \\ + $\underline{x} = -D^{-1}(L+U)\underline{x} + D^{-1}\underline{b}$ + \end{center} + + \noindent Ebből már származtatható a Jacobi-iteráció mátrixos alakja: + \begin{center} + \mybox{ + $\underline{x}^{(k+1)} = \underbrace{-D^{-1}(L + U)}_{:= B_{J}}\underline{x}^{(k)} + \underbrace{D^{-1}\underline{b}}_{:= r_{J}}$ + } + \end{center} + \noindent $B_{J}$ a Jacobi-iteráció \emph{iterációs mátrixát} jelöli.\\ + + \subsubsection*{A Jacobi-iteráció konvergenciája\\} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \textbf{Definíció.} Az A mátrix \emph{szigorúan diagonálisan domináns}, ha minden sorban a főátlóban lévő eleme nagyobb, mint az adott sorban lévő összes többi elem abszolút értékének összege, azaz + \[ + |a_{i,i}| > \sum_{\substack{j=1\\ j \not = i}}^{n} |a_{i,j}|\quad (i = 1, 2, \ldots, n) + \] + \noindent $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Tétel}: Ha az $Ax = b$ lineáris egyenletrendszer mátrixa szigorúan diagonálisan domináns akkor a Jakobi-iteráció konvergens.\\ + + \noindent A Jakobi iteráció konvergál, ha $||B_{J}|| < 1$, valamely indukált vagy illeszkedő normában (elégséges feltétel). + +\begin{comment} + \noindent \textbf{Definíció}: Legyenek az $A \in \mathbb{R}^{n \times n}$ mátrix sajátértékei a $\lambda_{1}, \ldots, \lambda_{n} \in \mathbb{R}$ számok.\\ + Ekkor a + \[ + \rho(A) = \max\limits_{1 \leq i \leq n} |\lambda_{i}| + \] + az $A$ mátrix \emph{spektrálsugara}.\\ + + \noindent A konvergencia \emph{szükséges és elégséges feltétele} az, hogy $\rho(B_{J}) < 1$ teljesüljön.\\ +\end{comment} +% \renewcommand{\arraystretch}{2} + + \subsection*{Gauss-Seidel iteráció} + + A Gauss–Seidel-iteráció abban különbözik a Jacobi-iterációtól, hogy a $(k+1)$-edik közelítés $i$-edik komponensének kiszámításához felhasználjuk a $(k+1)$-edik közelítés már addig kiszámolt komponenseit, vagyis az $x_{1}^{(k+1)}, x_{2}^{(k+1)}, \ldots, x_{i-1}^{(k+1)}$ értékeket: + \[ + x_{i} = -\Big[\ddfrac{a_{i1}}{a_{ii}}x_1^{(k+1)} + \cdots + \ddfrac{a_{i,\boldsymbol{i-1}}}{a_{i,i}}x_{i-1}^{(k+1)}\Big] + \Big[\ddfrac{a_{i,\boldsymbol{i+1}}}{a_{i,i}}x_{i+1}^{(k)} + \cdots + \ddfrac{a_{i,n}}{a_{i,i}}x_{n}^{(k)} \Big] + \ddfrac{b_{i}}{a_{i,i}}\ \ (\forall i = 1, \ldots, n) + \] + + \noindent Összevont alakban: + + \begin{displaymath} + \mybox{ + $\boldsymbol{x^{(k+1)}_{i}} = + -\ddfrac{1}{a_{ii}} + \Bigg( + \sum_{j=1}^{\boldsymbol{i-1}} a_{i,j}\boldsymbol{x_{j}^{(k+1)}} + + \sum_{j=\boldsymbol{i+1}}^{n} a_{i,j}\boldsymbol{x_{j}^{(k)}} - + b_{i} + \Bigg) + \; (i = 1, ...\ldots, n)$ + } + \end{displaymath} +\newpage + \noindent A módszer a Jacobi-iterációhoz hasonló elven felírható mátrixos alakban. + + \begin{center} + \small + $A\underline{x} = \underline{b} \Leftrightarrow (L + D + U)\underline{x} = \underline{b}$ \\ + $(L+D)\underline{x} = -U\underline{x}+\underline{b}$ \\ + $x = -(L+D)^{-1}U\underline{x} + (L+D)^{-1}\underline{b}$ + \end{center} + + \noindent Ebből már származtatható a Gauss-Seidel mátrixos alakja: + + \begin{center} + \mybox{ + $\underline{x}^{(k+1)} := \underbrace{-(L+D)^{-1}U}_{:= B_{G-S}}\underline{x}^{(k)} + \underbrace{(L+D)^{-1}\underline{b}}_{r_{G-S}}$ + } + \end{center} + + \noindent $B_{G-S}$ a Jacobi-iteráció iterációs mátrixát jelöli.\\ + +% A koordinátás alak felírásához kicsit átírjuk az iterációt: + +% \begin{displaymath} +% (L+D)x^{(k+1)} = -Ux^{(k)} + b +% \end{displaymath} + +% \begin{displaymath} +% Dx^{(k+1)} = -Lx^{(k+1)} - Ux^{(k)} + b +% \end{displaymath} + +% \begin{displaymath} +% x^{(k+1)} = -D^{-1} \big[Lx^{(k+1)} + Ux^{(k)} - b \big] +% \end{displaymath} + + \noindent \textbf{Megjegyzés}: A G-S implementáció során elég egyetlen $\underline{x}$ vektort eltárolni, és annak a komponenseit sorban felülírni, ugyanis + láthatjuk, hogy az első $i-1$ komponenst már az "új" $x^{(k+1)}$ vektorból vesszük.\\ + + \noindent \textbf{Tétel}: Ha $A \in R^{n \times n}$ és $Ax = b$ szigorúan diagonálisan domináns + \begin{itemize} + \item $\Vert B_{G-S} \Vert_{\infty} \leq \Vert B_{J} \Vert_{\infty} < 1$. (soraira) + \item $\Vert B_{G-S} \Vert_{1} \leq \Vert B_{J} \Vert_{1} < 1$. (oszlopaira) + \end{itemize} + + \noindent Azaz a Gauss-Seidel is konvergens, és legalább olyan gyors, mint a Jacobi. + + \subsection*{Relaxációs módszerek} + + \noindent Vannak esetek, amikor az iterációs mátrix spektrálsugara nem kisebb 1-nél, és ilyenkor nem vagy csak nagyon lassan konvergál az iteráció. Ekkor azt tehetjük, hogy bevezetünk egy paramétert az iterációba, melyet úgy választunk meg, hogy az iteráció konvergens legyen. Ilyenkor egy plusz $\omega$, úgynevezett relaxációs paraméter bevezetésével próbáljuk finomítani a módszert. + + \subsubsection*{A relaxált Jacobi-iteráció} + + \noindent Tekintsük a $D\underline{x} = -(L + U)\underline{x} + \underline{b}$ egyenletet, valamint a triviális $D\underline{x} = + D\underline{x}$ egyenletet.\\ + Ezeket rendre szorozzuk meg $\omega$, illetve $1 - \omega$ értékekkel, majd adjuk össze a két + egyenletet: + + \begin{center} + \small + $D\underline{x} = (L+U)\underline{x} + b\qquad \underbrace{\Rightarrow}_{\cdot \omega} \qquad \omega D\underline{x} \textbf{=} -\omega(L+U)\underline{x} + \omega \underline{b} \quad (1)$\\ + $D\underline{x} = D\underline{x}\qquad \underbrace{\Rightarrow}_{\cdot (1 - \omega)}\qquad (1 -\omega) D\underline{x} = (1 -\omega) D\underline{x} \quad (2)$\\ + $(1)+(2) \left\Downarrow \right.$\\ + $(1 -\omega) D\underline{x} - \omega D\underline{x} = (1 -\omega) D\underline{x} -\omega(L+U)\underline{x} + \omega b$\\ + $\Updownarrow$\\ + $D\underline{x} -\omega D\underline{x} + \omega D\underline{x} = (1 -\omega) D\underline{x} -\omega(L+U)\underline{x} + \omega \underline{b}$\\ + $\Updownarrow$\\ + $D\underline{x} = (1 - \omega)D\underline{x} -\omega(L+U)\underline{x} + \omega \underline{b}$ + \end{center} + + \noindent Szorozzunk $D^{-1}$-zel, majd felépítve az iterációt, megkapjuk a módszer mátrixos alakját: + \begin{displaymath} + {\small + \underline{x} = (1 - \omega)I\underline{x} -\omega D^{-1}(L+U)\underline{x} + \omega D^{-1}\underline{b} \Longleftrightarrow + } + \mybox{ + $\underline{x} = \underbrace{((1 - \omega)I -\omega D^{-1}(L+U))}_{B_{J(\omega)}}\underline{x} + \underbrace{\omega D^{-1}\underline{b}}_{r_{J}(\omega)}$ + } + \end{displaymath} + + \noindent $\omega = 1$ esetén a Jacobi-iterációt kapjuk vissza.\\ + + \noindent Koordinátás alakban felírva: + + \begin{center} + {\small + $x = (1 - \omega)\underline{x} - \omega(D^{-1}(L + U)\underline{x} + D^{-1}\underline{b})$ \\ + $x = (1 - \omega)\underline{x} - \omega D^{-1}((L + U)\underline{x} + \underline{b})$ + } + \mybox{ + $\underline{x}^{(k+1)}_{i} = + (1 - \omega)\underline{x}^{(k)}_{i} + -\ddfrac{\omega}{a_{i,i}} + \Bigg[ + \sum_{\substack{j=1\\ j \not = i}}^{n} a_{i,j}\underline{x}_{j}^{(k)} - b_{i} + \Bigg] + \; (i = 1, ...\ldots, n)$ + } + \end{center} + + \noindent \textbf{Tétel.} Ha az $A$ mátrix szimmetrikus és szigorúan diagonálisan domináns, akkor a relaxált Jacobi-módszer $\omega \in (0,1]$ esetén konvergens.\\ + + \subsubsection*{A relaxált Gauss–Seidel-iteráció} + + \noindent Tekintsük a $(L+D)\underline{x} = -U\underline{x} + \underline{b}$ egyenletet, valamint a triviális $D\underline{x} = + D\underline{x}$ egyenletet.\\ + Ezeket rendre szorozzuk meg $\omega$, illetve $1 - \omega$ értékekkel, majd adjuk össze a két + egyenletet: + + \begin{center} + \small + $(L+D)\underline{x} = -U\underline{x} + \underline{b}\ \ \underbrace{\Rightarrow}_{\cdot \omega} \ \ \omega (L+D)\underline{x} = -\omega U\underline{x} + \omega \underline{b} \quad (1)$\\ + $D\underline{x} = D\underline{x}\ \ \underbrace{\Rightarrow}_{\cdot (1 - \omega)}\ \ (1 -\omega) D\underline{x} = (1 -\omega) D\underline{x} \quad (2)$\\ + $(1)+(2) \left\Downarrow \right.$\\ + $(1 -\omega) D\underline{x} + \omega (L+D)\underline{x} = (1 -\omega) D\underline{x} -\omega U\underline{x} + \omega b$\\ + $\Updownarrow$\\ + $D\underline{x} -\omega D\underline{x} + \omega L\underline{x} + \omega D\underline{x} = (1 -\omega) D\underline{x} -\omega U\underline{x} + \omega \underline{b}$\\ + $\Updownarrow$\\ + $(D - \omega L)\underline{x} = (1 -\omega) D\underline{x} -\omega U\underline{x} + \omega \underline{b}$\\ + \end{center} + + \noindent Innen $(D +\omega L)^{-1}$-gyel átszorozva, majd felépítve az iterációt megkapjuk a módszer mátrixos alakját. + + \begin{center} + {\small $\underline{x} = (D +\omega L)^{-1} \Big[(1 -\omega)D -\omega U\Big]\underline{x} + \omega (D +\omega L)^{-1} \underline{b}$}\\ + \mybox{$\underline{x}^{(k+1)} = \underbrace{(D +\omega L)^{-1} \Big[(1 -\omega)D -\omega U\Big]}_{B_{G-S}(\omega)}\underline{x} + \underbrace{\omega (D +\omega L)^{-1} \underline{b}}_{r_{G-S(\omega)}}$}\\ + \end{center} + + \noindent A koordinátás alak felírásához itt is átírjuk kicsit az iterációt: + + \begin{center} + \small $(D + \omega L)\underline{x}^{(k+1)} = (1 - \omega)D\underline{x}^{(k)} -\omega Ux^{(k)} + \omega \underline{b}$ + \end{center} + + \begin{center} + \small $D\underline{x}^{(k+1)} = -\omega L\underline{x}^{(k+1)} -\omega U\underline{x}^{(k)} + \omega \underline{b} + (1 - \omega)D\underline{x}^{(k)}$ + \end{center} + + \begin{center} + \small $\underline{x}^{(k+1)} = -\omega D^{-1} \big[L\underline{x}^{(k+1)} + U\underline{x}^{(k)} - \underline{b} \big] + (1 - \omega)\underline{x}^{(k)}$ + \end{center} + + \begin{center} + \mybox{ + $\underline{x}^{(k+1)}_{i} = + -\ddfrac{\omega}{a_{i,i}} + \Bigg[ + \sum_{j=1}^{i-1} a_{i,j}\underline{x}_{j}^{(k+1)} + + \sum_{j=i+1}^{n} a_{i,j}\underline{x}_{j}^{(k)} - + b_{i} + \Bigg] + + (1 - \omega) \underline{x}_{i}^{(k)} + \; (i = 1, ...\ldots, n)$} + \end{center} + + \noindent $\omega = 1$ esetén a Gauss-Seidel iterációt kapjuk.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize\\ + \noindent \textbf{Definíció}: Az $A^{n \times n}=\left[ a_{i,j} \right]$ négyzetes mátrix \textbf{szimmetrikus}, ha + \[ + A^{T} = A\ \text{\small (a mátrix egyenlő a transzponáltjával, azaz)}\ a_{i,j} = a_{j,i}\ \forall i,j = 1,\ldots,n\ \text{indexre} + \] + + \noindent \textbf{Definíció}: Az $A^{n \times n}$ mátrix pozitív definit, ha $\forall x \in \mathbb{R}^{n} \neq \underline{0}$ vektorra $x^{T}Ax > 0.$\\ + + \noindent \textbf{Definíció}: Az $A^{n \times n}$ mátrix tridiagonális, ha csak a főátlón és a mellette található két átló mentén vannak nullától különböző elemek.\\ + \noindent $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Tétel}: Ha $A$ szimmetrikus és pozitív definit és $\omega \in (0, 2)$, akkor a relaxációs módszer konvergens. Ennek + következménye a Gauss-Seidel iteráció konvergenciája ($\omega = 1$ eset).\\ + + \noindent \textbf{Megjegyzés}: Ha $\omega \notin (0,2)$, akkor általában nem konvergens a módszer (bár adott feladat esetén előfordulhat, + hogy találunk olyan kezdővektort, amelyből indítva konvergál a módszer).\\ + + \noindent \textbf{Tétel}: Ha $A$ tridiagonális, akkor $\varrho(B_{S}) = \varrho(B_{J})^{2}$, azaz a Jacobi és Gauss-Seidel iteráció + egyszerre konvergens, illetve divergens.\\ + + \noindent \textbf{Tétel}: Ha $A$ szimmetrikus, pozitív definit és tridiagonális, akkor a $J(1)$, $GS(1)$ és $GS(\omega)$ $\omega \in (0, 2)$- + re konvergens, és $GS(\omega)$-ra az optimális paraméter értéke: + + \begin{displaymath} + \omega_{0} = \ddfrac{2}{1 + \sqrt{1 - \varrho(B_{J})^{2}}} + \end{displaymath} + + \subsection*{Richardson-iteráció} + + Tekintsük az $A\underline{x}=b$ lineáris algebrai egyenletrendszert, ahol $A$ szimmetrikus, pozitív definit mátrix (azaz minden sajátértéke valós, sőt pozitív). Szorozzuk meg az egyenletrendszer mindkét oldalát egy tetszőleges $\omega \neq 0$ számmal, majd rendezzük át: + + \begin{center} + $A\underline{x} = \underline{b} \Longleftrightarrow 0 = -A\underline{x} + \underline{b}$ \\ + $\Updownarrow (\cdot \omega)$\\ + $0 \cdot \omega = -\omega A\underline{x} + \omega \underline{b}$\\ + $\Updownarrow$\\ + $\underline{x} = (I-\omega A)\underline{x} +\omega \underline{b}$ + \end{center} + + \noindent Az iteráció tehát + \[ + \mybox{ + $\underline{x}^{(k+1)} := \underbrace{(I-\omega A)}_{B_{R(\omega)}}\underline{x}^{(k)} + \underbrace{\omega \underline{b}}_{r_{R(\omega)}}$ + } + \] + + \noindent \textbf{Tétel}: Ha $A \in \mathbb{R}^{n \times n}$ szimmetrikus, pozitív definit, a sajátértékei pedig a következők: + \begin{displaymath} + 0 < m := \lambda_{1} \leq \lambda_{2} \leq \ldots \leq \lambda_{n} =: M + \end{displaymath} + + \noindent akkor $\omega \in (0,\ddfrac{2}{M})$ esetén + \[ + \rho(I - \omega A) < 1 + \] + ezért a $R(\omega)$ (Richardson-iteráció) konvergens.\\ + + \noindent A $\rho(I - \omega A)$ spektrálsugár akkor a legkisebb (ezért a konvergencia akkor a leggyorsabb), ha + \[ + \omega_{opt} = \ddfrac{2}{m + M} + \] + + \noindent Továbbá igaz, hogy: $\rho(B_{R(\omega_{opt})}) = \ddfrac{M - m}{M + m}$.\\ + + \noindent \emph{Megjegyzés}: Ha az $\ddfrac{M}{m}$ hányados (az $A$ mátrix kondíciószáma) nagy, akkor a konvergencia még optimális paraméterválasztás mellett is lassú. + + \subsection*{Nemlineáris egyenletek iterációs módszerei} + + Eddig egyenletrendszerekkel foglalkoztunk, melyekben minden egyenlet lineáris volt. Most módszereket + fogunk keresni az $f(x) = 0$ típusú egyenletek megoldására, ahol $f \in \mathbb{R} \to \mathbb{R}$. A módszerek + lényege az lesz, hogy valamilyen szempont szerint egy számsorozatot állítunk elő, melyek bizonyos + feltételek mellett az egyenlet gyökéhez konvergálnak.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize\\ + \noindent \textbf{Bolzano-tétel}: Legyen $f \in \mathcal{C}[a,b]$ és $f(a)f(b) <0$, azaz az $f$ függvény az $a$ és $b$ + pontokban nem $0$, valamint ellenkező előjelű. Ekkor létezik $(a,b)$ intervallumbeli gyöke az $f$-nek, azaz + $\exists x^{*} \in (a,b): f(x^{*}) = 0$.\\ + + \noindent \textbf{A Bolzano-tétel következménye}: Ha a Bolzano-tétel feltételei mellett még $f$ szigorúan monoton is, akkor + az $x^{*}$ egyértelműen létezik (hiszen $f$ invertálható).\\ + + \noindent \textbf{Brouwer-féle fixponttétel}: Legyen $f : [a,b] \to [a,b]$ és $f \in \mathcal{C}[a,b]$.\\ + + \noindent Ekkor $\exists + x^{*} \in [a,b]: x^{*} = f(x^{*})$.\\ + + \noindent \textbf{Tétel}: Legyen $f : [a,b] \to [a,b]$, $f \in \mathcal{C}^{1}[a,b]$ és $\boldsymbol{f'}$ \emph{\textbf{állandó előjelű}}.\\ + + \noindent Ekkor $\exists\boldsymbol{!} + x^{*} \in [a,b]: x^{*} = f(x^{*})$.\\ + + \noindent \textbf{Fixponttétel [a,b]-re}: Legyen $f : [a,b] \to [a,b]$ kontrakció a $q$ kontrakciós együtthatóval. + Ekkor: + + \begin{enumerate} + \item $\exists! x^{*} \in [a,b]: x^{*} = f(x^{*})$, + + \item $\forall x_{0} \in [a,b]: x_{k+1} = f(x_{k})$ konvergens és $x^{*} = \lim\limits_{k \to \infty} x_{k}$, + + \item $| x_{k} - x^{*} | \leq q^{k} | x_{0} - x^{*}| \leq q^{k}(b-a)$. + \end{enumerate} + + \noindent \textbf{p-adrendű konvergencia}: Az $(x_{k})$ konvergens sorozat ($\lim\limits_{k \to \infty} x_{k} = x^{*}$) + $p$-ad rendben konvergens, ha + + \begin{displaymath} + \lim\limits_{k \to \infty} \ddfrac{|x_{k+1} - x^{*}|}{|x_{k}-x^{*}|^{p}} = c > 0 + \end{displaymath} + + \noindent Néhány megjegyzés a fenti definícióhoz: + + \begin{enumerate} + \item $p$ egyértelmű és $p \geq 1$ + \item $p=1$ esetén lineáris + \item $p=2$ esetén kvadratikus, + \item $1 < p < 2$ esetén szuperlineáris + \item A gyakorlatban az $|x_{k+1} - x^{*}| \leq M|x_{k} - x^{*}|^{p}$ alakot használják, azt jelenti, hogy + legalább $p$-adrendben konvergens. + \end{enumerate} + + \noindent \textbf{Tétel}: Tegyük fel, hogy az $(x_{k})$ sorozat konvergens, +\begin{center} + $x_{k+1} = f(x_{k})$ és $f'(x^{*}) = f''(x^{*}) = \ldots = f^{(p-1)}(x^{*}) = 0$, de $f^{(p)}(x^{*}) \not = 0$.\\ +\end{center} + Ekkor az $(x_{k})$ $p$-adrendben konvergens.\\ + $\triangleleft$ \faLightbulbO}\\ + + \subsection*{Newton-iteráció} + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\linewidth]{img/newton_pelda.png} + \caption{A Newton-módszer alapötlete.} + \label{fig:newton_pelda} + \end{figure} + + \noindent Az ábrán a legszélső, $x_{0}$ pontból indulunk, felvesszük a függvény ehhez a ponthoz tartozó + érintőjét, majd ennek az érintőnek a gyöke lesz a következő pont, és így tovább.\\ + + \noindent \textbf{Definíció.} Legyen $f: [a, b]\rightarrow \mathbb{R},\ f \in D[a, b]$, vagyis az $f$ differenciálható az intervallumon, továbbá $f'(x) \neq 0,\ \forall x \in [a, b]$. \\ + + \noindent Ekkor az + \[ + \mybox{ + $x_{n+1} = x_{n} - \ddfrac{f(x_{n})}{f'(x_{n})},\quad n \in \mathbb{N}, \quad x_{0} \in [a, b]$ + } + \] + iteráció a Newton-iteráció az $f(x) = 0$ egyenlet megoldására.\\ + + \noindent A fenti képlet a Newton-iteráció képlete. Megjegyezhető, hogy a fenti módszer is $x_{k+1} = g(x_{k})$ + alakú (fixpontiteráció).\\ + + \noindent Fontos megemlíteni, hogy $f'(x_{k}) = 0$ esetén nem értelmezhető a módszer. A gyakorlatban $f'(x_{k}) \approx 0$ is probléma. + Ha $x^{*}$ többszörös gyök, akkor $f'(x^{*}) = 0$, vagyis $x^{*}$ közelében $f'(x_{k})$ egyre jobban közelít $0$-hoz, numerikusan + instabil.\\ + + \noindent \textbf{Monoton konvergencia tétele}: Tegyük fel, hogy $f \in \mathcal{C}^{2}([a,b])$ és + \begin{itemize} + \item $f'(x) \neq 0,\ f''(x) \neq 0,\ x \in [a, b]$, valamint + \item $\exists x^{*} \in (a,b) : f(x^{*}) = 0$, és legyen + \item $x_{0} \in [a, b]$ kezdőpont olyan, hogy $f(x_{0})f''(x_{0}) > 0$ teljesüljön. + \end{itemize} + + \noindent Ekkor az $x_{0}$-ból indított Newton-módszer monoton konvergál $x^{*}$-hoz.\\ + + \noindent \textbf{Lokális konvergencia tétele}: Tegyük fel, hogy $f \in \mathcal{C}^{2}([a,b])$ és + \begin{itemize} + \item $f'(x) \neq 0,\ x \in [a, b]$, valamint + \item $\exists x^{*} \in (a,b) : f(x^{*}) = 0$ és legyen + \item $x_{0} \in [a, b]$ kezdőpont olyan, hogy + \[ + \big|x_{0} - x^{*}\big| < r := min\Big\{\ddfrac{1}{M},\ |x^{*} - a|,\ |x^{*} - b| \Big\},\ \text{ahol}\ + M = \ddfrac{max_{[a, b]}|f''(x)|}{2 \cdot min_{[a,b]}|f'(x)|} + \] + \end{itemize} + + \noindent Ekkor az $x_{0}$-ból indított Newton-iteráció konvergál az $x^{*}$ megoldáshoz, és a konvergencia sebessége p = 2. + + \subsection*{Húrmódszer} + + \noindent Továbbra is $f(x) = 0$ megoldása a cél egy adott $[a, b]$ intervallumon. + Az eljárás lényege a következő. Kezdetben $x_{0} := a, x_{1} := b$, majd meghúzzuk ezen pontok által + képzett egyenest. Legyen $x_{2}$ a húr gyöke. Ha $f(x_{2}) = 0$, akkor megtaláltuk a gyököt. Ha $f(x_{2}) \not = 0$, + akkor folytatjuk a keresést az $[x_{0},x_{2}]$ vagy $[x_{2},x_{1}]$ intervallumban. Ha $f(x_{0})f(x_{2}) < 0$, akkor + $[x_{0},x_{2}]$ intervallumban folytatjuk, ha $f(x_{2}) f(x_{1}) < 0$, akkor $[x_{2}, x_{1}]$ intervallumban. Stb.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\linewidth]{img/hurmodszer.png} + \caption{Húr-módszer} + \label{fig:newton_pelda} + \end{figure} + + \noindent Általánosan: Legyen $x_{0} := a, x_{1} := b$ és $f(a)f(b) < 0$. Az $(x_{k},f(x_{k}))$ és $(x_{s},f(x_{s}))$ + pontokon átmenő egyenesekkel közelítjük a függvényt ahol $x_{s}$-re $f(x_{s})f(x_{k})<0$ és $s$ a legnagyobb ilyen index. + $x_{k+1}$-et a következőképpen határozhatjuk meg: + + \begin{displaymath} + \mybox{ + $x_{k+1} := x_{k} - + \ddfrac + {f(x_{k})} + {\ddfrac{f(x_{k}) - f(x_{s})}{x_{k}-x_{s}}} = + x_{k} - + \ddfrac + {f(x_{k}) (x_{k} -x_{s}) } + {f(x_{k}) - f(x_{s})}$ + } + \end{displaymath} + + \noindent \textbf{Tétel}: Legyen $f \in \mathcal{C}^{2}[a,b]$ és + \begin{enumerate} + \item $f(a)f(b)<0$ + \item $M = \ddfrac{M_{2}}{2m_{1}}$, ahol $0 0$ úgy, hogy + \[ + \forall n \in \mathbb{N} : M_{n} \leq M^{n} \qquad \text{(lásd előző tétel)} + \] + akkor az $L_{n}$ sorozat egyenletesen konvergál az $f$ függvényhez.\\ + +% \noindent \textbf{Marcinkiewicz tétele}: Minden $f \in \mathcal{C}[a,b]$ esetén létezik a fenti módon definiált alappontrendszer +% úgy, hogy $\Vert f - L_{n}\Vert_{\infty} \to 0$.\\ + +% \noindent \textbf{Faber tétele}: Minden a fenti módon definiált alappontrendszer esetén van olyan $f \in \mathcal{C}[a,b]$ függvény, +% hogy $\Vert f - L_{n}\Vert_{\infty} \not \to 0$.\\ + + \noindent A Lagrange-interpoláció hátránya, hogy új alappont hozzávételével az összes számítást újra el kell végezni. Ezt kiküszöbölendő érdemesebb $L_n$-t a következő alakban keresni: + \[ + N_{n}(x) := A_{0} + A_{1}(x-x_0) + \ldots + A_{n}(x-x_0)\ldots(x-x_{n-1}) + \] + + \noindent Az együtthatók kiszámításához vezetjük be az úgynevezett osztott differenciákat.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Ha egy konvergens interpolációt veszünk, akkor felmerül a kérdés, hogy hogyan számítsuk ki egyre magasabb fokszámú interpolációs polinomot azért, hogy növeljük a pontosságot. Viszont a Lagrange-féle interpolációs polinomot minden lépésben újra kellene számolnunk, hiszen az új polinom hozzávételekor minden alappolinom megváltozik. Emiatt olyan előállításra van szükség, amelyik lehetővé teszi, hogy az előzőleg kiszámolt polinomot felhasználhassuk. Az alábbiakban a Newton-féle alakot tárgyaljuk, ami megoldja ezt a problémát: a polinomoknak egy rekurzív előállítását adja. Ehhez először szükség van az osztott differenciák fogalmára. + $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Osztott differencia}: Legyenek adva az $x_{0}, \ldots, x_{n}$ különböző alappontok. + Az $f:[a,b] \to \mathbb{R}$ függvénynek a megadott alappontrendszerre vonatkozó elsőrendű osztott differenciái, ahol $i = 1,\ \ldots, n$ + \[ + f[x_{i-1},x_{i}] = \ddfrac{f(x_{i})-f(x_{i-1})}{x_{i} - x_{i-1}} + \] + $n-1$ darab másodrendű osztott differencia, ahol $i = 2,\ \ldots, n$ + \[ + f[x_{i-2},x_{i-1},x_{i}] = \ddfrac{f[x_{i-1}, x_i] - f[x_{i-2}, x_i]}{x_i - x_{i-2}} + \] + ezt általánosítva a $k$-ad rendű osztott differencia $i = k,\ \ldots, n$ esetén + \[ + \mybox{$f[x_{i-k},x_{i-k+1},\ldots,x_{i}] = \ddfrac{f[x_{i-k+1}, \ldots, x_i] - f[x_{i-k}, \ldots, x_{i-1}]}{x_i - x_{i-k}}$} + \] + + \noindent Látható, hogy a $k$-adrendű osztott differencia $k+1$ alappontra támaszkodik.\\ + + \noindent Ha adott egy interpoláció alappontrendszer függvényértékekkel, akkor a hozzá tartozó osztott differenciákat az + alábbi táblázat szerint érdemes elrendezni, és ez az elrendezés egyúttal a kiszámolást is segíti (k+1 pont esetén). + + \begin{table}[H] + \begin{tabular}{llllllll} + $x_{0}$ & $f(x_{0})$ & & & & & & \\ + & & $f[x_{0},x_{1}]$ & & & & & \\ + $x_{1}$ & $f(x_{1})$ & & $f[x_0, x_1, x_2]$ & & & & \\ + & & $f[x_{1},x_{2}]$ & & & & & \\ + $x_{2}$ & $ f(x_{2})$ & & & & & &\\ + \vdots & \vdots & \vdots & & & $\cdots$ & &\\ + & & & & & & $f[x_{0}, x_{1}, \cdots, x_{n}]$ &\\ + \vdots & \vdots & \vdots & & & $\cdots$ & &\\ + $x_{n-1}$ & $f(x_{n-1})$ & & $f[x_{n-2},x_{n-1},x_n]$ & & & &\\ + & & $f[x_{n-1},x_{n}]$ & & & & & \\ + $x_{n} $ & $f(x_{n})$ & & & & \\ + \end{tabular} + \end{table} + \noindent \textbf{Állítás.} (Newton-interpolációs formula). A Lagrange-interpolációs polinom megadható a következő formában: + \begin{displaymath} + \mybox{$N_{n}(x) = \sum\limits_{k=0}^{n}f[x_{0}, \ldots, x_{k}] \prod\limits_{j=0}^{k-1}(x - x_{j})$} + \end{displaymath} + + \noindent Észrevehető, hogy érdemesebb a Newton-interpolációs eljárást alkalmazni, hiszen $N_n$-t rekurzívan is ki tudjuk fejezni az + \[ + N_{n}(x) = N_{n-1} + f[x_{0}, \ldots, x_{n}](x-x_{0})\ldots(x-x_{n-1}) + \] + képlet segítségével, így új alappont hozzávételével gyorsabban tudunk interpolációs polinomot számolni.\\ + + \subsection*{Hermite-interpoláció} + Az előbbi interpolációs feladatot a következőképpen általánosíthatjuk. \\ + + \noindent Legyenek adva az egyes alappontokban a függvényértékek mellett a függvény derivált értékei is valamely rendig bezárólag. Ekkor olyan polinomot keresünk, amelyik deriváltjaival együtt + illeszkedik a megadott értékekre, vagyis:\\ + + \noindent Legyenek adva $m_{0},\ m_{1},\ldots,\ m_{n} \in \mathbb{N}$ és az $x_{j} \in \mathbb{R},\ j=0, 1, \ldots, n$ interpolációs + alappontok, valamint az $f^{(k)}(x_{j}) \ \ k=0, 1, \ldots, m_{j}-1,\ j=0, 1, \ldots, n$ függvény- és derivált értékek. \\ + Legyen $m = \displaystyle\sum_{j=0}^{n}m_{j}$. Keressük azt a legfeljebb ($m-1$)-edfokú $p_{m-1}$ polinomot, melyre:\\ + + \[ + \mybox{$p^{(k)}_{m-1}(x_{j}) = f^{(k)}(x_{j}) \qquad (k=0,1,\ldots,m_{j}-1, \ \ \ j=0, 1, \ldots, n)$} + \] + + \noindent \textbf{Definíció.} Az így nyert $p$-t Hermite-interpolációs polinomnak nevezzük és $H_{m}$-mel jelöljük.\\ + + \noindent \textbf{Tétel}: A Hermite-féle interpolációs polinom egyértelműen létezik.\\ + + \noindent \textbf{Megjegyzések}: Legyen $j=0, 1, \ldots, n$ + \begin{enumerate} + \item Ha $m_{j}=1$, akkor m = n + 1. Mindegyik $x_{j}$-hez csak az $f_{j}$ érték tartozik. (Lagrange-interpoláció). + \item Ha $m_{j}=2$. Mindegyik $x_{j}$-hez az $f_{j}$ érték és az $f_{j}^{'}$ derivált érték tartozik. (Hermite-Fejér-féle interpoláció). A keresett polinom pedig legfeljebb ($2n+1$)-edfokú. + \end{enumerate} + + \noindent \textbf{A Hermite interpolációs polinom előállítása\\} + + \noindent Könnyen felírható a Newton-féle formában. Csak annyit + kell tennünk, hogy kiindulunk az alappontok és a függvényértékek táblázatával és legyártjuk az osztott differenciák + táblázatát. Az az egyetlen különbség most, hogy az $x_{j}$ alappontot $m_{j}$-szer soroljuk fel.\\ + + \noindent Ha $x_{k}$ $j$-szer szerepel: + \begin{displaymath} + f[x_{k}, \ldots x_{k}] = \ddfrac{f^{(j)}(x_{k})}{j!} + \end{displaymath} + + \noindent \textbf{Tétel.} (Hermite-interpoláció hibája): \\ + Legyen $\sum\limits_{j=0}^{n}m_{j}$. Ha az $f$ függvény $m$-szer folytonosan differenciálható, akkor + \begin{displaymath} + \forall x \in [a,b] \quad \exists \xi \in (a, b): f(x) - H_{m-1}(x) = \ddfrac{f^{(m)}(\xi)}{m!}\Omega_{m} + \end{displaymath} + + \noindent ahol $\Omega_{m}(x) = (x-x_{0})^{m_{0}}(x-x_{1})^{m_{1}}\ldots(x-x_{n})^{m_{n}} = \prod\limits_{i=0}^{n}(x - x_{i})^{m_{i}}$ + + \subsection*{Spline-interpoláció} + + \noindent A klasszikus interpoláció magas fokszámra nem előnyös alkalmazni. Sok esetben előnyösebb a szakaszonként (alacsony) adott fokszámú interpoláció (spline interpoláció) alkalmazása.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Bizonyos esetekben probléma lehet a Lagrange-interpolációval, ahol a polinom fokszáma nő az alappontok számával. Ennek következményeként indokolatlanul nagy hullámzások jelennek meg a polinom grafikus képében, két egymást követő pont között. Ez annak tudható be, hogy az eredeti alappontokat szolgáltató $f(x)$ függvény nem polinomiális, és egy közelítő polinom csak úgy tud eleget tenni a feltételeknek, hogy közben lokális minimum és maximum helyeken halad át. Erre nyújt megoldást a spline interpoláció.\\ + + \noindent A lényeg, hogy a kicsi fokszámú polinomokból rakjuk össze a közelítő polinomot, mégpedig úgy, hogy először keresünk egy polinomot az első két alappontra, majd a második és harmadik alappontra (és így tovább), de mindezt úgy tesszük, hogy közben figyelünk az illeszkedési pontokban a derivált értékekre (ezzel biztosítva a görbék tökéletes illeszkedését, mivel a spline-ok akkor illeszkednek szépen, ha az alappontokban nem csak az első, hanem a második derivált értéke is megegyezik). \\ + + \noindent Létezik elsőfokú, másodfokú, harmadfokú és néhány magasabb fokszámú spline, de gyakorlatban a harmadfokú (cubic) spline-ok a legelterjedtebbek, mert amikor már megvan egy szakaszon a közelítés, és oda akarunk csatlakoztatni egy következő spline-t, akkor van két adatponton érték, illetve a csatlakozási ponton az első és második derivált. Ez négy feltétel, amire egy harmadfokú polinomot lehet illeszteni. $\triangleleft$ \faLightbulbO}\\ +\newpage + \noindent \textbf{$l$-edfokú spline\\} + + \noindent Legyen $\Omega_{n} := [a = x_0 < \ldots < x_n < b]$ felosztás, ahol $l_k := [x_{k-1}, x_k]$ részintervallum ($k = 1, \ldots, n$). Az $\mathbf{S}_{\ell}:[a,b] \to \mathbb{R}$ függvényt egy $\ell$-edfokú spline-nak nevezzük, ha: + + \begin{enumerate} + \item ${\mathbf{S}_{\ell}}_{\big|l_k} \in P_{\ell} \quad (k = 1, \ldots, n)$ + \item $\mathbf{S} \in \mathcal{C}^{\ell-1}[a,b] \quad $ (a teljes intervallumon $(l-1)$-szer folytonosan derviálható) + \end{enumerate} +\begin{comment} + \noindent \textbf{Köbös interpolációs spline\\} + + \noindent Legyen $a = x_0 < \ldots < x_n < b$ egy felosztás és $f \in \mathcal{C}[a,b]$ adott és $f(x_i) = y_i \quad (i = 0, \ldots, n)$. Az $f$ függvényt interpoláló köbös $\mathbf{S}(x)$ spline-t a következő módon definiáljuk: + \begin{itemize} + \item $S$ szakaszonként harmadfokú polinom, $\mathbf{S}_i(x) := \mathbf{S}_{\big|{[x_i, x_{i+1}]}} \quad (i = 0, \ldots, n-1)$ + \item $\mathbf{S}_i(x) = y_i$ (tehát S interpolálja $f$-et) + \item $\mathbf{S}_i(x_{i+1}) = \mathbf{S}_{i+1}(x_{i+1}) \quad (i = 1, \ldots, n-2)$ (folytonosan csatlakoznak) + \item $\mathbf{S}'_i(x_{i+1}) = \mathbf{S}'_{i+1}(x_{i+1}) \quad (i = 1, \ldots, n-2)$ ($\mathbf{S}$-nek nincsenek sarkai) + \item $\mathbf{S}''_i(x_{i+1}) = \mathbf{S}''_{i+1}(x_{i+1}) \quad (i = 1, \ldots, n-2)$ (görbületek egyenlősége) + \item Továbbá teljesül még valamelyik a következő peremfeltételek közül + \begin{itemize} + \item $\mathbf{S}''(a) = \mathbf{S}''(b) = 0$ (természetes peremfeltételek) + \item $\mathbf{S}'(a) = f'(a), \quad \mathbf{S}'(b) = f'(n)$ (Hermite feltételek) + \item $\mathbf{S}'(a) = S'(b), \quad \mathbf{S}''(a) = S''(b)$ (Periodikus feltételek) + \end{itemize} + \end{itemize} +\end{comment} + + \noindent Részintervallumonkénti polinomok együtthatóinak megkeresése: + + \[ + p_{k}(x) = \sum\limits_{j=0}^{\ell}a^{(k)}_{j} \cdot (x - x_{k-1})^{k} \quad (x \in l_{k}) + \] + + \noindent \textbf{Spline megadás intervallumonként\\} + +% \noindent Legyenek adottak $x_{k},\ f(x_{k})$ értékek $k=0, \ldots, n$-re és $\ell \in \mathbb{N}$. +% Keressük azt az $\mathbf{S} \in \mathbf{S}_{\ell}(\Omega_{n})$ spline-t, amelyre $\mathbf{S}(x_{k}) = f(x_{k})$.\\ + + \noindent \textbf{$\ell = 1$ elsőfokú spline megadása\\} + + \noindent A legegyszerűbb eset a szakaszonként lineáris spline interpoláció. Ebben az esetben az interpolációban szakaszonként egy egyenessel kötünk össze két egymás mellett lévő pontot. + + \[ + p_{k}(x) = a_1^{(k)}(x - x_{k-1}) + a_{0}^{(k)} \quad (x \in l_{k}) + \] + + \noindent A megoldáshoz írjuk fel az interpolációs feltételeket az $l_k$ részintervallum két szélére. + + \begin{center} + $p_{k}(x_{k-1}) = a_{0}^{(k)} = f(x_{k-1})$\\ + $p_{k}(x_{k}) = a_1^{(k)}(x_{k} - x_{k-1}) + a_{0}^{(k)} = f(x_{k})$\\ + $\Downarrow$\\ + \mybox{$a_{1}^{(k)} = \ddfrac{f(x_{k}) - f(x_{k-1})}{x_{k} - x_{k-1}} = f[x_{k-1}, x_{k}]$} + \end{center} + + \noindent Az interpolációs feltételből a folytonosság azonnal következik.\\ + + \noindent \textbf{$\ell = 2$ másodfokú (kvadratikus) spline megadása\\} + \[ + \mybox{$p_{k}(x) = a_2^{(k)}(x - x_{k-1})^2 + a_1^{(k)}(x - x_{k-1}) + a_{0}^{(k)} \quad (x \in l_{k})$} + \] + + \begin{itemize} + \item Az ismeretlenek száma: 3n. + \item A feltételek száma: + \begin{itemize} + \item interpolációs feltétel minden részintervallum két szélére: \textbf{2n} feltétel\\ + (n intervallumra felosztva, intervallumonként 2 végponttal) + \end{itemize} + \item minden belső osztópontra a folytonos differenciálhatóság: \textbf{n-1} feltétel + \end{itemize} + + \noindent Összesen $2n + n-1 = \textbf{3n-1}$ feltétel van, vagyis az egyértelműséghez hiányzik egy feltétel.\\ + Ezt peremfeltételként szokás megadni: + \[ + \mathbf{S}'(a) = f'(a), \quad \mathbf{S}'(b) = f'(n)\ \text{(Hermite feltételek)} + \] + + \noindent A feladat szétbontható $n$ db Hermite-interpolációs feladattá.\\ +\newpage + \noindent \textbf{$\ell = 3$ harmadfokú (köbös) spline megadása\\} + \[ + \mybox{$p_{k}(x) = a_3^{(k)}(x - x_{k-1})^3 + a_2^{(k)}(x - x_{k-1})^2 + a_1^{(k)}(x - x_{k-1}) + a_{0}^{(k)} \quad (x \in l_{k})$} + \] + + \begin{itemize} + \item Az ismeretlenek száma: 4n. + \begin{itemize} + \item interpolációs feltétel minden részintervallum két szélére: \textbf{2n} feltétel\\ + (n intervallumra felosztva, intervallumonként 2 végponttal) + \end{itemize} + \item minden belső osztópontra $\mathbf{S}'_{3} \in \mathcal{C}$: \textbf{n-1} feltétel + \item minden belső osztópontra $\mathbf{S}''_{3} \in \mathcal{C}$: \textbf{n-1} feltétel + \end{itemize} + + \noindent Összesen $2n + n-1 + n-1 = \textbf{4n-2}$ feltétel van, vagyis az egyértelműséghez hiányzik két feltétel. Ezt peremfeltételként szokás megadni: + \[ + \mathbf{S}'(a) = f'(a), \quad \mathbf{S}'(b) = f'(n)\ \text{(Hermite feltételek)} + \] + + \[ + \mathbf{S}''(a) = \mathbf{S}''(b) = 0\ \text{(Természetes peremfeltételek)} + \] + + \noindent Csak periodikus függvények közelítése esetén, ha $[a, b]$ a periódus többszöröse.\\ + Ekkor $f(a) = f(b)$ és a két hiányzó feltétel: + \[ + \mathbf{S}'(a) = S'(b), \text{és} \quad \mathbf{S}''(a) = S''(b)\ \text{(Periodikus feltételek)} + \] + + \subsection*{B-Spline\\} + + \noindent \textbf{Definíció.} (Függvény tartója): Az $f: \mathbb{R} \rightarrow \mathbb{R}$ \emph{\textbf{függvény tartója}} a következő valós számhalmaz: + \[ + supp(f) := \overline{\left\{x \in \mathbb{R}: f(x) \not = 0 \right\}} + \] + + \noindent \textbf{Definíció.} (Alappontrendszer): $\Omega_{\infty} := \left\{\ldots, x_{-n}, \ldots, \ldots, x_{-1}, x_{0}, x_{1}, \ldots, x_{n}, \ldots\right\}$\\ + + \noindent $\mathbf{S}_{l}(\Omega_{\infty})$ az $\Omega_{n}$ alappontrendszeren értelmezett $l$-edfokú spline-ok halmaza.\\ + + \noindent \textbf{B-spline}: A $B_{l,k} \in \mathbf{S}_{l}(\Omega_{\infty}),\ (k \in \mathbb{Z})$ $l$-edfokú spline függvények rendszerét B-spline függvényeknek + nevezzük, ha az alábbi feltételek teljesülnek: + \begin{enumerate} + \item $B_{l,k}(x) \geq 0$ + \item $supp(B_{l,k}) = [x_{k},x_{k+l+1}]$, azaz a tartója minimális + \item $\displaystyle\sum_{k \in \mathbb{Z}}B_{l,k}(x) \equiv 1 \quad (\forall x \in \mathbb{R})$ + \end{enumerate} + + \section*{Legkisebb négyzetek módszere} + + Gyakorlati feladatok során adódik a következő probléma. Egy elsőfokú függvényt mérünk bizonyos pontokban, de + a mérési hibák miatt ezek nem lesznek egy egyenesen. Ekkor olyan egyenest keresünk, amelyik az alábbi + értelemben legjobban illeszkedik a megadott mérési ponthalmazra. + + \paragraph*{Egyenes eset} + + \noindent Legyenek adva az $(x_{i},y_{i}),\ i=1,2,\ldots,n$ mérési pontok.\\ + \noindent Keressük azt a $p_{1}(x) = a + bx$ legfeljebb elsőfokú polinomot, amelyre a következő kifejezés minimális. + + \begin{displaymath} + \mybox{ + $\displaystyle\sum_{i=1}^{n}(y_{i}-p_{1}(x_{i}))^{2} = + \displaystyle\sum_{i=1}^{n}(y_{i}-a-bx_{i})^{2}$ + } + \end{displaymath} + + \noindent Ez azt jelenti, hogy azt az egyenes keressük, amelyre a függvényértékek hibáinak + négyzetösszege minimális. + + \paragraph*{Polinom eset\\} + + \noindent Adottak az $n, N \in \mathbb{N}$, ahol $n \ll N$ és $(x_{i},y_{i}),\ i= 1,2,\ldots,n$ mérési pontok, ahol az $x_{i}$ + alappontok különbözők.\\ + \noindent Keressük azt a $p_{n}(x) = a_{0} + a_{1}x + \ldots + a_{n}x^{n} = \sum\limits_{i=0}^{n}a_{j}x^{j}$ legfeljebb $n$-edfokú polinomot, melyre a következő kifejezés minimális. + + \begin{displaymath} + \mybox{$\displaystyle\sum_{i=1}^{m}(y_{i}-p_{n}(x_{i}))^{2}$} + \end{displaymath} + + {\footnotesize + \noindent \textbf{Definíció}: Az $m \times n$-es $A$ mátrix transzponáltján azt az $A^{T}$-vel jelölt $n \times m$-es mátrixot értjük, amelyet az $A$ sorainak és oszlopainak felcserélésével kapunk. Azaz + \[ + A^{T} = [a_{ij}]^{T} = [a_{ji}] + \] + } + \noindent A feladat megoldásához tekintsük annak egy átfogalmazását.\\ + + \noindent Vegyük a $p_{n}(x_{i}) = y_{i}, (i=1,2,...,m)$ egyenletrendszert. Ez a rendszer az ismeretlen $a_{i}$ együtthatókra nézve + lineáris, mégpedig túlhatározott, amelynek az $A$ mátrixa egy téglalap alakú Vandermonde-mátrix $A \in \mathbb{R}^{m \times (n+1)}$, + a $b \in \mathbb{R}^{m}$ jobb oldali vektorra pedig a függvényértékekből adódik: + +{\small + \begin{displaymath} + \begin{bmatrix} + 1 & x_{1} & x_{1}^{2} & ... & x_{1}^{n} \\[0.3em] + 1 & x_{2} & x_{2}^{2} & ... & x_{2}^{n} \\[0.3em] + 1 & x_{3} & x_{3}^{2} & ... & x_{3}^{n} \\[0.3em] + \rotatebox[origin=c]{90}{...} & \rotatebox[origin=c]{90}{...} &\rotatebox[origin=c]{90}{...} & \rotatebox[origin=c]{90}{...} & \rotatebox[origin=c]{90}{...} \\[0.3em] + 1 & x_{m} & x_{m}^{2} & ... & x_{m}^{n} \\[0.3em] + \end{bmatrix} + \begin{bmatrix} + a_{0} \\[0.3em] + a_{1} \\[0.3em] + a_{2} \\[0.3em] + \rotatebox[origin=c]{90}{...} \\[0.3em] + a_{n} + \end{bmatrix} + = + \begin{bmatrix} + y_{0} \\[0.3em] + y_{1} \\[0.3em] + y_{2} \\[0.3em] + \rotatebox[origin=c]{90}{...} \\[0.3em] + y_{m} + \end{bmatrix} + \end{displaymath} +} + \noindent Ezen jelölésekkel a minimalizálandó kifejezés $\Vert Az - b \Vert_{2}^{2}$, ahol $z = [a_{0},a_{1}, ..., a_{n}]^{T}$ + a keresett együtthatók vektorra. A feladat megoldását a Gauss-féle normálegyenletek adják: + + \begin{displaymath} + A^{T}Az = A^{T}b + \end{displaymath} + + \noindent A fenti lineáris egyenletrendszert kell megoldani $z$-re.\\ + + \noindent \textbf{n=1 eset}: Ekkor a feladatot gyakran lineáris regressziónak is hívjuk. Ebben az esetben + \begin{displaymath} + A^{T}A = \begin{bmatrix} + m & \sum\limits_{i=1}^{m} x_{i} \\[0.3em] + \sum\limits_{i=1}^{m} x_{i} & \sum_{i=1}^{m} x_{i}^{2} + \end{bmatrix} \ , + A^{T}b = \begin{bmatrix} + \sum\limits_{i=1}^{m} y_{i} \\[0.3em] + \sum\limits_{i=1}^{m} x_{i}y_ {i} + \end{bmatrix} \ , + z = \begin{bmatrix} + b \\[0.3em] + a + \end{bmatrix} + \end{displaymath} +\newpage + \subsection*{Kiegészítés} + \small + \paragraph*{Elégséges feltétel a konvergenciára (lineáris egyenletrendszer)} + + \noindent Tekintsük az $\underline{x} = B\underline{x} + \underline{r}$ egyenletet, ahol $\Vert B \Vert < 1$ valamely indukált vagy illeszkedő normában.\\ + + \noindent Ekkor + \begin{itemize} + \item $\exists! x^{*} \in \mathbb{R}^{n} : x^{*} = B\underline{x}^{*} + \underline{r}$ + \item $\forall \underline{x}^{(0)} \in \mathbb{R}^{n}$ kezdőérték esetén, az $\underline{x}^{(k+1)} = B\underline{x}^{(k)} + \underline{r}$ rekurzióval definiált sorozat konvergens, és a határértéke az $x^{*}$ lesz, vagyis + \[ + \lim\limits_{k \to \infty} \underline{x}^{(k)} = \underline{x}^{*} + \] + \item teljesül az alábbi hibabecslés is: + \[ + \Vert \underline{x}^{(k)} - \underline{x}^{*} \Vert \leq \ddfrac{\Vert B \Vert^{k}}{1 - \Vert B \Vert}\Vert \underline{x}^{(1)} - \underline{x}^{(0)} \Vert + \] + \end{itemize} +\centerline{\rule{17cm}{0.4pt}} + \noindent Az $L$ mátrix \emph{alsó háromszögmátrix}, az $A$ mátrix szigorú alsó része, vagyis + \[ + l_{i,j} = a_{i,j},\ \text{ha}\ i > j,\ \text{különben}\ 0, + \left( + \begin{array}{cccc} + 0 & 0 & \cdots & 0 \\ + \textbf{x} & 0 & \ddots & \vdots \\ + \vdots & \ddots & \ddots & \vdots \\ + \textbf{x} & \cdots & \textbf{x} & 0 \\ + \end{array} + \right) + \] + az $U$ \emph{felső háromszögmátrix}, az $A$ mátrix szigorú felső része, vagyis + \[ + u_{i,j} = a_{i, j},\ \text{ha}\ i < j,\ \text{különben}\ 0, + \left( + \begin{array}{cccc} + 0 & \textbf{x} & \cdots & \textbf{x} \\ + 0 & 0 & \ddots & \vdots \\ + \vdots & \ddots & \ddots & \textbf{x} \\ + 0 & \cdots & 0 & 0 \\ + \end{array} + \right) + \] + a $D$ pedig \emph{invertálható diagonális mátrix} az $A$ mátrix diagonális része, vagyis + \[ + d_{i, j} = a_{i, j},\ \text{ha}\ i = j,\ \text{különben}\ 0. + \left( + \begin{array}{cccc} + \textbf{x} & 0 & \cdots & 0 \\ + 0 & \textbf{x} & \ddots & \vdots \\ + \vdots & \ddots & \ddots & \vdots \\ + 0 & \cdots & 0 & \textbf{x} + \end{array} + \right) + \] +\centerline{\rule{17cm}{0.4pt}} + \noindent A Jacobi-iteráció kanonikus alakját a következő átalakításokkal kaphatjuk meg: + \begin{center} + $\underline{x}^{(k+1)} = -D^{-1}(L + U)\underline{x}^{(k)} + D^{-1}\underline{b}$ \\ + $D\underline{x}^{(k+1)} + (L + U)\underline{x}^{(k)} = \underline{b}$ \\ + $D(\underline{x}^{(k+1)} - \underline{x}^{(k)}) + (L + U)\underline{x}^{(k)} + D\underline{x}^{(k)} = \underline{b}$ \\ + $D(\underline{x}^{(k+1)} - \underline{x}^{(k)}) + \underbrace{(L + U + D)}_{=A}\underline{x}^{(k)} = \underline{b}$ \\ + $D(\underline{x}^{(k+1)} - \underline{x}^{(k)}) + A\underline{x}^{(k)} = \underline{b}$ + \end{center} + + \noindent \textbf{Állítás}. Ha a Jacobi iteráció által előállított ($\underline{x}^{(k)}$) vektorsorozat konvergens, azaz létezik $\underline{x}^{*}$, melyre $\lim\limits_{k \to \infty}\underline{x}^{(k)} = \underline{x}^{*}$, akkor $\underline{x}^{*}$ megoldása az $A\underline{x} = \underline{b}$ egyenletrendszernek.\\ + + \noindent \textbf{Bizonyítás}. A Jacobi-iteráció kanonikus képletében térjünk át limeszre, és felhasználva, hogy $\lim\lambda x = \lambda \lim x\ \text{és} \lim(A + B) = \lim A + \lim B$ + \[ + \lim\limits_{k \to \infty}\Big[D(\underline{x}^{(k+1)} - \underline{x}^{(k)}) + A\underline{x}^{(k)}\Big] = D \lim\limits_{k \to \infty}(\underbrace{\underline{x}^{(k+1)} - \underline{x}^{(k)}}_{\to \underline{x}^{*} - \underline{x}^{*} = 0}) + A \lim\limits_{k \to \infty}\underbrace{\underline{x}^{(k)}}_{\to \underline{x}^{*}} = A\underline{x}^{*} = \underline{b} + \] + \noindent Felhasználva, hogy $\lim\lambda x = \lambda \lim x\ \text{és} \lim(A + B) = \lim A + \lim B$. + + \noindent Ha az $Ax = b$ lineáris egyenletrendszer mátrixa szigorúan diagonálisan domináns + \[ + ||B_{J}||_{\infty} = ||-D^{-1}(L+U)||_{\infty} = \max_{1 \leq k \leq n} \sum_{\substack{i=1\\ i \not = k}}^{n} \ddfrac{|a_{i,k}|}{|a_{i,i}|} = \max_{1 \leq k \leq n}\ddfrac{1}{|a_{i,i}|} \sum_{\substack{i=1\\ i \not = i}}^{n} |a_{i,k}| < 1 \qquad \text{(soraira)} + \] + \[ + ||B_{J}||_{1} = ||-D^{-1}(L+U)||_{1} = \max_{1 \leq i \leq n} \sum_{\substack{k=1\\ k \not = i}}^{n} \ddfrac{|a_{i,k}|}{|a_{i,i}|} = \max_{1 \leq i \leq n}\ddfrac{1}{|a_{i,i}|} \sum_{\substack{k=1\\ k \not = i}}^{n} |a_{i,k}| < 1 \qquad \text{(oszlopaira)} + \] + akkor a Jakobi-iteráció konvergens.\\ +\centerline{\rule{17cm}{0.4pt}} + \noindent Példa Jacobi-iterációra. Tekintsük a következő egyenletrendszert: + \begin{center} + $\begin{bmatrix} + 5 & -2 & 1 \\[0.3em] + 0 & 3 & -1 \\[0.3em] + 2 & -1 & 6 \\[0.3em] + \end{bmatrix}_{A}$\underline{x} = + $\begin{bmatrix} + 4 \\[0.3em] + 2 \\[0.3em] + 7 \\[0.3em] + \end{bmatrix}_{b}$ + \end{center} + + \noindent Képezzük a Jacobi iteráció komponensenkénti alakját, majd számoljuk ki az első négy iterációs lépést az $x^{(0)} = \left[0,0,0\right]^{T}$ vektorból kiindulva. + + \begin{center} + $5x_1 -2x_2 + x_3 = 4$ \\ + $3x_2 -x_3 = 2$ \\ + $2x_1 - x_2 + 6x_3 = 7$ \\ + $\downarrow$ + \end{center} + \begin{center} + $5x_1 = 4 + 2x_2 - x_3$ \\ + $3x_2 = 2 + x_3 $ \\ + $6x_3 = 7 - 2x_1 + x_2$ \\ + $\downarrow$ + \end{center} + + \begin{center} + $x_1 = \ddfrac{4}{5} + \ddfrac{2x_2}{5} - \ddfrac{x_3}{5}$ \\ + $x_2 = \ddfrac{2}{3} + \ddfrac{x_3}{3} $ \\ + $x_3 = \ddfrac{7}{6} - \ddfrac{2x_1}{6} + \ddfrac{x_2}{6}$ \\ + $\downarrow$ {\tiny (átrendezés után)} + \end{center} + + \begin{center} + $x_1^{(k+1)} = \ddfrac{\textbf{2}}{\textbf{5}} x_2^{(k)} - \ddfrac{\textbf{1}}{\textbf{5}}x_3^{(k)} + \ddfrac{\textbf{4}}{\textbf{5}} $ \\ + $x_2^{(k+1)} = \ddfrac{\textbf{1}}{\textbf{3}}x_3^{(k)} + \ddfrac{\textbf{2}}{\textbf{3}}$ \\ + $x_3^{(k+1)} = - \ddfrac{\textbf{2}}{\textbf{6}}x_1^{(k)} + \ddfrac{\textbf{1}}{\textbf{6}}x_2^{(k)} + \ddfrac{\textbf{7}}{\textbf{6}}$ \\ + \end{center} + + \noindent Írjuk vissza mátrix alakra: + + \begin{center} + $\begin{bmatrix} + x_1^{(k+1)} \\[0.3em] + x_2^{(k+1)} \\[0.3em] + x_3^{(k+1)} \\[0.3em] + \end{bmatrix}$ = + $\begin{bmatrix} + 0 & \ddfrac{\textbf{2}}{\textbf{5}} & -\ddfrac{\textbf{1}}{\textbf{5}} \\[0.3em] + 0 & 0 & \ddfrac{\textbf{1}}{\textbf{3}} \\[0.3em] + -\ddfrac{\textbf{2}}{\textbf{6}} & \ddfrac{\textbf{1}}{\textbf{6}} & 0 \\[0.3em] + \end{bmatrix}_{A} \cdot$ + $\begin{bmatrix} + x_1^{(k)} \\[0.3em] + x_2^{(k)} \\[0.3em] + x_3^{(k)} \\[0.3em] + \end{bmatrix}$+ + $\begin{bmatrix} + \ddfrac{\textbf{4}}{\textbf{5}} \\[0.3em] + \ddfrac{\textbf{2}}{\textbf{3}} \\[0.3em] + \ddfrac{\textbf{7}}{\textbf{6}} \\[0.3em] + \end{bmatrix}$ + \end{center} + + \noindent A kezdővektor $x^{(0)} = \left[0,0,0\right]^{T}$, így az első négy iterációs lépés a következő. + + \begin{center} + $x^{(1)}$ = + $\begin{bmatrix} + 0 & -\ddfrac{2}{5} & \ddfrac{1}{5} \\[0.3em] + 0 & 0 & \ddfrac{1}{3} \\[0.3em] + -\ddfrac{2}{6} & \ddfrac{1}{6} & 0 \\[0.3em] + \end{bmatrix}_{A} \cdot$ + $\begin{bmatrix} + 0 \\[0.3em] + 0 \\[0.3em] + 0 \\[0.3em] + \end{bmatrix}_{x^{(0)}}$+ + $\begin{bmatrix} + \ddfrac{4}{5} \\[0.3em] + \ddfrac{2}{3} \\[0.3em] + \ddfrac{7}{6} \\[0.3em] + \end{bmatrix}_{b}$= + $\begin{bmatrix} + \ddfrac{\textbf{4}}{\textbf{5}} \\[0.3em] + \ddfrac{\textbf{2}}{\textbf{3}} \\[0.3em] + \ddfrac{\textbf{7}}{\textbf{6}} \\[0.3em] + \end{bmatrix}_{x^{(1)}}$ + \end{center} + \begin{center} + $x^{(2)}$ = + $\begin{bmatrix} + 0 & -\ddfrac{2}{5} & \ddfrac{1}{5} \\[0.3em] + 0 & 0 & \ddfrac{1}{3} \\[0.3em] + -\ddfrac{2}{6} & \ddfrac{1}{6} & 0 \\[0.3em] + \end{bmatrix}_{A} \cdot$ + $\begin{bmatrix} + \ddfrac{\textbf{4}}{\textbf{5}} \\[0.3em] + \ddfrac{\textbf{2}}{\textbf{3}} \\[0.3em] + \ddfrac{\textbf{7}}{\textbf{6}} \\[0.3em] + \end{bmatrix}_{x^{(1)}}$+ + $\begin{bmatrix} + \ddfrac{4}{5} \\[0.3em] + \ddfrac{2}{3} \\[0.3em] + \ddfrac{7}{6} \\[0.3em] + \end{bmatrix}_{b}$= + $\begin{bmatrix} + \ddfrac{\textbf{5}}{\textbf{8}} \\[0.3em] + \ddfrac{\textbf{19}}{\textbf{18}} \\[0.3em] + \ddfrac{\textbf{91}}{\textbf{90}} \\[0.3em] + \end{bmatrix}_{x^{(2)}}$ + \end{center} + \begin{center} + $x^{(3)}$ = + $\begin{bmatrix} + 0 & -\ddfrac{2}{5} & \ddfrac{1}{5} \\[0.3em] + 0 & 0 & \ddfrac{1}{3} \\[0.3em] + -\ddfrac{2}{6} & \ddfrac{1}{6} & 0 \\[0.3em] + \end{bmatrix}_{A} \cdot$ + $\begin{bmatrix} + \ddfrac{\textbf{5}}{\textbf{8}} \\[0.3em] + \ddfrac{\textbf{19}}{\textbf{18}} \\[0.3em] + \ddfrac{\textbf{91}}{\textbf{90}} \\[0.3em] + \end{bmatrix}_{x^{(2)}}$+ + $\begin{bmatrix} + \ddfrac{4}{5} \\[0.3em] + \ddfrac{2}{3} \\[0.3em] + \ddfrac{7}{6} \\[0.3em] + \end{bmatrix}_{b}$= + $\begin{bmatrix} + \ddfrac{\textbf{51}}{\textbf{50}} \\[0.3em] + \ddfrac{\textbf{271}}{\textbf{270}} \\[0.3em] + \ddfrac{\textbf{115}}{\textbf{108}} \\[0.3em] + \end{bmatrix}_{x^{(3)}}$ + \end{center} + \begin{center} + $x^{(4)}$ = + $\begin{bmatrix} + 0 & -\ddfrac{2}{5} & \ddfrac{1}{5} \\[0.3em] + 0 & 0 & \ddfrac{1}{3} \\[0.3em] + -\ddfrac{2}{6} & \ddfrac{1}{6} & 0 \\[0.3em] + \end{bmatrix}_{A} \cdot$ + $\begin{bmatrix} + \ddfrac{\textbf{51}}{\textbf{50}} \\[0.3em] + \ddfrac{\textbf{271}}{\textbf{270}} \\[0.3em] + \ddfrac{\textbf{115}}{\textbf{108}} \\[0.3em] + \end{bmatrix}_{x^{(3)}}$+ + $\begin{bmatrix} + \ddfrac{4}{5} \\[0.3em] + \ddfrac{2}{3} \\[0.3em] + \ddfrac{7}{6} \\[0.3em] + \end{bmatrix}_{b}$= + $\begin{bmatrix} + \ddfrac{2669}{2700} \\[0.3em] + \ddfrac{331}{324} \\[0.3em] + \ddfrac{8051}{8100} \\[0.3em] + \end{bmatrix}_{x^{(4)}}$ + \end{center} + \renewcommand{\arraystretch}{1} +%--- +\centerline{\rule{17cm}{0.4pt}} + \noindent A Gauss-Seidel kanonikus alakját a következő átalakításokkal kaphatjuk meg: + \begin{center} + $\underline{x}^{(k+1)} = -(D + L)^{-1}U\underline{x}^{(k)} + (D + L)^{-1}\underline{b}$ \\ + $(D + L)\underline{x}^{(k+1)} + U\underline{x}^{(k)} = \underline{b}$ \\ + $(D + L)\underline{x}^{(k+1)} - (D + L)\underline{x}^{(k)} + U\underline{x}^{(k)} + (D + L)\underline{x}^{(k)} = \underline{b}$ \\ + $(D + L)(\underline{x}^{(k+1)} - {x}^{(k)}) + \underbrace{(U + D + L)}_{=A}\underline{x}^{(k)} = \underline{b}$ \\ + $(D + L)(\underline{x}^{(k+1)} - {x}^{(k)}) + A\underline{x}^{(k)} = \underline{b}$ \\ + \end{center} + + \noindent \textbf{Állítás}. Ha a Gauss-Seidel iteráció által előállított ($\underline{x}^{(k)}$) vektorsorozat konvergens, azaz létezik $\underline{x}^{*}$, melyre $\lim\limits_{k \to \infty}\underline{x}^{(k)} = \underline{x}^{*}$, akkor $\underline{x}^{*}$ megoldása az $A\underline{x} = \underline{b}$ egyenletrendszernek.\\ + + \noindent \textbf{Bizonyítás}. A Gauss-Seidel-iteráció kanonikus képletében térjünk át limeszre, és felhasználva, hogy $\lim\lambda x = \lambda \lim x\ \text{és} \lim(A + B) = \lim A + \lim B$. + \[ + \lim\limits_{k \to \infty}\Big[(D + L)(\underline{x}^{(k+1)} - \underline{x}^{(k)}) + A\underline{x}^{(k)}\Big] = (D + L) \lim\limits_{k \to \infty}(\underbrace{\underline{x}^{(k+1)} - \underline{x}^{(k)}}_{\to \underline{x}^{*} - \underline{x}^{*} = 0}) + A \lim\limits_{k \to \infty}\underbrace{\underline{x}^{(k)}}_{\to \underline{x}^{*}} = A\underline{x}^{*} = \underline{b} + \] +%--- +\centerline{\rule{17cm}{0.4pt}} + \noindent Példa a Gauss-Seidel iterációra. Tekintsük a következő egyenletrendszert: + \renewcommand{\arraystretch}{2} + \begin{center} + $\begin{bmatrix} + -5 & -2 & 1 \\[0.3em] + 1 & 3 & -1 \\[0.3em] + 2 & -1 & 6 \\[0.3em] + \end{bmatrix}$x = + $\begin{bmatrix} + 1 \\[0.3em] + 1 \\[0.3em] + 1 \\[0.3em] + \end{bmatrix}$ + \end{center} + + \begin{center} + $\begin{bmatrix} + \textbf{-5}_{a_{1,1}} & \textbf{-2}_{a_{1,2}} & \textbf{1}_{a_{1,3}} \\[0.3em] + \textbf{1}_{a_{2,1}} & \textbf{3}_{a_{2,2}} & \textbf{-1}_{a_{2,3}} \\[0.3em] + \textbf{2}_{a_{3,1}} & \textbf{-1}_{a_{3,2}} & \textbf{6}_{a_{3,3}} \\[0.3em] + \end{bmatrix}$x = + $\begin{bmatrix} + b_{1}=1 \\[0.3em] + b_{2}=1 \\[0.3em] + b_{3}=1 \\[0.3em] + \end{bmatrix}$ + \end{center} + + \noindent A kezdővektor $x^{(0)} = \left[0,0,0\right]^{T}$, így az első két iterációs lépés a következő.\\ + \renewcommand{\arraystretch}{1} + + $ + x^{(1)}_{1} = + -\ddfrac{1}{a_{1,1}} + \Bigg( + \sum\limits_{j=1}^{0} a_{1,j}x_{j}^{(1)} + + \sum\limits_{j=2}^{3} a_{1,j}x_{j}^{(0)} - + b_{1} + \Bigg)= + -\ddfrac{1}{-5} + \Bigg( + 0 + + a_{1,1}x_{1}^{(0)} + a_{1,3}x_{3}^{(0)} - + b_{1} + \Bigg)=\\ + = \ddfrac{1}{5} + \Bigg( + -5x_{1}^{(0)} + x_{3}^{(0)} - 1 + \Bigg)= + -x_{1}^{(0)} + \ddfrac{1}{3}x_{3}^{(0)} - \ddfrac{1}{5} + = + -0 + \ddfrac{1}{3} \cdot 0 - \ddfrac{1}{5} = \textbf{-}\ddfrac{\textbf{1}}{\textbf{5}} + $\\\\ + + $ + x^{(1)}_{2} = + -\ddfrac{1}{a_{2,2}} + \Bigg( + \sum\limits_{j=1}^{1} a_{2,j}x_{j}^{(1)} + + \sum\limits_{j=3}^{3} a_{2,j}x_{j}^{(0)} - + b_{2} + \Bigg)= + -\ddfrac{1}{3} + \Bigg( + 1 \cdot x_{1}^{(1)} + + a_{2,3}x_{3}^{(0)} - + b_{2} + \Bigg)=\\ + -\ddfrac{1}{3} + \Bigg( + -\ddfrac{1}{5} - + 0 - + 1 + \Bigg)= + -\ddfrac{5}{15} + \Bigg( + -\ddfrac{3}{15} - + \ddfrac{15}{15} + \Bigg)= + \ddfrac{90}{225} = \ddfrac{\textbf{2}}{\textbf{5}} + $ + + $ + x^{(1)}_{3} = + -\ddfrac{1}{a_{3,3}} + \Bigg( + \sum\limits_{j=1}^{2} a_{3,j}x_{j}^{(1)} + + \sum\limits_{j=4}^{3} a_{3,j}x_{j}^{(0)} - + b_{3} + \Bigg)= + -\ddfrac{1}{6} + \Bigg( + 2 \cdot x_{1}^{(1)} - + 1 \cdot x_{2}^{(1)} + + 0 - + 1 + \Bigg)=\\ + -\ddfrac{1}{6} + \Bigg( + 2 \cdot -\ddfrac{1}{5} - + 1 \cdot \ddfrac{2}{5} - + 1 + \Bigg)= + -\ddfrac{1}{6} + \Bigg( + -\ddfrac{2}{5} - + \ddfrac{2}{5} - + \ddfrac{5}{5} + \Bigg)=\ddfrac{\textbf{3}}{\textbf{10}} + $ + + \noindent Tehát $x^{(1)} = \left[-\ddfrac{1}{5},\ddfrac{2}{5},\ddfrac{3}{10}\right]^{T}$. Az $x^{(2)}$ pedig hasonlóan számítható: $x^{(2)} = \left[-\ddfrac{3}{10},\ddfrac{8}{18},\ddfrac{16}{45}\right]^{T}$.\\ +% --- +\centerline{\rule{17cm}{0.4pt}} + \noindent \emph{Példa}: Adjuk meg azt a legfeljebb harmadfokú polinomot, amelyik illeszkedik az alábbi pontokra: + \[ + ({\tiny x_0=}-1,y_0=1),(x_1=0,y_1=0),(x_2=1,y_2=-1),(x_3=2,y_3=4) + \] + + \noindent Az alappontok táblázatba rendezve:\\ + + \noindent $\begin{array}{c|c|c|c|c|} + x & -1 & 0 & 1 & 2 \\ \hline + p_{3}(x) & 1 & 0 & -1 & 4 \\ + \end{array}$\\\\ + + \noindent Írjuk fel a Lagrange-alakot, amihez előbb felírjuk a következő négy alappolinomot + + \[ + l_{0}(x) = \ddfrac + {(x-x_1)(x-x_2)(x-x_3)} + {(x_0-x_1)(x_0-x_2)(x_0-x_3)} = + \ddfrac + {(x-0)(x-1)(x-2)} + {(-1-0)\cdot(-1-1)\cdot(-1-2)} = + \ddfrac + {x(x-1)(x-2)} + {(-1)\cdot(-2)\cdot(-3)} + \] + \[ + l_{1}(x) = \ddfrac + {(x-x_0)(x-x_2)(x-x_3)} + {(x_1-x_0)(x_1-x_2)(x_1-x_3)} = + \ddfrac + {(x-(-1))(x-1)(x-2)} + {(0-(-1))\cdot(0-1)\cdot(0-2)} = + \ddfrac + {(x+1)(x-1)(x-2)} + {1\cdot(-1)\cdot(-2)} + \] + \[ + l_{2}(x) = \ddfrac + {(x-x_0)(x-x_1)(x-x_3)} + {(x_2-x_0)(x_2-x_1)(x_2-x_3)} = + \ddfrac + {(x-(-1))(x-0)(x-2)} + {(1-(-1))\cdot(1-0)\cdot(1-2)} = + \ddfrac + {(x+1)x(x-2)} + {2 \cdot 1 \cdot (-1)} + \] + \[ + l_{3}(x) = \ddfrac + {(x-x_0)(x-x_1)(x-x_2)} + {(x_3-x_0)(x_3-x_1)(x_3-x_2)} = + \ddfrac + {(x-(-1))(x-0)(x-1)} + {(2-(-1))\cdot(2-0)\cdot(2-1)} = + \ddfrac + {(x+1)x(x-1)} + {3 \cdot 2 \cdot 1} + \]\\ + + \noindent Ezek után képezzük a Langrange-alakot, ami + \[ + L_{3}(x) = f(x_0)l_0(x) + f(x_1)l_1(x) + f(x_2)l_2(x) + f(x_3)l_3(x) = 1 \cdot l_0(x) + 0 \cdot l_1(x) + (-1) \cdot l_2(x) + 4 \cdot l_3(x) + \] + \noindent Az egyszerűsítés elvégzése után azt kapjuk, hogy + \[ + L_3(x) = x^3 - 2x + \] + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2.0,xmax=3.0,ymin=-2.0,ymax=5.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\tiny}, + legend style={font=\small,legend pos=outer north east,}] + \addplot[no marks,line width=2pt,blue,domain=-2.0:3.0,samples=100, thick] {(x)^3 - 2*x)}; + \addplot[only marks,color=black,thick,mark=*, mark options={fill=red}] + coordinates { + (-1, 1) + (0, 0) + (1, -1) + (2, 4) + }; + \end{axis} + \end{tikzpicture} + \end{center} + +% --- +\centerline{\rule{17cm}{0.4pt}} + \noindent Példa: $\ddfrac{\sin(x)}{1 + x^2}$. (lineáris spline)\\ + + \noindent Az $x_k$ alappontok a következők: \\ + $x_0 = -4; x_1 = -3; x_2 = -2; x_3 = -1; x_4 = 0; x_5 = 1; x_6 = 2; x_7 = 3; x_8 = 4$. \\ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-4.0,xmax=4.0,ymin=-0.6,ymax=0.6, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-4, -3, -2, -1, 0, 1, 2, 3, 4}, + ytick={-0.5,0,0.5}, + extra x ticks={0}, + tick label style={font=\tiny}, + legend style={font=\small,legend pos=outer north east,}] + \addplot[no marks,line width=1pt,black,domain=-4.0:4.0,samples=200,densely dotted] {(sin(deg(x)))/(1 + x^2)}; + \addplot[only marks,line width=2pt,red,domain=-4.0:4.0,samples=9, thick, mark=x] {(sin(deg(x)))/(1 + x^2)}; + \addplot[no marks,line width=2pt,black,domain=-4.0:4.0,samples=9, thick] {(sin(deg(x)))/(1 + x^2)}; + \end{axis} + \end{tikzpicture} + \end{center} + + \noindent Látható, hogy a lineáris spline jól közelíti a függvényt az egyes intervallumokon, kivéve a [-1, 1]-es intervallumot. Itt a függvény nem képes az eredeti görbületre illeszkedni.\\ + + \noindent $p_{1}$ polinom az $[x_{0}, x_{1}]$ intervallumon.\\ + + \begin{center} + $p_{1}(x) = a_1^{(1)}(x - x_{0}) + a_{0}^{(1)}$\\ + $\boldsymbol{a_{0}} = f(-4) = -\ddfrac{sin(4)}{17}$\\ + $\boldsymbol{a_{1}} = \ddfrac{f(x_k) - f(x_{k-1})}{x_k - x_{k-1}} = \ddfrac{10 \sin(4) - 17 \sin(3)}{170}$ + $\boldsymbol{p_{1}(x)} = \ddfrac{10 \sin(4) - 17 \sin(3)}{170}x + \ddfrac{4(10 \sin(4) - 17 \sin(3))}{170} -\ddfrac{sin(4)}{17} = \ldots = \ddfrac{1}{170}\big( (10 sin(4) - 17 sin(3))x + 30 sin(4) - 68 sin(3) \big)$\\ + \end{center} + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-4.0,xmax=-2.0,ymin=-0.1,ymax=0.1, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + xtick={-4,-3,-2}, + ytick={-0.1,0,0.1}, + extra x ticks={-3, -2}, + tick label style={font=\tiny}, + legend style={font=\small,legend pos=outer north east,}] + \addplot[no marks,line width=1pt,black,domain=-4.0:-2.0,samples=50,densely dotted] {(1/(1 + x^2))*sin(deg(x))}; + \addlegendentry{$f(x)$} + \addplot[only marks,line width=2pt,red,domain=-4.0:-3.0,samples=2, thick, mark=x] {(1/170)*(10*x*sin(deg(4))-17*x*sin(deg(3))+30*sin(deg(4))-68*sin(deg(3)))}; + \addplot[no marks,line width=2pt,black,domain=-4.0:-3.0,samples=2, thick] {(1/170)*((10*sin(deg(4))-17*sin(deg(3)))*x+30*sin(deg(4))-68*sin(deg(3)))}; + \addlegendentry{$x_{0},x_{1}$} + \addlegendentry{$p_{1}(x)$} + \end{axis} + \end{tikzpicture} + \end{center} +\centerline{\rule{17cm}{0.4pt}} + \noindent Példa: Számoljuk ki, majd rajzoljuk fel az alábbi pontokra négyzetesen legjobban illeszkedő egyenest: $(x_1 = -1; y_1 =0) \quad (x_2 = 0; y_2 = 1) \quad (x_3 = 1; y_3 = 0) \quad (x_4 = 2; y_4 = 2)$ (legkisebb négyzetek módszere) + +\begin{tabular}{p{0.48\textwidth} p{0.48\textwidth}} + $A^{T}A = \begin{bmatrix} + n & \sum\limits_{i=1}^{n}x_{i} \\[0.3em] + \sum\limits_{i=1}^{n}x_{i} & \sum\limits_{i=1}^{n}x_{i}^{2} \\[0.3em] + \end{bmatrix} = + \begin{bmatrix} + 4 & 2 \\[0.3em] + 2 & 6 \\[0.3em] + \end{bmatrix}$ +& + $A^{T}b = \begin{bmatrix} + \sum\limits_{i=1}^{n}y_{i} \\[0.3em] + \sum\limits_{i=1}^{n}x_{i}y_{i} \\[0.3em] + \end{bmatrix} = + \begin{bmatrix} + 3 \\[0.3em] + 4 \\[0.3em] + \end{bmatrix}$ +\end{tabular} + +\begin{tabular}{p{0.48\textwidth} p{0.48\textwidth}} + $A^{T}A\underline{a} = A^{T}\underline{b}$ +& + $\begin{bmatrix} + 4 & 2 \\[0.3em] + 2 & 6 \\[0.3em] + \end{bmatrix} \cdot + \begin{bmatrix} + a_0 \\[0.3em] + a_1 \\[0.3em] + \end{bmatrix} = + \begin{bmatrix} + 3 \\[0.3em] + 4 \\[0.3em] + \end{bmatrix}$ +\end{tabular} + + \begin{center} + $4a_0 + 2a_1 = 3 \Rightarrow 4a_0 = 3 - 2a_1 \Rightarrow a_0 = \ddfrac{3-2a_1}{4}$ \\ + $2a_0 + 6a_1 = 4 \Rightarrow 2 \cdot \ddfrac{3-2a_1}{4} + 6a_1 = 4 \Rightarrow 3 - 2a_1 + 12a_1 = 8 \Rightarrow 10a_1 = 5 \Rightarrow a_1 = \ddfrac{1}{2}$ \\ + $a_0 = \ddfrac{3 - 2 \cdot \ddfrac{1}{2}}{4} = \ddfrac{1}{2}$ + \end{center} + + \noindent A megoldás: $l(x) = \ddfrac{1}{2}x + \ddfrac{1}{2}$ + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2.0,xmax=3.0,ymin=-2.0,ymax=5.0, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\tiny}, + legend style={font=\small,legend pos=outer north east,}] + \addplot[no marks,line width=2pt,blue,domain=-2.0:3.0,samples=100, thick] {(1/2)*x + 1/2}; + \addplot[only marks,color=black,thick,mark=*, mark options={fill=red}] + coordinates { + (-1, 0) + (0, 1) + (1, 0) + (2, 2) + }; + \end{axis} + \end{tikzpicture} + \end{center} +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/660px-Relative_numbers_representation.svg.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/660px-Relative_numbers_representation.svg.png new file mode 100644 index 0000000..37b319b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/660px-Relative_numbers_representation.svg.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/bijection.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/bijection.png new file mode 100644 index 0000000..948bff5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/bijection.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/diagram.drawio new file mode 100644 index 0000000..abe4c7d --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/diagram.drawio @@ -0,0 +1 @@ +7Zldb5swFIZ/DZeVMCQkuczXOmmdNCmTpu1msuAUrBnMjMlHf/1MsCHGq5JsadKNXgGv7XOMn9fGgOPP0+09x3nykUVAHc+Nto6/cDwPueNAHiplVyuTQAkxJ5Gq1Aor8gS6pVJLEkFhVBSMUUFyUwxZlkEoDA1zzjZmtUdGzaw5jsESViGmtvqFRCKp1fHQbfX3QOJEZ0auKkmxrqyEIsER2xxI/tLx55wxUZ+l2znQavD0uNTt3j1T2nSMQyZOafD1w+d7tCi/j75l4wFiD+VT8nCnoqwxLdUNO15AZbzZI5NhZa/FTg1F8LNkuuCu2IOaygpomEvYs7ZcnsXquA9U5Dj7q0CujiTvrQ5mJpBy3Vkte0Y6D7JoWjlBXoUUFwUJZa1EpFQKSPVDGQ8N9bVqrsYHIssl7bCjBqacBcBSEHwnq2xau2i3JAdO0RoHigVZm+Gxcm3chGsyfGJkD0bNsCaOml8D14xQsJKHoBoduqMTB/lmHBR0AgnMYxBWIHlycNettDffGUb0LCOiN5B/AtIf3Rak/7ai/NtGPLoSnOrEjqE997pGHPR9RbkYyGYzdiOSgUVybpEUsBUmu0Jw9gPmjDIulYxlUAEklHYkTEmcVQaQ1EDqszVwQeQOcKoKUhJFVZrZJiECVjkOq5wbud+VGmdlFkHVe9fyh+mfUbOSVAlge65pNIwOC83mwFOD33jKc5+3j8HrXDgjC469XvYGDpq8Mjpji45r0fmvF8Gj26GTF8Eu2isvghOL5LS/88wbvbJ5pvP3d7dxsYk2uPG+EdnfRHqG8iiBk98AOjtQ66X2pVHaXxV69vi7GMru9L46Svu7wqK/zz+/i3V46+ef/ba97C+eYfeF+eXwyMv2F0I92dofMf7yFw==7Zldj6IwFIZ/DZeTtHypl8q4H4mTmPVi527ShQrNFsqWKjq/fosUsXQ3o64fm8iV8NKeQ3ne0xaxnCDdfOYoT15YhKllg2hjOc+WbUMw9OVPpWxrZeg5tRBzEqlGrbAg77jpqdQViXChNRSMUUFyXQxZluFQaBrinJV6syWjetYcxdgQFiGipvqdRCJpRgFa/QsmcdJkhkBdSVHTWAlFgiJWHkjO1HICzpioj9JNgGn18JrnQvH7dvYG5y9b/m3xno9eX8vlUx3s0yld9kPgOBNnhx76ix/z2dcALWd+Hr95g3TgqS5gjehKPS/L9qlMMlkymUsOWmzVk/R/rVhz4anYcR7LBtDLpVcm7XV5FKvfXaAiR9k/BQJNJDm2OpieQMr1zTayraWzcRaNKyPJs5CioiChbJWIlEoBqvtQvoVec666q0ePI8NkH7CAe4PIysIsxYJvZb+ytWDjwOTAfY3GMUWCrPWcSFVCvA+3zzBnZEdLVe0+jqpZF+gRCrbiIVadDi3TiTPUw0C/E0cgHmNhxJEHB4NupZ0hTzAnNMwJe7gXg+uC+9J1DbqBQVfgjdB5FoKznzhglHGpZCzDFVRCaUdClMRZZQpJEkt9ssZcELksjNWFlERRlWZSJkTgRY7CKmcpF0GpcbbKIlzdPTA8o3tqsJ9xqgR4cxEjqSh+B9BAnR/4zP2Dz2zwd0tpEE8l5hvEgEHs8erxwzo6tiDtgR7IBrctyGE/3V4Tr+fdF++ox3sOlWPx+k4nUHddvvZmydzK97PzBfm63dn51nzN3fDY4PvY+yW3y9q784YJ2gYz8/X0sZn58H9j5vTr5Dmb02PnUadbpLeeR833zn6dvCBfOLozX8/gO+3nXG3OhV3Wd59zzX8WnntmGjOn+3pxPWbytP2oUZdl+2nImf4G \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffman_code_tree.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffman_code_tree.png new file mode 100644 index 0000000..c3aa314 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffman_code_tree.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffmann_split.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffmann_split.png new file mode 100644 index 0000000..897e483 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/huffmann_split.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/injection.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/injection.png new file mode 100644 index 0000000..d7ec79a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/injection.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon.png new file mode 100644 index 0000000..202f04c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon_code_tree.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon_code_tree.png new file mode 100644 index 0000000..7c41c6b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/shannon_code_tree.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/surjection.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/surjection.png new file mode 100644 index 0000000..a19eac3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/img/surjection.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.pdf new file mode 100644 index 0000000..f318adc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.tex new file mode 100644 index 0000000..c23bb0e --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/04.Számelmélet, gráfok, kódoláselmélet/tetel4.tex @@ -0,0 +1,1500 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[hungarian]{babel} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{geometry} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{ifthen} +\usepackage{listings} +\usepackage{makecell} +\usepackage{multirow} +\usepackage{newunicodechar} +\usepackage{pgf,tikz} +\usepackage{subcaption} +\usepackage{tipa} +\usepackage{wasysym} +\usepackage{xcolor} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\definecolor{mygray}{rgb}{0.15, 0.15, 0.15} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{4. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 4. Számelmélet, gráfok, kódoláselmélet} \\ + \end{center} + + \section*{Számelmélet} + + \subsection*{Relációk, rendezések\\} + + \paragraph{Alapfogalmak} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Az $(x,y)$ \emph{\textbf{rendezett pár}}, ha $(x,y) = (u,v) \Longleftrightarrow x = u \ \land \ y = v$.\\ + Ezt a tulajdonságot halmazokkal definiáljuk: + \[ + (x,y) := \{ \{x\}, \{x, y\} \} + \] + \item Az $X,Y$ \textbf{\emph{halmazok Descartes-szorzata}} vagy direkt szorzata: + \[ + X \times Y := \{ (x,y) : x \in X, y \in Y \} + \] + \item Ha $X, Y$ halmazokra $R \subset X\times Y$, akkor $R$ \emph{\textbf{reláció}} $X$ és $Y$ között. + \item Egy halmazt \emph{\textbf{binér relációnak}} nevezünk, ha minden eleme rendezett pár.\\ + Ha $R$ binér reláció és $(x,y) \in R$, akkor használható a következő jelölés: $xRy$ + \item Az $R$ binér reláció \emph{\textbf{értelmezési tartománya}}: $\textrm{dmn}(R) := \{ x\ | \ \exists y : (x,y)\in R \}$ + \item Az $R$ binér reláció \emph{\textbf{értékkészlete}}: $\textrm{rng}(R) := \{ y\ | \ \exists x : (x,y)\in R \}$ + \item Egy $R$ binér reláció \emph{\textbf{inverze}}: $R^{-1} := \{(a,b) : (b,a) \in R\}$ + \item Legyen $R$ binér reláció, és $A$ halmaz. Az $A$ \emph{\textbf{halmaz képe}}: $R(A) := \{y \ | \ \exists x\in A: (x,y) \in R\}$ + \item Az $R$ és $S$ binér relációk \emph{\textbf{kompozíciója}}: + \[ + R \circ S := \{ (x,y) \ | \ \exists z : (x,z) \in S \ \land \ (z,y) \in R \ \} + \] + \end{itemize} + + \paragraph*{Tulajdonságok\\} + Az $R$ egy $X$-beli binér reláció (azaz $R \subset X\times X$), és $\forall x,y,z \in X$, ekkor a reláció \\ + + \renewcommand{\arraystretch}{1.8} + {\footnotesize + \noindent \begin{tabular}{|l|l|} + \hline + \textit{\textbf{reflexív}} & $(x,x)\in R$ \\ \hline + \textit{\textbf{irreflexív}} & $(x,x)\notin R$ \\ \hline + \textit{\textbf{szimmetrikus}} & $(x,y)\in R \Longrightarrow (y,x) \in R $ \\ \hline + \textit{\textbf{antiszimmetrikus}} & $(x,y)\in R \ \land \ (y,x) \in R \Longrightarrow x = y$ \\ \hline + \textit{\textbf{szigorúan antiszimmetrikus}} & $(x,y)\in R \Longrightarrow (y,x) \notin R$ \\ \hline + \textbf{tranzitív} & $(x,y)\in R \ \land \ (y,z) \in R \Longrightarrow (x,z) \in R $ \\ \hline + \textit{\textbf{trichotóm}} & + \begin{tabular}[c]{@{}l@{}}Ha minden $x,y \in X$ esetén az alábbiak közül pontosan egy teljesül\\ + $\quad \ a)\ x=y$\\ + $\quad \ b)\ (x,y) \in R$\\ + $\quad \ c)\ (y,x) \in R$\\ + \end{tabular} \\ \hline + \textit{\textbf{dichotóm}} & $(x,y) \in R \ \lor \ (y,x) \in R$ \\ \hline + \end{tabular} + }\\ + \renewcommand{\arraystretch}{1} + + \paragraph*{Rendezések} + + \noindent Legyen $X$ halmaz, $R$,$S$ relációk $X$-beliek. + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Az $R$ binér reláció \emph{\textbf{ekvivalenciareláció}}, ha + \begin{itemize} + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item Reflexív + \item Szimmetrikus + \item Tranzitív + \end{itemize} + + \item Az $R$ binér reláció \emph{\textbf{részbenrendezés}}, ha + \begin{itemize} + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item Reflexív + \item Antiszimmetrikus + \item Tranzitív + \end{itemize} + + \item Az $R$ binér reláció \emph{\textbf{(teljes) rendezés}}, ha + \begin{itemize} + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item Részbenrendezés, és + \item Dichotóm + \end{itemize} +% \item $S$-et az $R$ \emph{szigorítás}ának nevezzük, ha +% \[ +% (x,y) \in R \ \land \ x \neq y \Rightarrow (x,y) \in S +% \] +% \\ +% Megfordítva, ha +% \[ +% (x,y) \in R \ \lor \ x = y \Rightarrow (x,y) \in T +% \] +% akkor $T$ az $R$-hez megfelelő \emph{gyenge reláció}.\\ + + \item $X$ részhalmazainak egy $\mathcal{O}$ rendszerét \emph{\textbf{osztályozás}}nak hívjuk, ha $\mathcal{O}$ páronként diszjunkt nemüres halmazokból álló halmazrendszer, melyre $\bigcup\mathcal{O} = X$.\\ + + \textbf{Tétel}: Egy ekvivalenciareláció meghatároz egy osztályozást.\\ + Fordítva: $\mathcal{O}$ osztályozásra, az $R = \bigcup\Big\{Y\times Y : Y \in \mathcal{O} \Big\}$ ekvivalenciareláció. + + \end{itemize} + + \subsection*{Korlátok\\} + + \paragraph*{Legkisebb, legnagyobb, minimális, maximális elem} + $X$ halmazbeli \emph{részbenrendezés} ($\preccurlyeq$) \emph{legkisebb} (legelső) eleme egy olyan $x\in X$, hogy + \[ + \forall y \in X : x\preccurlyeq y + \] + (Ilyen nem biztos, hogy létezik, de ha igen, akkor egyértelmű).\\ + $X$ halmazbeli \emph{részbenrendezés} ($\preccurlyeq$) \emph{legnagyobb} (utolsó) eleme egy olyan $x\in X$, hogy + \[ + \forall y \in X : y \preccurlyeq x + \] + \begin{itemize} + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item $x$-et \emph{\textbf{minimálisnak}} nevezzük, ha nincs nála kisebb elem, + \item $x$-et \emph{\textbf{maximálisnak}} nevezzük, ha nincs nála nagyobb elem. + \end{itemize} + (Szemben a legkisebb/legnagyobb elemekkel, minimális/maximális elemből több is lehet.\\ + Ha viszont $X$ rendezett, akkor legkisebb=minimális, legnagyobb=maximális.) + \paragraph*{Alsó, felső korlát} + $X$ részbenrendezett halmaz, $Y \subset X$. Az $x \in X$ elem az $Y$ + \begin{itemize} + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item \emph{alsó korlátja}, ha $\forall y \in Y : x \preccurlyeq y$. + \item \emph{felső korlátja}, ha $\forall y \in Y : y \preccurlyeq x$. + \end{itemize} + Látható, hogy $x$ nem feltétlenül eleme $Y$-nak, sőt az is lehet, hogy $Y$-nak nincs alsó/felső korlátja, vagy akár több is van. Ha azonban $x\in Y$, akkor egyértelmű és ez Y legkisebb eleme. + \paragraph*{Infimum, szuprémum} + Ha az alsó korlátok között van \emph{legnagyobb elem}, azt $Y$ alsó határának, \emph{\textbf{infimum}}ának nevezzük. (Jelölése: $\inf Y$) \\ + Ha a felső korlátok között van \emph{legkisebb elem}, azt $Y$ felső határának, szuprémumának nevezzük. (Jelölése: $\sup Y$) + \paragraph*{Alsó, felső határ tulajdonság} + $X$ részbenrendezett halmaz. Ha $ \forall\ \emptyset \neq Y \subset X$ : $Y$ felülről korlátos és van \emph{\textbf{szuprémum}}a, akkor felső határ tulajdonságú. + Illetve ha $ \forall\ \emptyset \neq Y \subset X$ : $Y$ alulról korlátos és van infimuma, akkor alsó határ tulajdonságú. + + \subsection*{Függvények és műveletek} + + \subsubsection*{Függvények} + + Egy $f$ reláció \emph{\textbf{függvény}}, ha + \[ + (x,y) \in f \ \land (x,y') \ \in f \Longrightarrow y = y' + \] + Más szóval minden $x$-hez legfeljebb egy olyan $y$ létezik, hogy $(x,y) \in f$\\ + + \noindent Így minden $x \in$ dmn($f$)-re az $f(x) = \{y\}$.\\ + \emph{Jelölése}: $f(x) = y$\ \ vagy\ \ $f: x \mapsto y$\ \ vagy\ \ $f_x = y$. + + \paragraph*{Értelmezési tartomány, értékkészlet\\} + Az $f : X \rightarrow Y$ jelölést használjuk, ha dmn($f$) $ = X $. \\ + Az $f \in X \rightarrow Y$ jelölést használjuk, ha dmn($f$) $\subset X$ (amikor dmn($f$)$ \subsetneq X$ is előfordulhat).\\ + Mindkét esetben rng($f$) $\subset Y$.\\ + + \noindent Az $f$ függvény\\ + + \renewcommand{\arraystretch}{2} + $\begin{array}{|c|c|c|} + \hline + \makecell{\text{\emph{\textbf{injektív}}}\\ \text{kölcsönösen egyértelmű}} & \emph{\textbf{szürjektív}} & \emph{\textbf{bijektív}} \\ \hline + f(x) = y \ \land \ f(x') = y \ \Longrightarrow \ x = x' & \forall y \in Y : \exists x\in X : f(x) = y & \emph{injektív és szürjektív} \\ + \makecell{\text{Ez azzal ekvivalens, hogy}\\ f^{-1}\ \text{reláció is függvény.}} & \makecell{\text{Azaz}\ rng(f) = Y.\\ \text{Tehát az \emph{f} függvény}\\ \text{az egész \emph{Y}-ra képez.}} & \\ \hline + \includegraphics[width=0.25\textwidth]{img/injection.png} + & + \includegraphics[width=0.25\textwidth]{img/surjection.png} + & + \includegraphics[width=0.25\textwidth]{img/bijection.png} + \\ \hline + \end{array}$ + \renewcommand{\arraystretch}{1} + + \paragraph*{Indexelt család\\} + Az $x$ függvény $i$ helyen felvett értékét $x_i$-vel is szoktuk jelölni.\\ + + \noindent Ilyenkor gyakran + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item dmn($f$) = $I$ értelmezési tartományt \emph{\textbf{indexhalmaz}}nak, az + \item elemeit \emph{\textbf{index}}eknek, + \item rng($f$)-et \emph{\textbf{indexelt halmaz}}nak, és magát + \item az $x$ függvényt \emph{\textbf{indexelt család}}nak szoktuk nevezni. + \end{itemize} + + \subsection*{Műveletek} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{Binér művelet}: $f : \textbf{X} \times \textbf{X} \rightarrow X$ függvény az $X$ halmazon. + \item \textbf{Unér művelet}: $f : \textbf{X} \rightarrow X$ függvény az $X$ halmazon. + \item \textbf{Nullér művelet}: $f : \{\emptyset \} \rightarrow X$ az $X$ halmazon. (Gyakorlatilag elemkiválasztás) + \end{itemize} + + \paragraph*{Tulajdonságok} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Legyen $\boxplus, \circledcirc$ binér műveletek $X$-en. $\forall x,y,z \in X.$ + \begin{enumerate} + \item $\boxplus$ \emph{\textbf{asszociatív}}, ha + \[ + (x \ \boxplus \ y ) \ \boxplus \ z = x \ \boxplus \ (y \ \boxplus z) + \] + \item $\boxplus$ \emph{\textbf{kommutatív}}, ha + \[ + x \ \boxplus \ y = y \ \boxplus \ x + \] + + \item $\boxplus$ \emph{\textbf{disztributív}} a $\circledcirc$-ra, ha + \[ + x \ \boxplus \ (y \ \circledcirc \ z) = (x \ \boxplus \ y) \ \circledcirc \ (x \ \boxplus \ z) \quad \textrm{ - baloldali} + \] + \[ + (y \ \circledcirc \ z) \ \boxplus \ x = (y \ \boxplus \ x) \ \circledcirc \ (z \ \boxplus \ x) \quad \textrm{ - jobboldali} + \] + \end{enumerate} + + \item Legyen $\circledcirc $ binér művelet $X$-en és $\boxdot$ binér művelet $Y$-on + $f : X \rightarrow Y$ \emph{\textbf{művelettartó}} ha: + \[ \forall x_1,x_2 \in X: f(x_1 \ \circledcirc \ x_2) = f(x_1) \ \boxdot \ f(x_2) \] + \end{itemize} + + \section*{Számfogalom, komplex számok} + + \subsection*{Számfogalom} + + \paragraph*{Algebrai struktúrák\\} + + \noindent Legyen $G$ halmaz és $\star$ egy művelet\\ + + \noindent \emph{\textbf{Semleges (egység) elem}}: $a \in G$ semleges elem, ha $\forall g \in G : a \star g = g \star a = g$.\\ + + \noindent \emph{\textbf{Inverz elem}}: $g,g^{-1} \in G$ és $a\in G$ semleges elem, akkor a $g^{-1}$ a $g$ inverze, ha + \[ + g\star g^{-1} = a\ \text{és}\ g^{-1} \star g = a + \] + + \noindent \emph{\textbf{Nullosztó}}: $x,y$ nullától különböző elemek, de $x\cdot y = 0$. + (\emph{x} bal oldali, \emph{y} jobb oldali nullosztó) + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A $G$ halmaz egy $\star$ művelettel, azaz a $(G, \star)$ párt \emph{\textbf{grupoid}}nak nevezzük. + \item Ha egy grupoidban a $\star$ \emph{művelet asszociatív}, akkor a grupoid \emph{\textbf{félcsoport}}. + \item \emph{Semleges elemes félcsoportot} \emph{\textbf{monoid}}nak nevezzük. + \item Ha egy \emph{monoidban minden elemnek van inverze}, akkor \emph{\textbf{csoport}}ról beszélünk. + \item Ha egy \emph{csoportban a művelet kommutatív}, akkor \emph{\textbf{Abel-csoport}}. + \item Az $(R,+,\cdot)$ \emph{\textbf{gyűrű}}, ha + \begin{itemize} + \item az összeadással Abel-csoport, + \item a szorzással félcsoport és + \item teljesül mindkét oldali disztributivitás. + \end{itemize} + + Ha a \emph{szorzás kommutatív}, akkor \textbf{\emph{kommutatív gyűrű}}. + + Ha a \emph{szorzásnak van egységeleme}, akkor \emph{\textbf{egységelemes gyűrű}}. + \item A nullosztó mentes kommutatív gyűrűt \emph{\textbf{integritási tartomány}}nak nevezzük. + + \item Az $R$ integritási tartomány \emph{\textbf{rendezett integritási tartomány}}, ha rendezett halmaz, továbbá az összeadás és szorzás monoton. + \begin{itemize} + \item \textit{Összeadás monoton: $x,y,z \in R$ és $x \leq y \ \Rightarrow \ x+z \leq y+z$ + \item Szorzás monoton: $x,y \in R$ és $x,y\geq0 \ \Rightarrow \ x\cdot y \geq 0$ } + \end{itemize} + \item Egy $R$ gyűrűt, ha $R\setminus\{0\}$ \emph{szorzással Abel-csoport}, akkor \emph{\textbf{test}}nek nevezzük. + \item Ha egy test rendezett integritási tartomány, akkor \emph{\textbf{rendezett test}}. + \end{itemize} + + \subsubsection*{Természetes számok} + Legyen $^+ : \N \rightarrow \N$ unér művelet. Az alábbi feltételeket \emph{\textbf{Peano-axiómák}}nak nevezzük: + \renewcommand{\arraystretch}{2} + $\begin{array}{ll} + 1.\ \ 0 \in \N & \text{(a 0 természetes szám)} \\ + 2.\ \ \forall n \in \N, \exists! n^+ \in \N \textit{, hogy}\ n \neq n^+ & \text{(n \emph{rákövetkezője})} \\ + 3.\ \ \nexists n \in \N,\ \text{hogy}\ n^+ = 0 & \makecell[l]{(\text{nem létezik olyan természetes szám,}\\ \text{aminek a 0 a rákövetkezője})} \\ + 4.\ \ \text{Ha}\ n,\ m\ \in \N,\ \text{és}\ m^+ = n^+,\ akkor\ n = m & \text{(a $^+$ művelet injektív)} \\ + 5.\ \ \makecell[l]{A \subseteq \N,\ 0 \in A,\ \text{továbbá}\\ \forall n \in A : n^+\in A,\ \text{akkor}\ A = \N} & \text{(a matematikai indukció elve)} + \end{array}$\\\\ + \renewcommand{\arraystretch}{1} + + \noindent \textbf{Tétel}. Van olyan $\big(\mathbb{N}, (0,^{+})\big)$ pár, amely eleget tesz a Peano axiómáknak.\\ +\newpage + \noindent \textbf{Műveletek} + {\small + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Összeadás \\ + $k,m,n \in \N$, akkor: + \begin{enumerate} + \item \emph{Asszociatív}: $(k+m)+n = k+(m+n)$ + \item \emph{Kommutatív}: $n+k = k+n$ + \item $n+0 = 0+n = n \qquad$ \textit{(\textbf{0}: additív zéruselem)} + \item \emph{Egyszerűsítési szabály}: $n+k = m+k$ vagy $k+n = k+m$, akkor $m=n$ + \end{enumerate} + \item Szorzás \\ + $k,m,n \in \N$, akkor: + \begin{enumerate} + \item \emph{Asszociatív}: $(k\cdot m)\cdot n = k\cdot (m\cdot n)$ + \item \emph{Kommutatív}: $n\cdot k = k\cdot n$ + \item $ 0\cdot n = n\cdot 0 = 0 \qquad$ \textit{(\textbf{0}: multiplikatív zéruselem)} + \item $n\cdot 1 = 1\cdot n = n \qquad$ \textit{(\textbf{1}: a multiplikatív egységelem)} + \item \emph{Disztributív}: $k\cdot (m+n) = k\cdot m + \cdot n$, illetve $(m+n) \cdot k = m\cdot k+n\cdot k$ + \item \emph{Egyszerűsítési szabály}: $k\neq 0$ esetén: $n\cdot k = m\cdot k$, akkor $m=n$ + \end{enumerate} + \end{itemize} + } + + \subsubsection*{Egész számok\\} + Természetes számok körében az összeadásra nézve csak a nullának van inverze, másként szólva, a kivonás általában nem végezhető el.\\ + + \noindent Tekintsük a $\sim\ \subset\mathbb{N}\times\mathbb{N}$ relációt. Értelmezzük ezeken a párokon a + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $(a,b) \sim (c,d)$ relációt, ha $a+d = c+b$ relációt, az + \item $(a,b)+(c,d) = (a+c,b+d)$ összeadást, a + \item $(a,b)\cdot(c+d) = (a \cdot c + b \cdot d, a \cdot d + c \cdot b)$ szorzást, valamint a + \item $(a,b)\leq (c,d)$, relációt ha $a+d \leq c + b$ + \end{itemize} + + \noindent A $\sim$ ekvivalenciareláció. Az ekvivalenciaosztályok halmazát jelöljük $\mathbb{Z}$-vel. Az így nyert halmazt nevezzük az egész számok halmazának.\\ + + \noindent Mindegyik ekvivalenciaosztály reprezentálható az $(n,0)$ vagy $(0,n)$ (vagy akár egyszerre mindkettő) alakú elemével. Az $n \in \mathbb{N}$ számot az $[(n,0)]$ osztály azonosítja (más szóval a természetes számok beágyazhatók $\mathbb{Z}$-be), illetve a $[(0,n)]$ osztályt $–n$-nel jelöljük (így megkaptuk az összes ekvivalenciaosztályt, a $[(0,0)]$ osztályt kétszer, hiszen $–0=0$).\\ + + \noindent Így az $[(a,b)]$-t + ${\displaystyle {\begin{cases}a-b,&{\mbox{ha }}a\geq b\\-(b-a),&{\mbox{ha }}a0\wedge ad\leq bc)\vee (bd<0\wedge ad\geq bc)} + \] + + \noindent A $\sim$ reláció ekvivalenciareláció, az ekvivalenciaosztályok halmazát jelöljük $\Q$-val.\\ + $\Q$ elemeit racionális számoknak nevezzük. $(\Q, +, \cdot)$ \textbf{rendezett test}. + + \subsubsection*{Valós számok\\} + + Nincs olyan $a \in \Q$ szám, melynek négyzete 2. Tehát nem minden szám írható fel $\ddfrac{m}{n}\ (m,n \in \N^+)$ alakban.\\ + + \noindent \emph{Archimédeszi rendezettség}: Egy $F$ rendezett testet archimédeszien rendezett, ha + \[ + x,y\in F: \exists n \in \N : nx \geq y \quad (x>0) + \] + + \noindent A racionális számok rendezett teste archimédeszien rendezett, de nem felső határ tulajdonságú. + + \noindent Egy felső határ tulajdonságú rendezett testet a valós számok testének nevezünk, és $\R$-rel jelöljük. ($\exists!\R$) + + \subsubsection*{Komplex számok} + + \noindent A komplex számok szükségét a harmadfokú egyenletek megoldására való Cardano-képlet szülte. Ugyanis abban az esetben, amikor az egyenletnek három különböző valós gyöke van, a képletben a gyökjel alá negatív szám kerül. + + \noindent A komplex számok halmaza $\C = \R \times \R$. $\C$ az + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $(x,y)+(x',y') = (x+x', y+y')$ összeadással és az + \item $(x,y)\cdot(x',y') = (xx'-yy', y'x+yx')$ szorzással test. + \end{itemize} + A komplex számok halmaza \emph{nem rendezett test}, mivel (tétel alapján) egy rendezett integritási tartományban $ x \neq 0 \ \Rightarrow x^2 > 0$. (Ez azonban $(0,1)^2=i^2 = -1$-re nem teljesül).\\ + + \noindent A komplex számok körében + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item (0,0) a nullelem, + \item $(1,0)$ egységelem, + \item $(x,y)$ additív inverze $(-x,-y)$, és + \item $(0,0) \neq (x,y)$ pár multiplikatív inverze az $(\ddfrac{x}{x^2+y^2}, \ddfrac{-y}{x^2+y^2})$ pár. + \end{itemize} + \paragraph*{Valós számok azonosítása\\} + Mivel $(x,0)+(x',0) = (x+x',0)$ és $(x,0)\cdot(x',0) = (xx',0)$ így az összes $(x,0), x\in\R$ komplex számot azonosíthatjuk $\R$-rel. + \paragraph*{Komplex számok algebrai alakja\\} + Mivel + \[(x,y) = (x,0)+(y,0)\cdot i = x+yi\] + így a komplex számokat $a+bi$ algebrai alakban is írhatjuk.\\ + + \noindent Ekkor az + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Re($z$) = $x$ valós számot a $z = (x,y)$ komplex szám \emph{\textbf{valós rész}}ének, az + \item Im($z$) = $y$ valós számot pedig a \emph{\textbf{képzetes rész}}ének nevezzük. + \end{itemize} + \paragraph*{Konjugált} + $ z = x+yi$ komplex szám konjugáltja: $\overline{z} = x-yi$\\ + + \noindent Tulajdonságai: + \begin{enumerate} + \item $\overline{z+w} = \overline{z}+\overline{w}$ + \item $\overline{z\cdot w} = \overline{z}\cdot\overline{w}$ + \item $\overline{\overline{z}} = z$ + \item $z + \overline{z}$ = 2Re($z$) + \item $z - \overline{z}$ = $i\cdot2$Im($z$) + \end{enumerate} + + \paragraph*{Abszolút érték} + A $z=(x,y)$ komplex szám abszolút értéke: $|z| = \sqrt{x^2+y^2}$\\ + \noindent Tulajdonságai: + \begin{enumerate} + \item $z\cdot\overline{z} = {|z|}^2$ + \item $\ddfrac{1}{z}= \ddfrac{\overline{z}}{|z|^2} $ + \item $|z| = \overline{|z|}$ + \item $|z\cdot w | = |z|\cdot|w|$ + \item $|z+w| \leq |z| +|w|$ + \end{enumerate} + \paragraph*{Trigonometrikus alak} \hfill + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Argumentum \\ + $z \neq 0$ esetén az a $z$ argumentuma $\forall t \in\R$, melyre Re($z$) = $|z|$cos($t$), és Im($z$) = $|z|$sin($t$). Más szóval a $z$ argumentuma az origóból a $z$-be mutató vektor és a pozitív valós tengellyel bezárt szöge. + \item Trigonometrikus alak \\ + A $z$ komplex szám trigonometrikus alakja: $ z = |z|($cos($t$)+$i\cdot$sin($t$) + \item Moivre-azonosságok \\ + Legyen $z = |z|($cos($t$)+$i\cdot$sin($t$)), és $w = |w|($cos($s$)+$i\cdot$sin($s$)). Ekkor + \[z\cdot w = |z||w|(\textrm{cos}(t+s)+i\cdot \textrm{sin}(t+s))\] + \[\ddfrac{z}{w} = \ddfrac{|z|}{|w|}(\textrm{cos}(t-s)+i\cdot \textrm{sin}(t-s)) \quad (w \neq 0)\] + \[ z^n = |z|^n(\textrm{cos}(nt)+i\cdot \textrm{sin}(nt)) \quad (n \in \Z)\] + \item Gyökvonás \\ + Legyen $z^n = w$ ekkor: + \[ \sqrt[n]{w} = \Bigg\{z_k = \sqrt[n]{|w|}\bigg(\textrm{cos}\Big(\ddfrac{t+2k\pi}{n}\Big)+\textrm{sin}\Big(\ddfrac{t+2k\pi}{n}\Big)\bigg), k=0,...,n-1\Bigg\} \] + De mivel ez a jelöltés összetéveszthető a valósak között (egyértelművé tett) valós gyökvonással. így ezt a jelölést nem használjuk. Vezessük be helyette a n-edik komplex egységgyök fogalmát: + \[\varepsilon_k = \textrm{cos}\bigg(\ddfrac{2k\pi}{n}\bigg)+i\cdot\textrm{sin}\bigg(\ddfrac{2k\pi}{n}\bigg), \quad k=0,...,n-1\] + Ezek után a $w$ gyökeit a $z$ és az n-edik komplex egységgyökök segítségével kaphatjuk meg: + \[ + z\varepsilon_0, \ldots, z\varepsilon_{n-1} + \] + \end{itemize} + + + \subsection*{Leszámlálások véges halmazokon} + + \paragraph*{Véges halmazok} \hfill + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Halmazok ekvivalenciája \\ + $X,Y$ \emph{halmazok ekvivalensek}, ha létezik $X$-et $Y$-ra képező bijekció.\\ + Jele: $X \sim Y$ + \item Véges és végtelen halmazok \\ + $X$ halmaz \emph{véges}, ha $\exists n\in\N : X \sim \{1,2,...,n\}$, \emph{egyébként végtelen}. Ha létezik $n$, akkor az egyértelmű, és ekkor a halmaz elemszámának/számosságának nevezzük. Jele: $ \#(X)$ + \end{itemize} + \paragraph*{Skatulya elv\\} + Ha $X,Y$ véges halmazok és $\#(X) > \#(Y)$, akkor egy $f:X\rightarrow Y$ leképezés nem lehet kölcsönösen egyértelmű (azaz bijekció). + + \subsection*{Leszámolások} + + \noindent Ha számít az elemek kiválasztásának a sorrendje, akkor csak permutáció vagy variáció lehet. + + \paragraph*{Permutáció} + Az $A$ halmaz egy permutációja az önmagára való kölcsönösen egyértelmű leképezése. Az $A$ halmaz elemei különbözőek. Hányféleképpen lehet sorbarakni ismétlés nélkül sorbarakni $A$ elemeit. Az $A$ halmaz összes permutációjának száma: + \[P_n = \prod\limits_{k=1}^{n} k \ = \ n!\] + \emph{Példa}: a, b, c permutáció: abc, bac, acb, bca, cba + + \paragraph*{Variáció} + Az $A$ halmaz elemeiből készíthető, különböző tagokból álló $a_1,a_2,...,a_k$ sorozatokat az $A$ halmaz $k$-ad osztályú variációinak nevezzük. Ha $A$ véges ($\#(A) = n$), akkor $V_n^k$ ($k < n$) száma megegyezik az $\{1,2,...,k\}$-t $\{1,2,...,n\}$-be képező kölcsönösen egyértelmű leképezések számával: + \[ + V_n^k = \ddfrac{n!}{(n-k)!} + \] + \emph{Példa 1}: a, b, c másod osztályú variációi: ab, ac, bc, ba, ca, cb\\ + \emph{Példa 2}: 12 csapatos bajnokságon hányféle sorrend alakulhat ki az első három (dobogós) helyen? + \[ + V_{12}^{3} = \ddfrac{12!}{(12-3)!} = 1320 + \] + \paragraph*{Kombináció} + Ha $A$ halmaz $k\in\N$ elemű részhalmazait $k$-ad osztályú kombinációinak nevezzük. Ha $A$ véges, akkor $C_n^k$ száma megegyezik $\{1,2,...,n\}$ $k$ elemű részhalmazainak számával. + \[C_n^k = \dbinom{n}{k} = \ddfrac{n!}{k!(n-k)!}\] + \paragraph*{Ismétléses permutáció} + $A = \{a_1,\dotsc,a_r\}$ halmaz elemeinek ismétlődései $i_1,\dotsc,i_r$. (Az elemek ismétléses permutációi olyan $i_1+\cdots+i_r = n$ tagú sorozatok, melyben az $a_j$ elem $i_j$-szer fordul elő.) + \[ + P_n^{i_1,\dotsc,i_r} = \ddfrac{n!}{i_1!i_2!\cdots i_r!} + \] + \emph{Példa 1}: a, l, m, a ismétléses permutációi: + \[ + P_4^{2_{a},1_{l},1_{m}} = \ddfrac{4!}{2!1!1!} = 12 + \] + + \paragraph*{Ismétléses variáció} + Az $A$ véges halmaz elemeiből készíthető (nem feltétlenül különböző) $a_1,\cdots,a_k$ sorozatokat, az $A$ halmaz $k$-ad osztályú ismétléses variációinak nevezzük. + \[ + ^iV_{n}^{k} = n^k + \] + \emph{Példa 1}: 2, 3 4, 5 felhasználásával hány három jegyű számot lehet képezni, ha egy számjegy többször is szerepelhet? + \[ + ^iV_{4}^{3} = 4^3 = 64 + \] + \emph{Példa 2}: TOTÓ kitöltése. Lehetséges értékek 1,2,X. Három érték, és 14 hely. + \[ + ^iV_{3}^{14} = 3^14 = 4.782.969 + \] + + \paragraph*{Ismétléses kombináció} + Az $A$ véges halmaz. A halmazból $k$ elemet kiválasztva, ismétléseket megengedve, de a sorrend figyelmen kívül hagyva, az $A$ halmaz $k$-ad osztályú ismétléses kombinációit kapjuk. + \[^iC_n^k = \dbinom{n+k-1}{k} \] + + \subsubsection*{Tételek} + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{Binomiális tétel} \\ + Két tagú kifejezések n-edik hatványának kiszámításához ad egy formulát.\\ + $x,y \in R$ (kommutatív egységelemes gyűrű), $n \in \mathbb{N}$. Ekkor + \[(x+y)^n = \sum\limits_{k=0}^n\dbinom{n}{k}x^{n-k}y^{k} \] + \item \textbf{Polinomiális tétel} \\ + $r,n\in\N$ és $x_1, x_2, \cdots, x_r \in R$ (kommutatív egységelemes gyűrű), ekkor + \begin{center} + $(x_1+\cdots+x_r)^n = \sum\limits_{i_1+\cdots+i_r = n}P_n^{i_1,\cdots,i_r}x_1^{i_1}x_2^{i_2}\cdots x_r^{i_r} =$\\ + $\sum\limits_{i_1+\cdots+i_r = n}\ddfrac{n!}{i_1!i_2!\cdots i_r!} \cdot x_1^{i_1}x_2^{i_2}\cdots x_r^{i_r} \qquad (i_1,\cdots,i_r \in\N)$ + \end{center} + \item \textbf{Szita formula} \\ + $X_1,\cdots,X_k \subset X$ (véges halmaz). $f$ az $X$-en értelmezett, egy Abel-csoportba képző függvény. Legyen: + \[S=\sum\limits_{x\in X}f(x)\] + \[ S_r = \sum\limits_{1\leq i_1 \leq \cdots \leq i_r \leq k}\Bigg(\sum\limits_{x \in X_{i_1} \cap \cdots \cap X_{i_r}}f(x)\Bigg) \] + és + \[S_0 = \sum\limits_{x\in X \setminus \bigcup\limits_{i=1}^{k} Xi}f(x)\] + Ekkor + \[S_0 = S - S_1+S_2-S_3+\cdots+(-1)^kS_k \] + \end{itemize} + +\subsection*{Számelméleti alapfogalmak, lineáris kongruencia-egyenletek\\} + \subsubsection*{Számelméleti alapfogalmak\\} + + \paragraph*{Oszthatóság egységelemes integritási tartományban\\} + $R$ egységelemes integritási tartomány, $a,b\in R$.\\ + Ha $\exists c\in R: a = bc$, akkor $b$ osztója $a$-nak ($a$ a $b$ többszöröse). Jele: $b\big|a$\\ + + \noindent A $b = 0$-t kivéve legfeljebb egy ilyen $c$ létezik.\\ + + \noindent Az oszthatóság tulajdonságai egységelemes integritási tartományban. + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Ha $b\big|a$ és $b'\big|a'$, akkor $bb'\big|aa'$ + \item $\forall a\in R: a\big|0\qquad \qquad \qquad$ (a nullának minden elem osztója) + \item $0\big|a \Leftrightarrow a = 0\qquad \qquad \qquad$ (a null csak saját magának osztója) + \item $\forall a\in R: 1\big|a\qquad \qquad \qquad$ (az egységelem minden elem osztója) + \item $b\big|a \Rightarrow \forall c \in R : bc\big|ac$ + \item $bc\big|ac$ és $c\neq0 \Rightarrow b\big|a$ + \item $b\big|a_i$ és $c_i \in R,\ (i = 1,\cdots,j) \ \Rightarrow \ b\big|\sum\limits_{i=1}^{j}a_ic_i$ + \item az $\big|$ reláció reflexív és tranzitív + \end{itemize} + \paragraph*{Felbonthatatlan elem és prímelem\\} + $0,1 \neq a \in R$ \emph{felbonthatatlan} (irreducibilis), ha $a = bc$ esetén $b$ vagy $c$ egység ($b,c \in R$). + + \noindent $0,1 \neq p \in R$ \emph{prím}, ha $\forall a,b \in R : p\big|ab$ esetén $p\big|a$ vagy $p\big|b$ + \paragraph*{Legnagyobb közös osztó, legkisebb közös többszörös, relatív prím\\} + $R$ egységelemes integritási tartomány. $a_1,\cdots,a_n \in R$ elemeknek $b\in R$ + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{legnagyobb közös osztója}, ha $b\big|a_i$ és $b'\big|a_i$ esetén $b'\big|b$. + \subitem Ha $b$ egység, akkor $a_1, \cdots , a_n$ \emph{relatív prímek}. + \item \emph{legkisebb közös többszöröse} $b\in R$, ha $a_i\big|b$ és $a_i\big|b'$ esetén $b\big|b'$. + \end{itemize} + \paragraph*{Bővített euklideszi algoritmus\\} + + Az eljárás meghatározza az $a,b \in \Z$ számok legnagyobb közös osztóját ($d\in\Z$), valamint $x,y \in\Z$ számokat úgy, hogy + \[ + d = ax+by + \] + \paragraph*{A számelmélet alaptétele\\} + Minden pozitív természetes szám (sorrendtől eltekintve) egyértelműen felbontható prímszámok szorzataként. + \paragraph*{Eratoszthenész szitája\\} + + \begin{itemize} + \item Írjuk fel a számokat 1-től n-ig, (itt például 100-ig) egyesével. + \item Keressük meg az első olyan 1-től nagyobbat, amelyik még nincs sem kihúzva (next), sem megjelölve. Elsőként ez a 2. + \item Ezután húzzuk ki ennek többszöröseit, és (next)-et jelöljük meg. + \item Ismételjük meg a második lépéstől újra az eljárást. Természetesen egy összetett szám többször is kihúzásra kerülhet. + \item Az algoritmus akkor álljon le, ha a második lépésnél talált szám négyzete már nagyobb, mint $n$. + \end{itemize} + \subsubsection*{Lineáris kongruencia egyenletek} + + \paragraph*{Kongruencia\\} + Ha $a,b,m \in\Z$ azt mondjuk, hogy \emph{a} kongruens \emph{b}-vel modulo \emph{m}, azaz hogy \emph{a} és \emph{b} egészek \emph{m}-mel vett osztási maradéka egyenlő, ha . + \[ + m \big| a - b + \] + azaz + \[ + \exists k \in \mathbb{Z}: a = k m + b + \] + Jelölése: + \[ + a \equiv b\ (mod\ {m}) + \] + + \noindent Ha \emph{a} nem kongruens \emph{b}-vel modulo \emph{m}, azt mondjuk, \textbf{\emph{inkongruens}} vele.\\ + Jelölése: $a\not \equiv b{\pmod {m}}$. + + \paragraph*{Maradékosztályok\\} + + A kongruencia ekvivalenciareláció, tehát osztályoz. Egy $m \in \ \mathbb{Z}$ modulus szerinti kongruencia ekvivalencia-osztályait $m$ szerinti maradékosztályoknak nevezzük. \\ + Az $a$ elem által reprezentált maradékosztályt $\widetilde{a} \mod{m}\ \text{vagy}\ [a]$ jelöli.\\ + Általában egy maradékosztályt a legkisebb nemnegatív eleme reprezentál.\\ + + \noindent Ha egy maradékosztály valamely eleme relatív prím a modulushoz, akkor mindegyik az, és a maradékosztályt \emph{redukált maradékosztály}nak nevezzük.\\ + + \noindent Páronként inkongruens egészek egy rendszerét \emph{maradékrendszernek} nevezzük.\\ + + \noindent Ha egy maradékrendszer minden maradékosztályból tartalmaz elemet, akkor \emph{teljes maradékrendszer}.\\ + + \noindent Ha maradékrendszer pontosan a redukált maradékosztályokból tartalmaz elemet, akkor \emph{redukált maradékrendszer}.\\ + + \paragraph*{Euler-féle $\varphi$ függvény\\} + $m > 0$ egész szám. Az Euler-féle $\varphi(m)$ függvény a modulo $m$ redukált maradékosztályok számát adja meg. Ez nyilván megegyezik a $0,1,\cdots,m-1$ számok közötti, $m$-hez relatív prímek számával.\\ + + \noindent \textbf{Euler-Fermat tétel}: Legyen $m>1$ egész, $a$ relatív prím $m$-hez, ekkor: + \[ + a^{\varphi(m)}\equiv 1\ \ ( mod\ m ) + \] + \noindent \textbf{Fermat tétel}: Legyen $p$ prím, és $a\in\Z: p\nmid a$, ekkor + \[ + a^{p-1}\equiv 1\ \ (mod\ p) + \] + \paragraph*{Lineáris kongruencia megoldása\\} + + Keressük az $ax \equiv b \mod{m}$ kongruencia megoldásait ($a,b,m\in\Z$ ismert).\\ + Ez ekvivalens azzal, hogy keressünk olyan $x$-et, melyre (valamely $y$-nal) $ax+my = b$.\\ + + \noindent Legyen $d$ = lnko($a,m$). Mivel $d$ osztója $ax+my$-nak, $b$-t is osztania kell, különben nincs megoldás. Így\\ + \[ + \ddfrac{a}{d}x+\ddfrac{m}{d}y = \ddfrac{b}{d},\ \text{ekkor}\ a'x+m'y = 1. + \] + + \noindent A bővített euklideszi algoritmus segítségével olyan $u,v$ számokat kapunk, melyekkel + \[ + a'u+m'v = 1\ \text{(ui.: }a', m'\ \text{relatív prímek}) + \] + Az egyenletet $b'$-vel beszorozva + \[ + a'ub'+m'vb' = b' \Rightarrow x \equiv ub' \mod{m'} + \] + + \paragraph*{Lineáris kongruenciarendszer megoldása\\} + + Két lineáris kongruencia esetén a megoldások + \[ + x \equiv a\ \ (mod\ m)\ \text{és}\ x \equiv b\ \ (mod\ n) + \] + A közös megoldáshoz az + \[x = a + my = b+ nz \Leftrightarrow my-nz = b-a\] + egyenletet kell megoldani. Akkor és csak akkor van megoldás, ha $d$ = lnko($m,n$) osztója $b-a$-nak. Ekkor a megoldás valamely $x_1$ egésszel ${ x \equiv x_1 \mod{\textrm{lkkt}(m,n)}}$ alakban írható. (Több kongruencia esetén az eljárás folytatható.) + + \paragraph*{Kínai maradéktétel} + Legyenek $m_1,\cdots,m_n \in\N$ egynél nagyobb páronként relatív prímek, és $c_1,\cdots,c_n \in\Z$. Az + \[ + x \equiv c_j\ \ (mod\ m_j) \qquad (j=1,\ \ldots,\ n) + \] + kongruenciarendszer megoldható ($1 \leq j \leq n$), és a megoldása egyetlen maradékosztálya lesz modulo M, ahol $M = m_1m_2\cdots m_n$. + +\section*{Gráfok} + +\subsection*{Általános és síkgráfok} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Egy \emph{\textbf{irányítatlan gráf}} a $G = (V,E, \varphi)$ rendezett 3-as, ahol: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item $V$ - a csúcsok halmaza + \item $E$ - élek halmaza + \item $\varphi$ - illeszkedési reláció ($\varphi \in E \times V$) + \end{itemize} + + Ha $v\in\varphi(e)$, akkor $v$ illeszkedik az $e$ élre. ($v\in V, e\in E$). Egy élnek mindig két vége van. + + \item Él-, és csúcstípusok + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item $v\in V$ \emph{\textbf{izolált csúcs}}, ha $\nexists e \in E: v\in \varphi(e)$ + \item $e,e'\in E$ élek \emph{\textbf{párhuzamos élek}}, ha $\varphi(e) = \varphi(e')$ + \item $e\in E$ \emph{\textbf{hurokél}}, ha $\big|\varphi(e) \big| = 1$ + \end{itemize} + \item Egy \emph{\textbf{irányítatott gráf}} a $G = (V,E, \psi)$ rendezett 3-as, ahol: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item $V$ - a csúcsok halmaza + \item $E$ - élek halmaza + \item $\psi$ - illeszkedési reláció ($\psi \in E \rightarrow V \times V$) + \end{itemize} + $\psi(e) = (v,v')$, ahol $v$ az $e$ él kezdőpontja, $v'$ a végpontja. + \end{itemize} + \paragraph*{Véges, egyszerű gráfok - alapfogalmak} \hfill + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $G$ gráf \emph{\textbf{egyszerű gráf}}, ha nem tartalmaz párhuzamos vagy hurokéleket. + \item $G= (V,E,\varphi)$ gráf \emph{\textbf{véges gráf}}, ha $V,E$ véges halmazok. + \item Szomszédság, fok\\ + Két él szomszédos, ha van közös pontjuk.\\ + Két csúcs szomszédos, ha van közös élük. \\ + $v\in V$ szomszédjainak száma a $v$ \textbf{\emph{foka}}. [Jele: deg($v$) = d($v$)] + \item $G$ \emph{\textbf{$\emph{\textbf{r}}$-reguláris gráf}}, ha minden pont foka $r$ + \item $G$ \emph{\textbf{teljes gráf}}, ha minden él be van húzva, más szóval $(\big|V\big|-1)$-reguláris. (Jele: $K_{\big|V|}$) + \item $G$ \emph{\textbf{páros gráf}}, ha $V = V' \cup V''$ és $V'\cap V'' = \emptyset$ (diszjunkt), valamint él csak $V'$ és $V''$ között fut. + Ha viszont így $V'$ és $V''$ között minden él be húzva, akkor teljes páros gráf. (Jele: $K_{n,m}$, ahol $n=\big|V'\big|, m=\big|V''\big|$) + \item $G = (V,E,\varphi)$ \emph{\textbf{részgráfja}} $G'=(V',G',\varphi')$-nek, ha $V\subset V' \ \land \ E \subset E' \ \land \ \varphi \subset \varphi'$ + \item $G$ gráfban egy $n$ hosszú \emph{\textbf{séta}} $v$-ből $v'$-be egy olyan + \[\boldsymbol{v_0},\ e_1,\ \boldsymbol{v_1}, \ \cdots \ ,\ \boldsymbol{v_{n-1}},\ e_n,\ \boldsymbol{v_n}\] + sorozat, melyre $v=v_1,\ v'=v_n$ és $v_{i-1},\ v_{i} \in \varphi(e_i)$ + + Egy \emph{séta} \emph{\textbf{vonal}}, ha \emph{minden él legfeljebb egyszer} szerepel a sorozatban. + + Egy \emph{vonal} \emph{\textbf{út}}, ha \emph{minden csúcs legfeljebb egyszer} szerepel a sorozatban. + + Egy séta/vonal/út \emph{\textbf{zárt}}, ha \emph{kezdő és végpontja} megegyezik, egyébként \emph{\textbf{nyílt}}. + \item Egy gráf \emph{\textbf{összefüggő}}, ha bármely két csúcs közt van út. + + Ez a reláció ekvivalenciareláció, melynek ekvivalenciaosztályait \emph{komponensek}nek nevezzük. + \item $G=\big(V,E,\varphi, C_e, c_e, C_v,c_v\big)$ rendezett 7-es \emph{\textbf{címkézett gráf}}ot jelöl, ahol $C_e, C_v$ tetszőleges halmazok, és + \[c_e:E\rightarrow C_e\] + \[c_v:E\rightarrow C_v\] + + Ha $C_e = C_v = \R^+$, akkor a gráfot \emph{\textbf{súlyozott gráf}}nak nevezzük, és $w$ a csúcs/él súlya. \big(${w(e)=c_e(e)},\ {w(v) = c_v(v)}$\big) + \end{itemize} + + \subsection*{Síkba rajzolhatóság} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Egy gráf \emph{\textbf{síkba rajzolható}}, ha lerajzolható úgy, hogy az élei nem keresztezik egymást. + \item Két gráf \emph{\textbf{topologikusan izomorf}}, ha a következő lépést illetve fordítottját véges sok ismétlésével egyikből a másikat kapjuk: Egy másodfokú csúcsot elhagyunk, és a szomszédjait összekötjük. + \item Ha $G$ gráf síkba rajzolható, akkor a \emph{\textbf{tartományok}} az élek által határolt síkidomok. \\ + (A nem korlátolt síkidom is tartomány.) + \end{itemize} + + \paragraph*{Tételek\\} + \begin{enumerate}[leftmargin=7.5mm] + \item Minden véges gráf $\R^3$-ban lerajzolható. + \item Ha egy véges gráf síkba rajzolható $\Longleftrightarrow$ gömbre rajzolható + \item \emph{\textbf{Euler-tétel}}: Ha a $G$ véges gráf összefüggő, síkba rajzolható gráf, akkor: + \[ + \big|E\big|+2 = \big|V\big|+\big|T\big| + \] + \item \emph{\textbf{Kuratowsky-tétel}}: Egy véges gráf pontosan akkor síkba rajzolható, ha nem tartalmaz $K_5$-tel, vagy $K_{3,3}$-mal topologikusan izomorf részgráfot. + \end{enumerate} + + + \subsection*{Fák} + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Egy G gráf \emph{\textbf{fa}}, ha \emph{összefüggő} és \emph{körmentes}. + \item Legyen $F$ részgráfja $G$-nek. Ha $F$ fa és csúcsainak halmaza megegyezik $G$ csúcsainak halmazával, akkor $F$-et a $G$ feszítőfájának nevezzük. + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item Ha $G$ \textbf{\emph{egyszerű gráf}}, akkor a következő feltételek ekvivalensek: + \begin{enumerate} + \item $G$ fa + \item $G$ összefüggő, de bármely él törlésével már nem az + \item Két különböző csúcs között csak egy út van + \item $G$ körmentes, de egy él hozzáadásával már nem az + \end{enumerate} + \item Ha $G$ \textbf{\emph{egyszerű véges gráf}}, akkor a következő feltételek ekvivalensek: + \begin{enumerate} + \item $G$ fa + \item $G$-ben nincs kör és $n-1$ éle van + \item $G$ összefüggő és $n-1$ éle van + \end{enumerate} + \end{itemize} + \item Az \emph{\textbf{irányított fa}} olyan fa, melyre: + \[ + \exists v \in V : d^-(v) = 0 \ \text{és} \ \forall v'\neq v : d^-(v') = 1 \quad \text{(Egy csúcs befoka \emph{0}, a többié \emph{1})} + \] + További fogalmak: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item $r \in V, d^-(r) = 0 $ csúcsot \emph{\textbf{gyökér csúcs}}nak nevezzük + \item $v'$ \textbf{\emph{csúcs szintje}} az $r,v'$ út hossza + \item $(v,v')\in\psi(e)$, a $v$ szülője $v'$-nek, $v'$ gyereke, $v$-nek. + \item $v$ levél, ha $d^+(v)=0$ + \end{itemize} + \end{itemize} + + \subsection*{Euler- és Hamilton-gráfok\\} + + \subsubsection*{Euler-gráf\\} + Az \emph{\textbf{Euler-vonal}} olyan vonal $v$-ből $v'$-be a gráfban, amelyben minden él szerepel.\\ + Ha $v=v'$ akkor ezt a vonalat Euler-körvonalnak is szokás nevezni. \\ + Euler-vonallal rendelkező gráfot \emph{\textbf{Euler-gráf}}nak nevezik.\\\\ + \textbf{Tétel}: Egy összefüggő véges gráfban pontosan akkor létezik Euler-körvonal, ha minden csúcs páros fokú. + + \subsubsection*{Hamilton-gráf\\} + + A \emph{\textbf{Hamilton-út}} egy olyan út $v$-ből $v'$-be a gráfban, mely minden csúcsot tartalmaz. \\ + Ha $v=v'$ akkor ezt az utat \emph{\textbf{Hamilton-kör}}nek is szokás nevezni. \\ + Hamilton-úttal rendelkező gráfot \emph{\textbf{Hamilton-gráf}}nak nevezik. + + \subsection*{Gráfok adatszerkezetei\\} + + Gráfok számítógépes reprezentációjához legtöbbször láncolt listákat, vagy mátrixokat szoktak használni. A láncolt listák inkább ritka gráfokra, míg a mátrixok sűrű gráfok esetén gazdaságosak. + + \paragraph*{Illeszkedési mátrix\\} + + $G = (V,E, \psi)$ irányított gráf esetén a gráfot egy $A = \{0,1,-1\}^{n\times m}$ mátrix segítségével tudjuk reprezentálni, ahol $V = \{v_1,\cdots, v_n\}$, és $E = \{e_1,\cdots,e_m\}$. \\ + + \noindent Ekkor a mátrix egyes elemei: + \[ a_{ij} = + \left\{ + \begin{array}{ll} + 1 & \mbox{ha} \ v_i \ \text{kezdőpontja} \ e_j\text{-nek} \\ + -1 & \mbox{ha} \ v_i \ \text{végpontja} \ e_j\text{-nek} \\ + 0 & \mbox{különben} + \end{array} + \right. + \] + + \noindent Ha $G$ nem irányított, akkor $a_{ij} = \big|a_{i,j}\big|$ + + \paragraph*{Csúcsmátrix\\} + + A fenti jelölésekkel irányított esetben $B \in \Z^{n\times n}$, ahol $b_{ij}$ a $v_i$-ből $v_j$-be menő élek számát jelöli. + + \noindent Ha $G$ irányítatlan, akkor $b_{ii}$ $v_i$ hurokéleinek száma, egyébként $b_{ij}$ a $v_i$ és $v_j$ csúcsok közötti élek száma. + + \section*{Kódoláselmélet} + + \subsection*{Polinomok és műveleteik\\} + + Legyen $R$ gyűrű. Egy polinomot egy + \[ + \sum\limits_{i=0}^{n} f_ix^i \quad (n \in \N, f_i \in R) + \] + alakú véges összegnek tekintünk.\\ + + \noindent Az $f_n$ tagot a polinom \emph{\textbf{főegyüttható}}jának nevezzük. + + \paragraph*{Műveletek\\} + + \noindent Legyen $R[x]$ az $f = (f_0, f_1, \cdots)$ végtelen sorozatok feletti gyűrű (polinomok gyűrűje), ahol $f_i \in R$. + + \noindent Ekkor az $R[x]$-beli műveletek: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Összeadás: + \[ + f+g = (f_0+g_0, f_1+g_1,\cdots)\qquad (f,g \in R[x]) + \] + \item Szorzás: + \[ + f\cdot g = h = (h_0,h_1, \cdots) \qquad (f,g,h \in R[x]) \text{, ahol} + \] + \[ + h_k = \sum\limits_{i+j = k}f_ig_j + \] + \end{itemize} + + \noindent \textit{Megjegyzés}: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Ha $R$ kommutatív, akkor $R[x]$ is az. + \item Ha $R$ egységelemes az 1 egységelemmel, akkor + \begin{itemize} + \item R[x]\ \text{is egységelemes az}\ (1,0,0, $\cdots$)\ \text{egységelemmel}. + \end{itemize} + \end{itemize} + +\subsection*{Maradékos osztás} + + Legyen $R$ egységelemes integritási tartomány, $f,g\in R[x], g \neq 0$ és tegyük fel, hogy $g$ főegyütthatója egység $R$-ben. Ekkor + \[ + \exists! q,r \in R[x] : f = g\cdot q+r \qquad \big(\text{deg}(r) < \text{deg}(g)\big) + \] + + \subsection*{Horner-séma} + A Horner-módszer egy polinom helyettesítési értékének kiszámítására alkalmas. (Ezzel együtt természetesen az is eldönthető, hogy adott $c$ érték a polinom gyöke-e vagy nem. 4-ed fok felett erre még analitikus megoldás sincs.)\\ + + \noindent A módszer lényege, hogy az egyébként $f_nx^n+f_{n-1}x^{n-1}+\cdots+f_0$ polinom helyettesítési értékének kiszámolásához rendkívül sok szorzásra és összeadásra lenne szükség. A polinom átalakításával azonban a műveletek számát lecsökkenthetjük. A maradékos osztást alkalmazva: + \[ + f_nx^n+f_{n-1}x^{n-1}+\cdots+f_0 = \left(f_nx^{n-1}+f_{n-1}x^{n-2}+\cdots\right)x+f_0 + \] + Ezt rekurzívan folytatva a következő alakra jutunk: + \[ + \Big(\big((f_nx+f_n-1)x+f_n-2\big) x+ \cdots\Big) x+f_0 + \] + + \noindent A helyettesítési érték kiszámítását egy táblázatban könnyebben elvégezhetjük. + + \begin{center} + \begin{tabular}{|c|c|c|c|c|c|} + \hline & $f_n$ & $f_{n-1}$ & $f_{n-2}$ & $\cdots$ & $f_0$ \\ + \hline $c$ & $f_n$ & $f_nc+f_{n-1}$ & $(f_nc+f_{n-1})c+f_{n-2}$ & $\cdots$ & $f(c)$ \\ + \hline + \end{tabular} + \end{center} + + \noindent A táblázat kitöltése a következőképp zajlik: + \begin{enumerate} + \item Az első sorba felírjuk a polinom együtthatóit + \item A második sor első cellájába beírjuk az argumentum értékét. + \item A főegyüttható alá beírjuk önmagát. + \item A második sor celláinak kitöltésével folytatjuk + \item \label{itm:horner_recursive} Az előző cella elemét megszorozzuk az argumentummal + \item A szorzathoz adjuk hozzá az aktuális együtthatót + \item Az összeget írjuk be az aktuális cellába + \item Folytassuk az \ref{itm:horner_recursive}. ponttal, míg el nem jutunk az utolsó celláig + \end{enumerate} + + \noindent Az utolsó cellába a polinom helyettesítési értéke kerül.\\ + (Ha ez nulla, akkor az argumentum a polinom gyöke.) + + \subsection*{Betűnkénti kódolás} + + A kódolás a legáltalánosabb értelemben az üzentek halmazának egy másik halmazba való leképzését jelenti. Gyakran az üzenetet valamilyen karakterkészlet elemeiből alkotott sorozattal adjuk meg. Ekkor az üzenetet felbontjuk előre rögzített olyan elemi részekre, hogy minden üzenet egyértelműen előálljon ilyen elemi részek sorozataként. A kódoláshoz megadjuk az elemi részek kódját, amelyet egy szótár tartalmaz. Az ilyen kódolást \emph{\textbf{betűnkénti kódolás}}nak nevezzük.\\ + + \noindent A kódolandó üzenetek egy $A$ ábécé betűi, és egy-egy betű kódja egy másik, $B$ ábécé (kódábécé) betűinek felel meg. Tegyük fel, hogy mindkét ábécé nem üres és véges.\\ + + \noindent Egy $A$ ábécé betűiből felírható szavak halmazát $A^+$-szal jelöljük, míg az üres szóval kiterjesztettet $A^*$-gal.\\ + + \noindent Ez alapján a betűnkénti kódolást egy $\varphi: A \rightarrow B^*$ leképezés határozza meg, amelyet kiterjeszthetünk egy $\psi: A^* \rightarrow B^*$ leképezéssé az alábbi módon:\\ + + \noindent Ha $\alpha_1\alpha_2...\alpha_n = \alpha \in A$, akkor $\alpha$ kódja $\psi(\alpha) = \varphi(\alpha_1)\varphi(\alpha_2)...\varphi(\alpha_3)$. Nyilván ha $\varphi$ nem injektív (vagy az üres szó benne van az értékkészletében), akkor a $\psi$ kódolás sem injektív, azaz nem egyértelműen dekódolható. Emiatt feltehetjük, hogy $\varphi$ injektív, és $B^+$-ba képez. + + \subsection*{Shannon- és Huffman-kód} + + \paragraph*{Alapfogalmak} + + \noindent Az információforrás $n$ üzenetet bocsájt ki. A különböző üzeneteket jelöljük $a_1, \cdots, a_m$-mel. + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Az $a_i$ üzenet $k_i$-szer fordul elő, melyet \emph{\textbf{gyakoriság}}nak nevezzük. + \item Az $a_i$ \emph{\textbf{relatív gyakorisága}} a $p_i = \ddfrac{k_i}{n}$. + \item A $p_1,\cdots,p_m$ szám $m$-est az üzentek \emph{\textbf{eloszlás}}ának nevezzük. ($\sum\limits_{i=1}^{m}p_i = 1$) + \end{itemize} + + \noindent Az $a_i$ \emph{üzenet} \emph{\textbf{egyedi információtartalma}} + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $I_i = - \text{log}_rp_i$, ahol $r>1$ (az információ egysége). + \item $I_i = - \text{log}_2p_i$, ahol $r = 2$ (bitenkénti kódolás esetén). + \end{itemize} + + \noindent Az üzenetforrás által kibocsátott átlagos információtartalom az \emph{\textbf{entrópia}}: + \[ + H_r(p_1, \cdots, p_m) = - \sum\limits_{i=1}^{m}p_i\text{log}_rp_i + \] + + \noindent Legyen $\alpha, \beta, \gamma \in A$ szavak. Ekkor az $\alpha\beta\gamma$ szónak + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $\alpha$ \emph{prefixe} + \item $\beta$ \emph{infixe} + \item $\gamma$ \emph{szuffixe}\\ + \end{itemize} + + \noindent A betűnkénti kódoláshoz egyértelműen megadható egy szemléletes irányított, élcímkézett fa. \\ + + \noindent Legyen $\varphi : A \rightarrow B^*$ a betűnkénti kódolás. + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Készítsünk el egy olyan fát, melynek a gyökere az üres szó és ha $\beta = \alpha b\quad (b\in B)$-re, akkor $\alpha$-ból húzódjon olyan él $\beta$-ba, melynek $b$ címkéje van. + \item Ekkor minden azonos hosszú szó egy szinten lesz. + \item Azokat a csúcsokat, melyekből minden $b\in B$ címkével vezet ki él \emph{teljes csúcs}nak nevezzük, különben \emph{csonka csúcs}ok. + \end{itemize} + + \noindent A $\varphi : A \rightarrow B^+$ injektív leképezés által meghatározott $\psi : A^* \rightarrow B^*$ betűnkénti kódolás + + \begin{enumerate} + \item \emph{felbontható} (egyértelműen dekódolható), ha $\psi$ injektív + \item \emph{\textbf{prefix kód}}, ha $\varphi$ értékkészlete prefixmentes. + \item \emph{\textbf{egyenletes kód}} (fix hosszúságú), ha $\psi$ értékkészletében minden elem megegyező hosszú + \item \emph{\textbf{vesszős kód}}, ha $\exists \vartheta \in B^+$ vessző, hogy $\vartheta$ szuffixe minden kódszónak, de sem prefixe, sem infixe semelyik kódszónak. + \end{enumerate} + + \noindent Legyen $A = \{a_1,\cdots, a_n\}$ a kódolandó ábécé. Az $a_i$ kódjának hossza $l_i$. \\ + Ekkor a kód átlagos szóhosszúsága: + \begin{center} + $\overline{l} = \sum\limits_{i=1}^{n}p_il_i$ + \end{center} + + \noindent Ha egy adott elemszámú ábécével és adott eloszlással egy felbontható betűnkénti kód átlagos szóhoszúsága minimális, akkor \emph{\textbf{optimális kód}}nak nevezzük. +\newpage + \subsection*{Shannon-kód\\} + + Shannon kód egy optimális kód ($r$ elemszámú ábécével és $p_i$ gyakoriságokkal). + + \paragraph*{Shannon kód előállítás} + + \begin{enumerate} + \item Az üzenetekben előforduló szimbólumok előfordulási gyakoriságának meghatározása. + \item A szimbólumok gyakoriság szerinti csökkenő sorrendbe rendezése. + \item A lista két részre osztása úgy, hogy a két részben lévő szimbólumok összesített gyakorisága (közel) egyenlő legyen. + \item A lista felső részéhez 0-át, az alsó részéhez 1-et rendelünk (vagy fordítva). + \item A 3.-ik és 4.-ik eljárást addig ismételjük, amíg a kettéosztott lista mindkét részében csak 1-1 szimbólum található.\\ + \end{enumerate} + + \noindent \emph{Példa 2}:\\ + + \renewcommand{\arraystretch}{1.4} + {\footnotesize + \noindent \begin{tabular}{|l|l|l|l|l|} + \hline + \textbf{Szimbólumok} & \textbf{Gyakoriság} & \textbf{Relatív gyakoriság} & \textbf{Információ tartalom} & \textbf{Bitek száma} \\ \hline + A & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + B & 7 & $\ddfrac{7}{39} \simeq 0.17$ & $-log_{2}(\ddfrac{7}{39}) = 2.47$ & $-log_2(\ddfrac{7}{39}) * 7 = 17.34$ \\ \hline + C & 15 & $\ddfrac{15}{39} \simeq 0.38$ & $-log_{2}(\ddfrac{15}{39}) = 1.37$ & $-log_2(\ddfrac{15}{39}) * 15 = 20.67$ \\ \hline + D & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + E & 5 & $\ddfrac{5}{39} \simeq 0.13$ & $-log_{2}(\ddfrac{5}{39}) = 2.96$ & $-log_2(\ddfrac{5}{39}) * 5 = 14.81$ \\ \hline + \end{tabular} + }\\\\ + \renewcommand{\arraystretch}{1} + + \noindent Rendezzük a szimbólumokat gyakoriság szerint csökkenő sorrendben:\\ + + \renewcommand{\arraystretch}{1.4} + {\footnotesize + \noindent \begin{tabular}{|l|l|l|l|l|} + \hline + % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ... + \textbf{Szimbólumok} & \textbf{Gyakoriság} & \textbf{Relatív gyakoriság} & \textbf{Információ tartalom} & \textbf{Bitek száma} \\ \hline + C & 15 & $\ddfrac{15}{39} \simeq 0.38$ & $-log_{2}(\ddfrac{15}{39}) = 1.37$ & $-log_2(\ddfrac{15}{39}) * 15 = 20.67$ \\ \hline + B & 7 & $\ddfrac{7}{39} \simeq 0.17$ & $-log_{2}(\ddfrac{7}{39}) = 2.47$ & $-log_2(\ddfrac{7}{39}) * 7 = 17.34$ \\ \hline + A & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + D & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + E & 5 & $\ddfrac{5}{39} \simeq 0.13$ & $-log_{2}(\ddfrac{5}{39}) = 2.96$ & $-log_2(\ddfrac{5}{39}) * 5 = 14.81$ \\ \hline + \end{tabular}\\ + }\\ + \renewcommand{\arraystretch}{1} + + \renewcommand{\arraystretch}{1.6} + {\footnotesize + \noindent \begin{tabular}{llll|llll|ll} + Szimbólumok & & & & & & & & & \\ + C & 15 & {\color[HTML]{010066} } & {\color[HTML]{CB0000} } & C & 15 & {\color[HTML]{00009B} \textit{\textbf{15}}} & {\color[HTML]{CB0000} \textbf{0}} & & \\ \cline{5-8} + B & 7 & \multirow{-2}{*}{{\color[HTML]{010066} \textit{\textbf{22}}}} & \multirow{-2}{*}{{\color[HTML]{CB0000} \textbf{0}}} & B & 7 & {\color[HTML]{00009B} \textit{\textbf{7}}} & {\color[HTML]{CB0000} \textbf{1}} & & \\ \cline{1-4} + A & 6 & {\color[HTML]{010066} } & {\color[HTML]{CB0000} } & A & 6 & {\color[HTML]{00009B} \textit{\textbf{6}}} & {\color[HTML]{CB0000} \textbf{0}} & & \\ \cline{5-8} + D & 6 & {\color[HTML]{010066} } & {\color[HTML]{CB0000} } & D & 6 & {\color[HTML]{00009B} } & {\color[HTML]{CB0000} } & D & {\color[HTML]{CB0000} \textbf{0}} \\ \cline{9-10} + E & 5 & \multirow{-3}{*}{{\color[HTML]{010066} \textit{\textbf{17}}}} & \multirow{-3}{*}{{\color[HTML]{CB0000} \textbf{1}}} & E & 5 & \multirow{-2}{*}{{\color[HTML]{00009B} \textit{\textbf{11}}}} & \multirow{-2}{*}{{\color[HTML]{CB0000} \textbf{1}}} & E & {\color[HTML]{CB0000} \textbf{1}} + \end{tabular}\\\\ + } + \renewcommand{\arraystretch}{1} + + \noindent $\begin{array}{c|c|c|c|c} + \textbf{C} & \textbf{B} & \textbf{A} & \textbf{D} & \textbf{E} \\ + {\color[HTML]{CB0000} \textbf{00}} & {\color[HTML]{CB0000} \textbf{01}} & {\color[HTML]{CB0000} \textbf{10}} & {\color[HTML]{CB0000} \textbf{110}} & {\color[HTML]{CB0000} \textbf{111}}\\ + \end{array}$\\\\ + + \noindent A kódfát \ref{fig:shannon_code_tree}. ábrán láthatjuk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/shannon_code_tree.png} + \caption{Shannon-kód példa 2. kódfája} + \label{fig:shannon_code_tree} + \end{figure} + + \noindent \textbf{Huffman kód előállítás:} + + \begin{enumerate} + \item Az üzenetekben előforduló szimbólumok előfordulási gyakoriságának meghatározása. + \item A szimbólumok gyakoriság szerinti csökkenő sorrendbe rendezése. + \item A két legkevésbé gyakori szimbólumot összevonjuk és beírjuk a szimbólumok közé a gyakorisági sorba. + \item A 3.-ik pontot addig ismételjük, amíg 2 elemű lesz a lista. Ekkor az egyik elemhez 0-át a másikhoz 1-et rendelünk. + \item Visszalépünk az előző összevont szimbólumhoz, és az előbbivel azonos sorrendben a két szimbólumhoz 0-át és 1-et rendelünk, mindaddig, míg vissza nem jutunk az egyes szimbólumokhoz.\\ + \end{enumerate} + + \noindent \emph{Példa 2}:\\ + + \renewcommand{\arraystretch}{1.4} + {\footnotesize + \noindent \begin{tabular}{|l|l|l|l|l|} + \hline + % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ... + \textbf{Szimbólumok} & \textbf{Gyakoriság} & \textbf{Relatív gyakoriság} & \textbf{Információ tartalom} & \textbf{Bitek száma} \\ \hline + A & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + B & 7 & $\ddfrac{7}{39} \simeq 0.17$ & $-log_{2}(\ddfrac{7}{39}) = 2.47$ & $-log_2(\ddfrac{7}{39}) * 7 = 17.34$ \\ \hline + C & 15 & $\ddfrac{15}{39} \simeq 0.38$ & $-log_{2}(\ddfrac{15}{39}) = 1.37$ & $-log_2(\ddfrac{15}{39}) * 15 = 20.67$ \\ \hline + D & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + E & 5 & $\ddfrac{5}{39} \simeq 0.13$ & $-log_{2}(\ddfrac{5}{39}) = 2.96$ & $-log_2(\ddfrac{5}{39}) * 5 = 14.81$ \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \noindent Rendezzük a szimbólumokat gyakoriság szerint csökkenő sorrendben:\\ + + \renewcommand{\arraystretch}{1.4} + {\footnotesize + \noindent \begin{tabular}{|l|l|l|l|l|} + \hline + % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ... + \textbf{Szimbólumok} & \textbf{Gyakoriság} & \textbf{Relatív gyakoriság} & \textbf{Információ tartalom} & \textbf{Bitek száma} \\ \hline + C & 15 & $\ddfrac{15}{39} \simeq 0.38$ & $-log_{2}(\ddfrac{15}{39}) = 1.37$ & $-log_2(\ddfrac{15}{39}) * 15 = 20.67$ \\ \hline + B & 7 & $\ddfrac{7}{39} \simeq 0.17$ & $-log_{2}(\ddfrac{7}{39}) = 2.47$ & $-log_2(\ddfrac{7}{39}) * 7 = 17.34$ \\ \hline + A & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + D & 6 & $\ddfrac{6}{39} \simeq 0.15$ & $-log_{2}(\ddfrac{6}{39}) = 2.70$ & $-log_2(\ddfrac{6}{39}) * 6 = 16.20$ \\ \hline + E & 5 & $\ddfrac{5}{39} \simeq 0.13$ & $-log_{2}(\ddfrac{5}{39}) = 2.96$ & $-log_2(\ddfrac{5}{39}) * 5 = 14.81$ \\ \hline + \end{tabular}\\\\ + } + \renewcommand{\arraystretch}{1} + + \renewcommand{\arraystretch}{1.8} + {\footnotesize + \noindent \begin{tabular}{|llllllllllll|} + \hline + {\color[HTML]{333333} Szimbólumok} & & & & & & & & & & & \\ \hline + C & 15 & \multicolumn{1}{l|}{} & {\color[HTML]{333333} C} & {\color[HTML]{333333} 15} & \multicolumn{1}{l|}{} & C & 15 & \multicolumn{1}{l|}{} & {\color[HTML]{00009B} \textit{\textbf{ABDE}}} & {\color[HTML]{333333} 24} & {\color[HTML]{9A0000} \textbf{1}} \\ \cline{7-7} + B & 7 & \multicolumn{1}{l|}{} & {\color[HTML]{010066} \textit{\textbf{DE}}} & {\color[HTML]{333333} \textbf{11}} & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{\cellcolor[HTML]{FFFFC7}{\color[HTML]{303498} {\ul \textbf{AB}}}} & {\color[HTML]{303498} \textbf{13}} & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{1}}} & {\color[HTML]{333333} C} & {\color[HTML]{333333} 15} & {\color[HTML]{9A0000} \textbf{0}} \\ \cline{4-4} + A & 6 & \multicolumn{1}{l|}{} & \multicolumn{1}{l|}{\cellcolor[HTML]{FFFFC7}{\color[HTML]{333333} {\ul B}}} & {\color[HTML]{333333} \textbf{7}} & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{1}}} & \multicolumn{1}{l|}{\cellcolor[HTML]{FFFFC7}{\color[HTML]{333333} {\ul DE}}} & {\color[HTML]{333333} 11} & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{0}}} & {\color[HTML]{00009B} \textit{\textbf{}}} & {\color[HTML]{CB0000} \textbf{}} & \\ \cline{1-1} \cline{7-7} + \multicolumn{1}{|l|}{\cellcolor[HTML]{FFFFC7}{\ul D}} & 6 & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{1}}} & \multicolumn{1}{l|}{\cellcolor[HTML]{FFFFC7}{\ul A}} & 6 & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{0}}} & & & \multicolumn{1}{l|}{} & {\color[HTML]{00009B} \textit{\textbf{}}} & {\color[HTML]{CB0000} \textbf{}} & \\ \cline{4-4} + \multicolumn{1}{|l|}{\cellcolor[HTML]{FFFFC7}{\ul E}} & 5 & \multicolumn{1}{l|}{{\color[HTML]{9A0000} \textbf{0}}} & & & \multicolumn{1}{l|}{} & & & \multicolumn{1}{l|}{} & & & \\ \hline + \end{tabular}\\\\ + } + \renewcommand{\arraystretch}{1} + + \noindent $\begin{array}{c|c|c|c|c} + \textbf{C} & \textbf{B} & \textbf{A} & \textbf{D} & \textbf{E} \\ + {\color[HTML]{CB0000} \textbf{0}} & {\color[HTML]{CB0000} \textbf{111}} & {\color[HTML]{CB0000} \textbf{110}} & {\color[HTML]{CB0000} \textbf{101}} & {\color[HTML]{CB0000} \textbf{100}} \\ + & \text{ABDE} \rightarrow \text{AB} \rightarrow \text{B} & \text{ABDE} \rightarrow \text{AB} \rightarrow \text{A} & \text{ABDE} \rightarrow \text{DE} \rightarrow \text{D} & \text{ABDE} \rightarrow \text{DE} \rightarrow \text{E} \\ + \end{array}$\\\\ + + \noindent A kódfát \ref{fig:huffman_code_tree}. ábrán láthatjuk.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/huffman_code_tree.png} + \caption{Huffman-kód példa 2. kódfája} + \label{fig:huffman_code_tree} + \end{figure} + +\subsection*{Hibajavító kódok, kódtávolság\\} + + \paragraph*{Hibakorlátozó kódolás\\} + + A hibakorlátozó kódokat két csoportba sorolhatjuk: \emph{hibajelző} és \emph{hibajavító} kódok. \\ + Mindkét esetben az üzenetekhez kódszavakat rendelünk, amik alapján az átvitel során keletkező hibákat kezelni tudjuk.\\ + + \noindent Amennyiben az üzenet + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{könnyen ismételhető} $\Longrightarrow$ \emph{\textbf{hibajelző}}, + \item \emph{nehezen ismételhető} $\Longrightarrow$ \emph{\textbf{hibajavító}} kódot alkalmazunk. + \end{itemize} + + \paragraph*{Kódok távolsága, súlya\\} + + A kódábécé $u$ és $v$ szavának \emph{\textbf{Hamming-távolsága}} $d(u,v)$ az azonos pozícióban levő, eltérő jegyek száma. \\ +\newpage + \noindent A Hamming-távolság rendelkezik a távolság szokásos tulajdonságaival, vagyis $\forall u,v,z$: + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $d(u,v) \geq 0$ + \item $d(u,v) = 0 \ \Longleftrightarrow \ u = v$ + \item $d(u,v) = d(v,u) \qquad $ (szimmetria) + \item $d(u,z) \leq d(u,v)+d(v,z) \qquad$ (háromszög egyenlőtlenség) + \end{itemize} + + \noindent \textbf{A kód távolsága} + \[ + d(C) = \min\limits_{u\neq v}d(u,v) \qquad (u,v \in C) + \] + + \noindent Amennyiben az $A$ kódábécé Abel-csoport a $0$ nullelemmel, ekkor egy $u$ szó \emph{\textbf{Hamming-súlya}} $w(u)$ a szóban szereplő nem nulla elemek száma. \\ + Ekkor a kód súlya + \[ + w(C) = \min\limits_{u\neq 0}w(u) + \] + + \paragraph*{Hibajavító kód} + + Amikor egy olyan szót kapunk, ami nem kódszó, a hozzá legkisebb Hamming-távolságú kódszóra javítjuk. + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A $K$ kód \emph{\textbf{t-hibajavító}}, ha egy legfeljebb $t$ helyen megváltozott kódot helyesen javít. + \item A $K$ kód \emph{\textbf{pontosan t-hibajavító}}, ha $t$-hibajavító, de nem $t+1$-hibajavító. + \end{itemize} + + \noindent \textit{Megjegyzés}: d minimális távolságú kód esetén $\ddfrac{d}{2}$-nél kevesebb hibát biztosan egyértelműen tudunk javítani. + + \paragraph*{Hamming-korlát\\} + + Egy $q$ elemű ábécé $n$ hosszú szavaiból álló $C$ kód $t$-hibajavító. \\ + Ekkor bármely két kódszóra a tőlünk legfeljebb $t$ távolságra lévő szavak halmazai diszjunktak.\\ + + \noindent Mivel egy kódszótól $j$ távolságra pontosan $\binom{n}{j}(q-1)^j$ szó van, így a \emph{\textbf{Hamming-korlát}} a kódszavak számára adott $t$-nél: + \[\#(C) \cdot \sum\limits_{j=0}^{t}\binom{n}{j}(q-1)^j \leq q^n \] + + \noindent Amennyiben egyenlőség áll fent \emph{tökéletes kód}ról beszélünk. + + \subsection*{Lineáris kódok} + + $A$ véges test és $A^n$ lineáris tér. Minden $ K \leq A^n$ alteret \emph{\textbf{lineáris kód}}nak nevezzük. \\ + Ha az altér + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $k$ dimenziós, + \item a kód távolsága $d$ és + \item $\#(A) = q$ (\emph{Hamming-korlát}) + \end{itemize} + akkor az ilyen kódot $[n,k,d]_q$ kódnak nevezzük.\\ + + \noindent Egy lineáris kódnál feltesszük, hogy kódolandó üzenetek $K^k$ elemei, azaz a kódábécé elemeiből képzett $k$-asok. + + \paragraph*{Generátormátrix} + + $K$ véges test feletti $[n,k,d]_q$ lineáris kódolást válasszuk egy (kölcsönösen egyértelmű) lineáris leképezésnek: + \[ + G:K^k \rightarrow K^n + \] + Ezt egy mátrixszal, az úgy nevezett generátormátrixszal jellemezhetjük. + + \paragraph*{Polinomkódok} + + Egy lineáris kód esetén az üzeneteket megfeleltethetjük $\mathbb{F}_q$ ($q$ elemű véges test) feletti $k$-nál alacsonyabb fokú polinomoknak. + \[ + (a_0,a_1,\cdots,a_{k-1}) \rightarrow a_0+a_1x+\cdots+a_{k-1}x^{k-1} + \]\\ + + \noindent Legyen $G(x)$ rögzített $m$-edfokú polinom. A $p(x)$ polinomot (üzenet) $G(x)$-szel szorozva lineáris kódolást kapunk (mivel a $p \rightarrow pG$ kölcsönösen egyértelmű).\\ + + \noindent Ekkor a kódszavak hossza: $n=k+m$. \\ + + \noindent Az ilyen típusú lineáris kódolást \emph{\textbf{polinomkódolás}}nak nevezzük.\\ + + {\footnotesize \noindent \textit{Megjegyzés}: Feltehetjük, hogy $G(x)$ főpolinom (együtthatója egység), illetve a konstans tag nem nulla (ha nulla lenne, a szorzatban kiesne a konstans tag, így a kódban a nulla indexű betű soha nem hordozna információt)} + + \paragraph*{CRC - Cyclic Redundancy Check\\} + + Ha egy polinomkódban $G(x) \big| x^n-1$, akkor \emph{\textbf{ciklikus kód}}ról beszélünk.\\ + + \noindent Ekkor, ha $a_0a_1\cdots a_{\textbf{n-1}}$ kódszó, akkor $a_{\textbf{n-1}}a_0\cdots a_{n-2}$ is az, mivel: + \[ + a_{n-1}+a_0x+\cdots+a_{n-2}x^{n-1} \ = \ x\cdot(a_0+a_1x+\cdots a_{n-1}x^{n-1})-a_{n-1}(x^n-1) + \] + osztható $G(x)$-szel.\\ + + \noindent A \emph{CRC} az $\mathbb{F}_2$ feletti ciklikus kódokat foglalja magába, és \emph{kizárólag hibajelzésre alkalmas}. \\ + + \noindent A kódolás menete következő: + \begin{enumerate} + \item Vegyük $p(x)x^m = (0,\ 0,\ \cdots\ ,\ 0,\ a_m,\ a_{m+1},\ \cdots\ ,\ a_{n-1})$ + \item Ezt osszuk el $G(x)$-el maradékosan + \begin{center} + $p(x)x^m = q(x)G(x)+r(x)$ + \end{center} + \end{enumerate} + Ekkor a kódszó legyen: + \[ + p(x)x^m-r(x) = q(x)G(x) + \] + Ez osztható $G(x)$-szel és magas fokszámokon az eredeti üzenet betűi helyezkednek el.\\ + + \noindent A fogadott szó ellenőrzése: Megnézzük, hogy osztható-e $G(x)$-szel. Ha nem oszható, akkor hiba történt.\\ + +\newpage + + \subsection*{Kiegészítés} + + \paragraph*{Shannon-kód} + + A következő módon állítjuk elő: + \begin{enumerate} + \item Rendezzük a betűket relatív gyakoriságaik alapján csökkenő sorrendbe. + \item Határozzuk meg az $l_1,\cdots,l_n$ szóhosszúságokat a következő módon: + \[r^{-l_i} \leq p_i < r^{-l_i+1} \] + \item Osszuk el az ábécé elemeit az egyes helyiértékeken.\\ + \end{enumerate} + + \noindent \emph{Példa 1}:\\ + + \noindent Legyen a kódábécé a ${0,1,2}$ halmaz, az kódolandó betűk és gyakoriságaik pedig a következők:\\ + + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline a & b & c & d & e & f & g & h & i & j \\ + \hline 0,17 & 0,02 & 0,13 & 0,02 & 0,01 & 0,31 & 0,02 & 0,17 & 0,06 & 0,09 \\ + \hline + \end{tabular}\\\\ + + \noindent A relatív gyakoriságok rendezése után:\\ + + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & i & b & d & g & e \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,06 & 0,02 & 0,02 & 0,02 & 0,01 \\ + \hline + \end{tabular}\\\\ + + \noindent Határozzuk meg szóhosszúságokat. Az f, a, h és c esetében: $3^{-2} = r^{-l_i} \leq p_i < r^{-l_i+1} = 3^{-1} $ Tehát azok szóhosszúsága 2. A többi esetben is így járunk el:\\ + + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & i & b & d & g & e \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,06 & 0,02 & 0,02 & 0,02 & 0,01 \\ + \hline 2 & 2 & 2 & 2 & 3 & 3 & 4 & 4 & 4 & 5 \\ + \hline + \end{tabular}\\\\ + + \noindent Ezek alapján f kódszava a 00, a kódszava a 01, h-hoz a 02 tartozik, míg c-hez 10. A j-hez ezek után 11 tartozna, de mivel az 3 hosszú, így 110.\\ + + \noindent A kódszavak tehát a következőképp alakulnak:\\ + + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & i & b & d & g & e \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,06 & 0,02 & 0,02 & 0,02 & 0,01 \\ + \hline 2 & 2 & 2 & 2 & 3 & 3 & 4 & 4 & 4 & 5 \\ + \hline 00 & 01 & 02 & 10 & 110 & 111 & 1120 & 1121 & 1122 & 12000 \\ + \hline + \end{tabular} \\\\ + + \noindent Az elkészült kódfa \ref{fig:shannon}. ábrán látható. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/shannon.png} + \caption{Shannon-kód példa 1. kódfája} + \label{fig:shannon} + \end{figure} + + \subsection*{Hufmann-kód} + + A Huffman-kód is optimális kód ($r$ elemszámú ábécével és $p_i$ gyakoriságokkal), melyet a következő módon állítunk elő. + \begin{enumerate} + \item Rendezzük a betűket relatív gyakoriságaik alapján csökkenő sorrendbe. + \item Annak érdekében, hogy csak egy csonka csúcs keletkezzen + \[m \equiv n \mod{r-1}\] + kongruenciának teljesülnie kell, ahol $m$ az egyetlen csonka csúcs kifoka. Ami ekvivalens azzal, hogy $m = 2 + ((n-2) \mod{r-1})$. Tehát osszuk el $n-2$-t $r-1$-gyel, és így $m$ a maradék+2 lesz. + \item Az első lépésben a sorozat $m$ utolsó betűjét összevonjuk (új jelölést/betűt adunk neki), és ennek a relatív gyakorisága a tagok relatív gyakoriságának összege lesz. Rendezzük a sorozatot. Ezen lépés után már a betűk száma kongruens $r-1$-gyel, így a következő redukciós lépésekben mindig teljes csúcsokat tudunk készíteni. + \item \label{itm:huffman_red} Az utolsó $r$ betűt vonjunk össze, helyettesítsük egy új betűvel és relatív gyakoriság legyen a relatív gyakoriságok összege. + \item A \ref{itm:huffman_red}-es redukciós lépést addig ismételjük míg $r$ db betű nem marad. Ekkor rendre minden betűhöz a kódábécé egy-egy betűjét rendeljük. + \item \label{itm:huffman_split} Ha redukált elemmel találkozunk szétbontjuk, majd az ő elemeihez is a kódábécé betűit rendeljük, de konkatenáljuk az előzővel. + \item A \ref{itm:huffman_split}-os lépést addig ismételjük míg marad redukált elem.\\ + \end{enumerate} + + \noindent \emph{Példa 1}:\\ + + \noindent A Shannon-kódnál látott forrást kódoljuk be ugyanúgy $\{0,1,2\}$ kódábécével.\\ + + \noindent \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline a & b & c & d & e & f & g & h & i & j \\ + \hline 0,17 & 0,02 & 0,13 & 0,02 & 0,01 & 0,31 & 0,02 & 0,17 & 0,06 & 0,09 \\ + \hline + \end{tabular}\\\\ +\newpage + \noindent Rendezzük relatív gyakoriság szerint:\\ + + \noindent \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & i & b & d & g & e \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,06 & 0,02 & 0,02 & 0,02 & 0,01 \\ + \hline + \end{tabular}\\\\ + + \noindent Osszuk el $n-2$-t $r-1$-gyel: $10-2 = 4*(3-1)+0$. Így $m$ a maradék+2, azaz $m=2$.\\ + Az utolsó $m$ betűt összevonjuk, és rendezzük a sorozatot:\\ + + \noindent \begin{tabular}{|c|c|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & i & (g,e) & b & d \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,06 & 0,03 & 0,02 & 0,02 \\ + \hline + \end{tabular}\\\\ + + \noindent Innentől kezdve minden redukciós lépésben az utolsó $r$ db azaz 3 betűt vonjuk össze:\\ + + \noindent \begin{tabular}{|c|c|c|c|c|c|c|} + \hline f & a & h & c & j & ((g,e), b, d) & i \\ + \hline 0,31 & 0,17 & 0,17 & 0,13 & 0,09 & 0,07 & 0,06 \\ + \hline + \end{tabular}\\\\ + + \noindent Ezt addig ismételjük, míg $r$ darab betű marad:\\ + + \noindent \begin{tabular}{|c|c|c|} + \hline (a,h,c) & f & (j,((g,e),b,d),i) \\ + \hline 0,47 & 0,31 & 0,22 \\ + \hline + \end{tabular}\\\\ + + \noindent A szétbontás alapján a \ref{fig:huffmann_split}. ábrán látható fát tudjuk összeállítani.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/huffmann_split.png} + \caption{Huffman-kód példa 1. kódfája} + \label{fig:huffmann_split} + \end{figure} + + \noindent Ezek alapján a kódtábla:\\ + + \noindent \begin{tabular}{|c|c|c|} + \hline betű & gyakoriság & kód \\ + \hline f & 0,31 & 1 \\ + \hline a & 0,17 & 00\\ + \hline h & 0,17 & 01\\ + \hline c & 0,13 & 02\\ + \hline j & 0,09 & 20\\ + \hline i & 0,06 & 22\\ + \hline b & 0,02 & 211\\ + \hline d & 0,02 & 212\\ + \hline g & 0,02 & 2100\\ + \hline e & 0,01 & 2101\\ + \hline + \end{tabular} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.pdf new file mode 100644 index 0000000..00aad04 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.tex new file mode 100644 index 0000000..2adb042 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/05.Valószínűségszámítási és statisztikai alapok/tetel5.tex @@ -0,0 +1,715 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[hungarian]{babel} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{bigints} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{titlesec} +\usepackage{geometry} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{ifthen} +\usepackage{listings} +\usepackage{tikz} +\usepackage{makecell} +\usepackage{multirow} +\usepackage{newunicodechar} +\usepackage{pgf,tikz} +\usepackage{pgfplots} +\usepackage{pgfplotstable} +\usepackage{subcaption} +\usepackage{tikz} +\usepackage{tipa} +\usepackage{wasysym} +\usepackage{xcolor} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc,patterns} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\titleformat*{\section}{\Large\bfseries} +\titleformat*{\subsection}{\large\bfseries} +\titleformat*{\subsubsection}{\normalsize\bfseries} +\titleformat*{\paragraph}{\small\bfseries} +\titleformat*{\subparagraph}{\footnotesize\bfseries} + +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} +\pgfmathdeclarefunction{gauss}{2}{\pgfmathparse{1/(#2*sqrt(2*pi))*exp(-((x-#1)^2)/(2*#2^2))}% +} +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{5. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 5. Valószínűségszámítási és statisztikai alapok} \\ + \end{center} + + \section*{Alapfogalmak} + + \noindent \textbf{Véletlen kísérlet}: Egy olyan történés / jelenség, aminek az eredményeinek halmazát ismerjük előre, de a pontos kimenet ezek között véletlen alakul. Azonos feltételek mellett megismételhető.\\ + + {\small + \noindent A kockadobásunk esetén maga a dobás a kísérlet, az eredmények halmaza {1, 2, 3, 4, 5, 6}. \\ + A (0, 1)-beli véletlen szám választása esetén az eredmények halmaza a (0, 1) intervallum.\\ + } + + \noindent \textbf{Esemény}: Egy olyan állítás, aminek az igazságtartalma a kísérlet elvégzése után kiértékelhető. Az eseményeket nagybetűvel jelöljük. Két esemény kizáró, ha egyszerre nem következhet be mindkettő. \\ + + \noindent Egy A esemény \textbf{\emph{része}} egy B eseménynek (A maga után vonja B-t), ha A teljesülése esetén B mindenképp teljesül. Jelölése: $A \subseteq B$. Két esemény ekvivalens, ha mindkettő része a másiknak. Jelölése: $A = B$. + A biztos esemény jele: $\Omega$, a lehetetlené $\varnothing$.\\ + + {\small + \noindent Kockadobás esetén az alábbiak mind események:\\ + A = \{4-et dobunk\}, B = \{4-et vagy 6-ot dobunk\}, C = \{Összetett számot dobunk\},\\ + D = \{Páratlant dobunk\}, E = \{100-nál kisebbet dobunk\}, F = \{3, 5-öt dobunk\}.\\ + A és D \emph{kizáróak}, A \emph{része} B-nek, B és C ekvivalensek, E a \emph{biztos esemény}, F pedig a \emph{lehetetlen}.\\ + } + + \noindent \textbf{Teljes eseményrendszer}: $A_1, A_2, ..., A_n, ...$ páronként kizáró események rendszere teljes \lword{eseményrendszer}, ha a kísérlet bármely kimenetele esetén valamelyik $A_i$ bekövetkezik (az alább definiált összeadást felhasználva átfogalmazható: az összegük $\Omega$).\\ + + {\small + \noindent A kockadobás esetén például\\ + T1 = \{\{párosat dobunk\}, \{páratlant pobunk\}\}, vagy\\ + T2 = \{\{1-et dobunk\}, \{prímet dobunk\}, \{4-et vagy 6-ot dobunk\}\}\\ + is \emph{teljes eseményrendszert alkot}nak. + } + + \paragraph*{Műveletek eseményekkel\\} + + \noindent Egy A esemény \textbf{\emph{ellentettjén}} (vagy \textbf{\emph{komplementerén}}) azt az eseményt értjük, ami pontosan akkor következik be, amikor A nem. Jele $\overline{A}$. (Pl: $\overline{\Omega} = \varnothing$).\\ + + \noindent Két esemény összege (vagy uniója) az az esemény, ami pontosan akkor következik be, ha a két esemény közül legalább egy teljesül. Jele $A + B$ vagy $A \cup B$.\\ + + \noindent Két esemény szorzatán (vagy metszetén) azt az eseményt értjük, ami pontosan akkor következik be, amikor mindkét esemény teljesül. Jele $A \cdot B$, $AB$ vagy $A \cap B$. + + \noindent Egy A és egy B esemény különbségén azt az eseményt értjük, amikor az A bekövetkezik, de a B nem. Jele $A -B$ vagy $A \backslash B$. + Valamint $A - B = A \cdot \overline{B}$.\\ +\newpage + \paragraph*{$\sigma$ algebra} + + \noindent Legyen X egy halmaz. Egy $\mathcal{R} \subseteq 2^{X}$ halmaz pontosan akkor $\boldsymbol{\sigma}$ \textbf{\emph{algebra}} X \emph{felett}, ha teljesíti az alábbi három feltételt: + \begin{itemize} + \item $X \in \mathcal{R}$ + \item $\mathcal{R}$ zárt a komplementerképzésre: $A \in \mathcal{R} \Rightarrow \overline{A} = X - A \in \mathcal{R}$ + \item $\mathcal{R}$ zárt a megszámlálható összegre: $A_1, A_2, \ldots, A_n, \ldots \in \mathcal{R} \Rightarrow \sum\limits_{i}A_i \in \mathcal{R}$ + \end{itemize} + + \noindent Egy kísérlet kimeneteleinek a halmazának nem feltétlen minden eleme érdekes számunkra. A vizsgálatainkhoz fontos a kísérleten definiálható események közül a számunkra megfigyelhetőeket mindig megadni előre.\\ + + \noindent \textbf{Elemi esemény}: Azokat a nem lehetetlen, megfigyelhető eseményeket, amiknek nincs olyan nem lehetetlen, megfigyelhető részeseménye, ami nem ekvivalens vele, elemi eseményeknek nevezzük. Azaz $A \in \mathcal{R}$ pontosan akkor \textbf{\emph{elemi esemény}}, ha:\\ + \[ + A \neq \varnothing\ \text{és}\ \forall B \neq \varnothing,\ B \in \mathcal{R},\ B \subseteq A : A \subseteq B + \] + Az elemi eseményeket $\omega$-val jelöljük.\\ + + \noindent A kockadobásnál a megfelelő elemi események a következők:\\ + $\omega_1$ = \{1-et dobunk\},\ $\omega_2$ = \{2-t dobunk\},\ $\omega_3$ = \{3-mat dobunk\},\ $\omega_4$ = \{4-et dobunk\},\\ + $\omega_5$ = \{5-öt dobunk\},\ $\omega_6$ = \{6-ot dobunk\}.\\ + Lehetne elemi esemény az, hogy ”x lett a dobott érték, amit y oldalról átfordulva értünk el”, de persze ez nem célszerű választás.\\ + + \noindent \textbf{Eseménytér}: Az elemi események halmaza. Mivel az összes elemi esemény összege $\Omega$, ezért az eseményteret is szokásosan $\Omega$-val jelöljük. Fontos megjegyezni, hogy abban az esetben, ha $\Omega$ nem megszámlálható, akkor az eseménytér önmagában nem határozza meg a megfigyelhető események halmazát.\\ + + \noindent A kockadobás esetén az előző példában látott elemi események mellett az eseménytér + \[\Omega = \{\omega_1,\ \omega_2,\ \omega_3,\ \omega_4,\ \omega_5,\ \omega_6\}\] + + \section*{Valószínűség} + + \noindent \textbf{Definíció}. Megfigyelhető események egy $\mathcal{R}\ \sigma$ algebráján definiálhatjuk a \textbf{\emph{valószínűség}}et, mint a következő tulajdonságokat teljesítő $P: \mathcal{R} \to [0,1]$ valós függvény: + \begin{itemize} + \item A valószínűség nem negatív: $0 \leq P(A)$ + \item A biztos esemény valószínűsége 1: $P(\Omega) = 1$ + \item $\forall A \in \mathcal{R}$-ra, páronként kizáró ($A_{i} \cdot A_{j} = \emptyset, i \neq j$) + \item Kizáró események megszámlálható összegének valószínűsége a valószínűségek összege: + \[ + A_1, A_2, \ldots, A_n, \ldots \in \mathcal{R},\ \forall i \neq j: A_iA_j = \varnothing \Rightarrow P(\bigcup\limits_{i}A_i) = \sum\limits_{i}P(A_i). + \] + \end{itemize} + + \noindent \textbf{Definíció}. Az eseménytér, a megfigyelhető események halmaza és a rajtuk definiált valószínűség együtt úgynevezett (\emph{\textbf{Kolmogorov-féle}}) valószínűségi mezőt alkot: $(\Omega, \mathcal{R}, P)$ hármas.\\ + + {\footnotesize + \noindent A kockadobás esetén, ha szabályos kockáról beszélünk (és minden értékű kimenetel megfigyelhető), akkor vehetjük $\ddfrac{1}{6}$-nak minden lehetséges érték valószínűségét, és így rögtön megkapjuk a 3. tulajdonságból minden esemény valószínűségét (az eseménybe foglalt lehetséges kimenetelek száma szorozva $\ddfrac{1}{6}$-al). Ha az eseménytér megszámlálható elemszámú, akkor működik is ez a módszer, azaz az elemi események valószínűségeiből minden esemény valószínűségét megkaphatjuk (nem megszámlálható esetben nem működik, például az egységintervallumon egyenletesen választott pont esetén minden egyes pont valószínűsége nulla, az intervallumok azonban már a hosszuknak megfelelő valószínűséget képviselnek). + } + + \section*{Diszkrét és folytonos valószínűségi változók} + + \noindent \textbf{\emph{Valószínűségi változónak}} nevezünk egy eseménytér (kísérlet) elemeihez valós számokat\\ + rendelő $X : \Omega \to \mathbb{R}$ függvényt, ha + \[ + \forall x \in \mathbb{R}: \Big\{\omega \in \Omega : X(\omega) < x\Big\} \in \mathcal{R}\ \textit{(halmaz eseményt alkot)} + \] + + \noindent A kockadobás esetén legegyszerűbb módon úgy definiálhatunk egy $X$ valószínűségi változót, hogy az értékének a dobás kimenetelét adjuk.\\ + + \noindent A $X$ valószínűségi változó \textbf{\emph{diszkrét}}, ha az értékkészlete véges vagy megszámlálhatóan végtelen.\\ + + \noindent Ha a $X$ diszkrét valószínűségi változó értékkészlete $\left\{x_1, x_2, \ldots\right\}$, akkor a $P(X = x_i)$ számokat $X$ \textbf{\emph{eloszlás}ának} nevezzük.\\ + + \noindent \textit{Megjegyzés}: Véges vagy végtelen sok szám, akkor és csak akkor alkot diszkrét eloszlást, ha nem negatívak és az összegük \textbf{1}.\\ + + \noindent A $X$ valószínűségi változó \textbf{eloszlásfüggvénye}: $F_{X}: \mathbb{R} \to \mathbb{R}$ + \[ + F_{X}(x)= P(X < x) + \] + + \noindent \textbf{Tétel.} Az $F_{X}: \mathbb{R} \to \mathbb{R}$ függvény pontosan akkor \textbf{\emph{eloszlásfüggvénye}} valamely valószínűségi változónak, ha + \begin{enumerate} + \item monoton növekvő: $\forall x_1 < x_2: F_{X}(x_1) \leq F_{X}(x_2)$ + \item balról folytonos: $\forall x_0 \in \mathbb{R}: \lim\limits_{x \to x_0^{-}}F_{X}(x) = F_{X}(x_0)$ + \item $\lim\limits_{x \to -\infty}{F_{X}(x)} = 0$ + \item $\lim\limits_{x \to +\infty}{F_{X}(x)} = 1$ + \end{enumerate} + + \noindent Egy diszkrét valószínűségi változó eloszlásfüggvénye olyan lépcsős függvény, amely a lehetséges értékeknél ugrik, és az ugrás nagysága az adott érték valószínűsége.\\ + + \noindent Ketten lőnek céltáblára. Az $A$ találati esélye 0,7. és a $B$ találati esélye 0,8.\\ + Mindketten egy lövést adnak le egymástól függetlenül.\\ + Jelentse $X$ a találatok számát és adjuk meg az eloszlásfüggvényt! + + \begin{center} + $\begin{array}{|c|c|} + \hline + \textbf{találatok száma} & \textbf{valószínűség} \\ \hline + 0 & (1-0.7) * (1-0.8) = 0.3 * 0.2 = \textbf{0.06} \\ \hline + 1 & 0.7 * (1 - 0.8) + (1-0.7) * 0.8 = 0.7*0.2 + 0.3*0.8 = \textbf{0.38} \\ \hline + 2 & 0.7 * 0.8 = \textbf{0.56} \\ \hline + \end{array}$\\ + \end{center} + + \begin{center} + \begin{tikzpicture}[scale=1.0] + \begin{axis}[axis lines=middle,xmin=-2.0,xmax=5.0,ymin=0.0,ymax=1.3,legend pos=north west,ymajorgrids=true, + xlabel=$\scriptstyle x$, + ylabel=$\scriptstyle y$, + tick label style={font=\small}] + \addplot[only marks,mark=*,blue] coordinates { (1.0,0.06) }; + \addplot[only marks,mark=o,blue] coordinates { (0.0,0.06) }; + \addplot[no marks,domain=0.05:1,samples=10,smooth,line width=2pt,blue]{0.06}; + \addplot[only marks,mark=*,blue] coordinates { (0,0) }; + \addplot[only marks,mark=o,blue] coordinates { (1.0,0.44) }; + \addplot[no marks,domain=1.05:2,samples=10,smooth,line width=2pt,blue]{0.44}; + \addplot[only marks,mark=*,blue] coordinates { (2,0.44) }; + \addplot[no marks,domain=-2.0:-0.05,samples=10,smooth,line width=2pt,blue]{0}; + \addplot[only marks,mark=o,blue] coordinates { (2,1) }; + \addplot[no marks,domain=2.05:5.0,samples=10,smooth,line width=2pt,blue]{1}; + \end{axis} + \end{tikzpicture} + \end{center} + + \noindent Ha $X$ diszkrét valószínűségi változó értékkészlete $\{x_1, x_2, \ldots\}$, akkor + \[ + F_{X}(x) = \sum\limits_{i: x_i < x}P(X = x_i) + \] + + \noindent A szabályos kockadobás esetén az előző példában definiált $X$ valószínűségi változónak adjuk meg az eloszlásfüggvényét. + Látható, hogy az 1, 2, 3, 4, 5 és 6 értékeknél lesz csak változás, ezeken a pontokon kívül nem.\\ + Az egyes intervallumokra a megfelelő valószínűségeket kiszámolva megkapjuk, hogy + \begin{itemize} + \item $F_{X}(x) = 0,\ \text{ha}\ x \leq 1$, + \item $F_{X}(x) = \ddfrac{i}{6},\ \text{ha}\ i < x \leq i + 1\ \text{és}\ 1 < x \leq 6$, + \item $F_{X}(x) = 1,\ \text{ha}\ x > 6$. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.39\linewidth]{img/kockadobas_eloszlasfuggveny.png} + \caption{} + \label{fig:imder} + \end{figure} + + \noindent Legyen a $X$ diszkrét valószínűségi változó értékkészlete $\{x_1, x_2, \ldots\}$.\\ + Ekkor $X$ \emph{\textbf{várható értéke}} + \[ + E(X) = \sum\limits_{k}x_k \cdot P(X = x_k) + \] + (feltéve, hogy ez a sor abszolút konvergens, azaz $\sum\limits_{k}\big|x_k\big| \cdot P(X = x_k) < \infty$).\\ + + \noindent \emph{Példa}: + \noindent 3 darab 10 dollárossal befektetési terveink vannak, egy rulett segítségével. \\ + A terv a következő: felteszünk 10 dollárt a pirosra.\\ + + \noindent Ha nyer, akkor megdupláztuk a 10 dollárt és abbahagyjuk a játékot.\\ + \noindent Ha veszít, akkor újabb 10 dollárt teszünk a pirosra, és ha ezúttal nyerünk, akkor szintén abbahagyjuk a játékot.\\ + \noindent Ha másodszorra sem nyerünk, akkor az utolsó 10 dollárt is felrakjuk a pirosra.\\ + + \noindent A kérdés, hogy várhatóan mennyi pénzünk lesz a tranzakció végén.\\ + + \noindent A ruletten 18 piros, 18 fekete és egy zöld mező található.\\ + \noindent NY: Nyert, V: Veszített. + + \begin{center} + \renewcommand{\arraystretch}{2} + $\begin{array}{|ccc|c|c|} + \hline + 1. & 2. & 3. & X_i & P(X_i) \\ \hline + NY & & & 40 & \ddfrac{18}{37} = 00487 \\ \hline + V & NY & & 30 & \ddfrac{19}{37} \cdot \ddfrac{18}{37} = 0.25 \\ \hline + V & V & NY & 20 & \ddfrac{19}{37} \cdot\ddfrac{19}{37} \cdot\ddfrac{18}{37} = 0.128 \\ \hline + V & V & V & 0 & \ddfrac{19}{37} \cdot\ddfrac{19}{37} \cdot\ddfrac{19}{37} = 0.135 \\ \hline + \end{array}$ + \renewcommand{\arraystretch}{1} + \end{center} + \[ + EX = \sum\limits_{k}x_k \cdot P(X = x_k) = 40 * 0,487 + 30 * 0.25 + 20 * 0.128 = 29,54 + \] + + \subsection*{Folytonos valószínűségi változók} + + \noindent A $X$ valószínűségi változó abszolút folytonos, ha létezik olyan $f_{X}: \mathbb{R} \to \mathbb{R}$ függvény, hogy $F_{X} = \bigintsss\limits_{-\infty}^{x}f_{X}(t)\ dt$ minden $x \in \mathbb{R}$ esetén. Ekkor az $f_{X}$ függvényt a $X$ valószínűségi változó \textbf{\emph{sűrűségfüggvényének}} nevezzük.\\ + + \noindent \textbf{Tétel.} Egy $f:\mathbb{R} \to \mathbb{R}$ függvény, ,,akkor és csak akkor" \emph{sűrűségfüggvény}e valamilyen abszolút folytonos valószínűségi változónak, ha + \begin{itemize} + \item $f$ nem negatív (azaz $f(x) \geq 0,\ \forall x \in \mathbb{R}$) + \item $\bigintss\limits_{-\infty}^{\infty}f(x)\ dx = 1$ + \end{itemize} + + \noindent \emph{Megjegyzés}: + \begin{itemize} + \item $P(a \leq X \leq b) = \bigintss\limits_{a}^{b}f_{X}(x)\ dx \qquad$ ($a,b \in \mathbb{R},\ a < b$ esetén) + \item Ha $X$ abszolút folytonos valószínűségi változó, akkor $F_{X}(x)$ mindig folytonos függvény, és $f_{X}(x)$ folytonos az $x \in \mathbb{R}$ pontban, akkor $F_{X}$ differenciálható $x$-ben és $F_{X}'(x) = f_{X}(x)$. + \end{itemize} + + \begin{center} + \begin{tikzpicture} + \begin{axis}[ + no markers, + domain=0:10, + samples=100, + axis lines*=left, + xlabel=, + ylabel=, + height=6cm, + width=10cm, + xtick={-3, -2, -1, 0, 1, 2, 3}, + xticklabels={, a, , , b, , }, + ytick=\empty, + enlargelimits=false, + clip=false, + axis on top, + ] + \addplot [fill=cyan!30, draw=blue, line width=2pt, domain=-3:3] {gauss(0,1)} \closedcycle; + \addplot [fill=orange!30, draw=orange, line width=2pt, domain=-3:-2] {gauss(0,1)} \closedcycle; + \addplot [fill=red!30, draw=red, line width=2pt, domain=1:3] {gauss(0,1)} \closedcycle; + \node[coordinate, pin={$P(a < X < b) = \int\limits_{a}^{b} f(x) dx$}] at (axis cs: 0, 0.4){}; + \node[coordinate, pin={$\makecell{P(b < X) =\\ \int\limits_{b}^{\infty} f(x) dx}$}] at (axis cs: 2.2, 0.0665){}; + \node[coordinate, pin={$\makecell{P(X < a) =\\ \int\limits_{-\infty}^{a} f(x) dx}$}] at (axis cs: -2.15, 0.05){}; + \end{axis} + \end{tikzpicture} + \end{center} + + \begin{center} + $\int\limits_{-\infty}^{\infty} f_{X}(x) dx = \int\limits_{-\infty}^{a} f(x) dx + \int\limits_{a}^{b} f(x) dx + \int\limits_{b}^{\infty} f(x) dx = 1$\\ + \end{center} + + \noindent Legyen a $X$ abszolút folytonos valószínűségi változó sűrűségfüggvénye $f_{X}(x)$.\\ + Ekkor $X$ \emph{\textbf{várható értéke}} + \[ + EX = \bigintssss\limits_{-\infty}^{\infty}x \cdot f_{X}(x)\ dx + \] + (feltéve, hogy ez az integrál abszolút konvergens, azaz $\bigintss\limits_{-\infty}^{\infty}\big|x\big| \cdot f_{X}(x)\ dx < \infty$) + + \noindent A $X$ valószínűségi változó \textbf{\emph{szórásnégyzete}} (vairanciája): + \[ + D^{2}X = E\big(X - EX\big)^{2} = EX^2 - E^2X + \] + (feltéve, hogy ez létezik.) + + \noindent \emph{Megjegyzés}: A $X$ valószínűségi változó szórása + \[ + DX = +\sqrt{D^{2}X} + \] + + \begin{itemize} + \item Ha $X$ diszkrét valószínűségi változó: + \[ + D^{2}X = \sum\limits_{k}x_{k}^{2} \cdot P(X = x_k) - \left(\sum\limits_{k}x_k \cdot P(X = x_k)\right)^2 + \] + + \noindent Roulettes példa: $D^{2}X = 40^2 * 0,487 + 30^2 * 0.25 + 20^2 * 0.128 = 1055.2$ + + \item Ha $X$ abszolút folytonos valószínűségi változó: + \[ + D^{2}X = \bigintssss\limits_{-\infty}^{\infty}x^{2} \cdot f_{X}\ dx - \left(\bigintssss\limits_{-\infty}^{\infty}x \cdot f_{X}(x)\ dx\right) + \] + \end{itemize} + + \subsection*{Diszkrét valószínűségi változók} + + \noindent Értékkészlete legfeljebb megszámlálhatóan végtelen, azaz $\{x_1, \ldots, x_n, ... \}$ elemekből áll.\\ + + \noindent Ekkor eloszlása: $p_k := P(X = x_k)$.\\ + + \noindent \begin{tabular}{|p{3.0cm}|p{4cm}|p{4cm}|c|c|} + \hline \textbf{Név} & \textbf{Értelmezés} & \textbf{Eloszlás} & \textbf{$EX$} & \textbf{$D^{2}X$} \\ + \hline indikátor \newline $Ind(p)$ & Egy $p$ valószínűségű esemény bekövetkezik-e vagy sem. & $P(X=1) = p$ \newline $P(X=0) = 1-p$ & $p$ & $p(1-p)$ \\ + \hline geometriai (Pascal) \newline $Geo(p)$ & Hányadikra következik be először egy $p$ valószínűségű esemény. & \makecell{$P(X=k) =$\\ $p(1-p)^{k-1}$} \newline $k=1,2...$ & $\ddfrac{1}{p}$ & $\ddfrac{1-p}{p^2}$\\ + \hline \multicolumn{5}{l}{\makecell{Ha a kísérletünk a kockadobás az első 6-os dobásig és az\\ X valószínűségi változó a dobások száma, akkor 6 geometriai eloszlású.}} \\ + \hline hipergeometriai \newline $Hipgeo(N,M,n)$ & Visszatevés nélküli mintavétel. & $P(X=k) = \ddfrac{{M \choose k}{N-M \choose n-k}}{{N \choose n}}$ \newline $k=0,1,...,n$ & $n \ddfrac{M}{N}$ & $n \ddfrac{M}{N}(1 - \ddfrac{M}{N})(1 - \ddfrac{n-1}{N-1})$ \\ + \hline \multicolumn{5}{l}{\makecell{Ha N és M a végtelenbe tart úgy, hogy M / N egy 0 és 1 közötti p konstanshoz tart, akkor\\ a hipergeometrikus eloszlások sorozata a binomiális eloszláshoz tart.}}\\ + \hline binomiális \newline $Bin(n,p)$ & Visszatevéses mintavétel. & $P(X=k) = {n \choose k}p^{k}(1-p)^{n-k}$ \newline $k=0,1,...,n$ & $np$ & $np(1-p)$ \\ + \hline negatív binomiális \newline $Negbin(n,p)$ & Hányadikra következik be $n.$ alkalommal egy $p$ valószínűségű esemény. & $P(X=k) = {k-1 \choose n-1}p^{n}(1-p)^{k-n}$ \newline $k=n,n+1,...$ & $\ddfrac{n}{p}$ & $\ddfrac{n(1-p)}{p^{2}}$ \\ + \hline Poisson \newline $Poi(\lambda)$ & Ritka esemény. & $P(X=k) = \ddfrac{\lambda^k}{k!}e^{-\lambda}$ & $\lambda$ & $\lambda$ \\ + \hline + \end{tabular}\\ \\ + + \noindent \emph{Példa}:\\ + + \noindent \textbf{\emph{Hipergeometrikus}}:\\ + + \noindent \emph{Egy úton 30 nap alatt 12 napon történt baleset. Ebből a 30 napból kiválasztunk egy hetet, mi a valószínűsége, hogy ezen a héten 2 balesetes nap van?}\\ + + \noindent Hipergeometriainál ismert, hogy mennyi az összes elem és az összes selejt N, K, és a minta n.\\ + \noindent Az összes elem $N = 30$ nap, ebből (selejtes) a balesetes nap, $M = 12$. A minta egy hét, vagyis $n = 7$, és itt $X = 2$ balesetes napot szeretnénk.\\ + + \begin{center} + $P(X=k) = \ddfrac{{M \choose k}{N-M \choose n-k}}{{N \choose n}} = \ddfrac{{12 \choose 2}{30-12 \choose 7-2}}{{30 \choose 7}} = \ddfrac{{12 \choose 2}{18 \choose 5}}{{30 \choose 7}} = \ddfrac{565488}{2035800} = 0.27777188$\\ + $EX = n * \ddfrac{M}{N} = 7 * \ddfrac{12}{30} = 0.23^{.}$ + \end{center} + + \noindent A másik két feladatban csak valamilyen százalékos érték, a várható, az átlag, az arány vagy valószínűség. Ez esetben nem tudjuk, hogy mennyi baleset történik a 30 nap alatt, csak azt tudjuk, hogy várhatóan mennyi.\\ + + \noindent \textbf{\emph{Binomiális:}}\\ + Egy úton 30 nap alatt átlag 12 balesetes nap van. Mi a valószínűsége, hogy egy adott héten 2 balesetes nap van?\\ + + \noindent A binomiálisnál vett példában nem lehet több a balesetes napok száma, mint 7, így X korlátos.\\ + $X$ = balesetes napok száma.\\ + $n = 7$, $p = \ddfrac{M}{N} = \ddfrac{12}{30} = 0.4$.\\ + + \begin{center} + $P(X = k = 2) = {n \choose k}p^{k}(1-p)^{n-k} = {7 \choose 2}*0.4^{2}*(1 - 0.4)^{7-2} = 21*0.16*0.07776 = 0.2612736$ + $EX = n * p = 7 * 0.4 = 2.8$ + \end{center} + + \noindent \textbf{\emph{Poisson:}}\\ + Egy úton 30 nap alatt átlag 12 baleset történik. Mi a valószínűsége, hogy egy adott héten 2 baleset van?\\ + Az első két esetben X a balesetes napok száma, a harmadikban pedig a balesetek száma.\\ + + \noindent A harmadik feladatnál a Poisson eloszlás esetében baleset tetszőleges számú lehet, átlagban 12 30 naponta, de lehet akár 1000 is, tehát itt X nem korlátos.\\ + $X$ = balesetek száma.\\ + $\lambda =$ várhatóan hány baleset van egy héten 30 naponta 12 baleset szokott lenni, tehát naponta $\ddfrac{12}{30} = 0.4$ és így hetente hétszer annyi $7 * 0.4 = 2.8$.\\ + \begin{center} + $P(X = k = 2) = \ddfrac{\lambda^k}{k!}e^{-\lambda} = \ddfrac{2.8^2}{2!}e^{-2.8} = \ddfrac{7.84}{2} * 0.0608101 = 0,238375592$\\ + $E(X) = \lambda = 2.8$\\ + \end{center} + + \noindent \begin{tabular}{|p{3cm}|c|c|c|c|} + \hline \textbf{Név} & \textbf{Eloszlásfüggvény} & \textbf{Sűrűségfüggvény} & \textbf{$EX$} & \textbf{$D^{2}X$} \\ + \hline egyenletes \newline $E(a,b)$ + & $\left\{\begin{array} {lr} + 0 & x \leq a \\ + \ddfrac{x-a}{b-a} & a < x \leq b \\ + 1 & b < x + \end{array}\right.$ + & $\left\{\begin{array} {lr} + \ddfrac{1}{b-a} & a < x \leq b \\ + 0 & \text{különben} + \end{array}\right.$ + & $\ddfrac{a+b}{2}$ + & $\ddfrac{(b-a)^2}{12}$ \\ + \hline exponenciális \newline $Exp(\lambda)$ + & $\left\{\begin{array} {lr} + 1 - e^{-\lambda x} & x \geq 0 \\ + 0 & \text{különben} + \end{array}\right.$ + & $\left\{\begin{array} {lr} + \lambda \cdot e^{-\lambda x} & x \geq 0 \\ + 0 & \text{különben} + \end{array}\right.$ + & $\ddfrac{1}{\lambda}$ + & $\ddfrac{1}{\lambda^{2}}$ \\ + \hline normális \newline $N(m,\sigma^2)$ & $...$ & $\ddfrac{1}{\sqrt{2 \pi}\sigma}e^{-\ddfrac{(x-m)^2}{2\sigma^2}}$ $x \in \mathbb{R}$ & $m$ & $\sigma^2$ \\ + \hline standard normális \newline $N(0,1^2)$ & $\Phi(x)=...$ & $\ddfrac{1}{\sqrt{2 \pi}}e^{-\ddfrac{x^2}{2}}$ $x \in \mathbb{R}$ & $0$ & $1$ \\ + \hline gamma \newline $\Gamma(\alpha,\lambda)$ + & $...$ + & $\left\{\begin{array} {lr} + \ddfrac{1}{\Gamma(\alpha)}\lambda^{\alpha}x^{\alpha-1}e^{-\lambda x} & x \geq 0 \\ + 0 & \text{különben} + \end{array}\right.$ + & $\ddfrac{\alpha}{\lambda}$ + & $\ddfrac{\alpha}{\lambda^2}$ \\ + \hline + \end{tabular}\\ + + \subsection*{Fogalmak} + + \begin{itemize} + \item \textit{Konvolúció}: $X,Y$ független valószínűségi változók, konvolúciójuk az $X+Y$ v. v. + \item \textit{Függetlenség}: $P(X_1 0 \to$ pozitív + \item $R < 0 \to$ negatív + \item $R^2 \sim 0 \to$ gyenge + \item $R^2 \sim 0.5 \to$ közepes + \item $R^2 \sim 1 \to$ erős + \end{itemize} + \end{itemize} + + \section*{Nagy számok törvénye} + + \subsection*{Gyenge törvény} + + $X_1, X_2, ...$ függetlenek, azonos eloszlásúak, $EX_i = m < \infty$, $D^{2}X_i = \sigma^2 < \infty$. \\ + \[ + P\left(\ddfrac{X_1 + ... + X_n}{n} - m \geq \varepsilon\right) \rightarrow 0 \quad (n \to \infty) + \] + $\forall \varepsilon > 0$\text{-ra (sztochasztikus konvergencia)}. + + \subsection*{Erős törvény} + + $X_1, X_2, ...$ függetlenek, azonos eloszlásúak, $EX_1 = m < \infty$, $D^{2}X_1 = \sigma^2 < \infty$. \\ + \[ + \ddfrac{X_1 + ... + X_n}{n} \rightarrow m \quad (n \to \infty) + \] + 1 valószínűséggel. \\ + Megjegyzés: Csebisev-egyenlőtlenséggel bizonyítjuk. $\Big(\ddfrac{\sigma^2}{n \varepsilon^2} \to 0$ $(n \to \infty)\Big)$ + + \subsubsection*{Csebisev-egyenlőtlenség} + + $EX$ véges. \\ + Ekkor $P(|X-EX| \geq \lambda) \leq \ddfrac{D^{2}X}{\lambda^2}$ \\ + Megjegyzés: Bizonyítás Markov-egyenlőtlenséggel. + + \subsubsection*{Markov-egyenlőtlenség} + + $X \geq 0, c > 0$. \\ + Ekkor $P(X \geq c) \leq \ddfrac{EX}{c}$ + + \subsection*{Konvergenciafajták} + + $X_n \to X$, vagyis $X$ konvergens. + \begin{itemize} + \item \textit{sztochasztikusan}: ha $\forall \varepsilon > 0$-ra $P(|X_n - X| \geq \varepsilon) \rightarrow 0$ $(n \to \infty)$. + \item \textit{1 valószínűséggel (majdnem mindenütt)}: ha $P(\omega : X_n(\omega) \to X(\omega)) = 1$. + \item \textit{$L^p$-ben}: ha $E(|X_n - X|^p) \rightarrow 0$ $(n \to \infty)$ ($p>0$ rögzített). + \item \textit{eloszlásban}: ha $F_{X_n}(x) \rightarrow F_{X}(x)$ $(n \to \infty)$ az utóbbi minden folytonossági pontjában. + \end{itemize} + \textit{Kapcsolataik}: 1 valószínűségű és $L^p$-beli a legerősebb, ezekből következik a sztochasztikus, ebből pedig az eloszlásbeli. + + \section*{Centrális határeloszlás tétel} + + $X_1, X_2, ...$ függetlenek, azonos eloszlásúak, $EX_1 = m < \infty$, $D^{2}X_1 = \sigma^2 < \infty$. \\ + Ekkor $\ddfrac{X_1 + ... + X_n - nm}{\sqrt{n}\sigma} \rightarrow N(0,1)$ $(n \to \infty)$ eloszlásban, azaz + \[ + P\left(\ddfrac{X_1 + ... + X_n - nm}{\sqrt{n}\sigma} < x\right) \rightarrow \Phi(x)\quad (n \to \infty) + \] + + \section*{Statisztikai mező} + + $(\Omega, \mathcal{R}, \mathcal{P})$ hármas, ha $\mathcal{P} = \{P_{\vartheta}\}_{\vartheta \in \Theta}$ és $(\Omega, \mathcal{R}, P_{\vartheta})$\\ + Kolmogorov-féle valószínűségi mező $\forall \vartheta \in \Theta$-ra. + + \subsection*{Fogalmak} + + \begin{itemize} + \item \textit{Minta}: $\underline{X} = (X_1,...,X_n): \Omega \to X \in \mathbb{R}^n$. ($X_i$ valószínűségi változó) + \item \textit{Mintatér}: $X$, minta lehetséges értékeinek halmaza, gyakran $\mathbb{R}^n, \mathbb{Z}^n$. + \item \textit{Minta [realizációja]}: $\underline{x} = (x_1,...,x_n)$, konkrét megfigyelés. + \item \textit{Statisztika}: $T: X \to \mathbb{R}^k$. + \item \textit{Statisztika alaptétele}: (Glivenko--Cantelli-tétel) $X_1, X_2, ...$ független, azonos eloszlású $F$ eloszlásfüggvénnyel. Ekkor az $F_n$ tapasztalati eloszlásfüggvényre teljesül, hogy + \[ + \sup_{-\infty u_{1-\ddfrac{\varepsilon}{2}}$, és elfogadjuk, ha $|u| \leq u_{1-\ddfrac{\varepsilon}{2}}$. \\ + Egyoldali esetben $u > u_{1-\varepsilon}$ (jobb) és $u < u_{1-\varepsilon}$ (bal) esetét vizsgáljuk, ezen esetekben utasítjuk el $H_0$-t. + \item \textit{Kétmintás}: Itt a feltételek a következők: $X_i \sim N(m_1, \sigma_1^2)$, $i=1..n$ és $\eta_j \sim N(m_2, \sigma_2^2)$, $j=1..m$. A szórások szintén ismertek. $H_0: m_1 = m_2$, és $u = \ddfrac{\overline{X} - \overline{\eta}}{\sqrt{\ddfrac{\sigma_1^2}{n} + \ddfrac{\sigma_2^2}{m}}}$. $H_1 : m_1 > m_2$, ez a felső (jobb?) oldali, $H_1 : m_1 < m_2$ pedig az alsó (bal?) ellenhipotézis. + \end{itemize} + \item \textit{t-próba}: Ennél a próbánál nem ismert a szórás, viszont ugyanúgy normális eloszlást feltételezünk, mint az u-próbánál. $X_i \sim N(m, \sigma^2)$, $i=1..n$. + \begin{itemize} + \item \textit{Egymintás}: $H_0: m = m_0$. Ellenhipotézis az u-próbához hasonlóan. $t = \sqrt{n}\ddfrac{\overline{X} - m_0}{\sqrt{\sigma_{*}^2}}$, ahol $\sigma_{*}^2$ a korrigált tapasztalati szórásnégyzet, amit a mintából számíthatunk ki. (Megjegyzés: $n$ helyett $n-1$-gyel osztunk a képletben.) Ez az érték $t$-eloszlású $H_0$ esetén, ami $n-1$ szabadságfokú. Más néven szokás ezt a próbát Student-próbának is nevezni. + \item \textit{Kétmintás}: $X_i \sim N(m_1, \sigma_1^2)$, $i=1..n$ és $\eta_j \sim N(m_2, \sigma_2^2)$, $j=1..m$. Ez esetben sem ismert a szórás, viszont feltételezzük, hogy a két minta szórása megegyezik. Ekkor $t_{n+m-2} = \sqrt{\ddfrac{nm(n+m-2)}{n+m}}\ddfrac{\overline{X} - \overline{\eta}}{\sqrt{\sum{(X_i - \overline{X})^2} + \sum{(\eta_j - \overline{\eta})^2}}}$. $n+m-2$ a próba szabadságfoka. + \end{itemize} + \item \textit{f-próba}: Két minta esetén használható. Ez a próba szórások egyezőségének vizsgálatára alkalmas, tehát itt $H_0 : \sigma_1 = \sigma_2$. Ha a két minta szórásnégyzete megegyezik, akkor a hányadosuk $1$-hez tart. $f_{n-1,m-1} = max(\ddfrac{\sigma_1^2}{\sigma_2^2}, \ddfrac{\sigma_2^2}{\sigma_1^2})$. A két szabadsági fok közül az első az $f$ számlálójához tartozó minta elemszáma $- 1$, a második a nevezőjéhez. + \item \textit{Welch-próba}: Más néven d-próba. Hasonló, mint a kétmintás t-próba, de itt a szórások egyezőségét nem kell feltenni. Szabadsági foka bonyolult képlettel számítható. + \item \textit{szekvenciális próbák}: $V_n = \ddfrac{\prod{f_1(x_i)}}{\prod{f_0(x_i)}} = \ddfrac{L_1(\underline{x})}{L_0(\underline{x})}$. $f_0$ a nullhipotézis szerinti sűrűségfüggvény, $f_1$ az ellenhipotézis szerinti. Adott egy $A$ és egy $B$ érték, $A Y) = \ddfrac{1}{2}$ tesztelésére összeszámoljuk, hogy hány párra teljesül, hogy $X_i > Y_j$. + \end{itemize} + \end{itemize} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_01.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_01.png new file mode 100644 index 0000000..2ba7a94 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_01.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_02.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_02.png new file mode 100644 index 0000000..4d1a5d5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_02.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_03.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_03.png new file mode 100644 index 0000000..73f09c3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_03.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_04.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_04.png new file mode 100644 index 0000000..e2081ba Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_04.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_05.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_05.png new file mode 100644 index 0000000..7e1446e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_05.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_06.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_06.png new file mode 100644 index 0000000..55fac07 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_06.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_07.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_07.png new file mode 100644 index 0000000..6d5902a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_07.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_08.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_08.png new file mode 100644 index 0000000..1c38f17 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_08.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_09.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_09.png new file mode 100644 index 0000000..58135ff Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_09.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_10.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_10.png new file mode 100644 index 0000000..1634559 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_10.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_end.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_end.png new file mode 100644 index 0000000..cafb460 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/alphabeta_end.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/avgminmax_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/avgminmax_sample.png new file mode 100644 index 0000000..6c0dcbe Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/avgminmax_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_alphabeta.jpeg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_alphabeta.jpeg new file mode 100644 index 0000000..8595cc7 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_alphabeta.jpeg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_minmax.jpeg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_minmax.jpeg new file mode 100644 index 0000000..935547e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/chess_minmax.jpeg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/diagram.drawio new file mode 100644 index 0000000..c5dab33 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/four_queen_problem_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/four_queen_problem_sample.png new file mode 100644 index 0000000..f9a737f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/four_queen_problem_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g1.png new file mode 100644 index 0000000..9eb0aab Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g2.png new file mode 100644 index 0000000..514b0b2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g3.png new file mode 100644 index 0000000..73d1319 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/incorrect_g3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/melysegi_graf_ker.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/melysegi_graf_ker.png new file mode 100644 index 0000000..738a8ad Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/melysegi_graf_ker.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/minmax_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/minmax_sample.png new file mode 100644 index 0000000..5435bff Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/minmax_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/negamax_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/negamax_sample.png new file mode 100644 index 0000000..8e428ce Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/negamax_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/queen.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/queen.png new file mode 100644 index 0000000..e7da503 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/queen.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/szelessegi_graf_ker.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/szelessegi_graf_ker.png new file mode 100644 index 0000000..383d1f6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/szelessegi_graf_ker.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/variable_depth_minmax.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/variable_depth_minmax.png new file mode 100644 index 0000000..3e079d5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/img/variable_depth_minmax.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.pdf new file mode 100644 index 0000000..8142e9a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.tex new file mode 100644 index 0000000..4450cfe --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/06.Mesterséges intelligencia/tetel6.tex @@ -0,0 +1,823 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[hungarian]{babel} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{geometry} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{ifthen} +\usepackage{listings} +\usepackage{makecell} +\usepackage{multirow} +\usepackage{newunicodechar} +\usepackage{pgf,tikz} +\usepackage{subcaption} +\usepackage{tipa} +\usepackage{wasysym} +\usepackage{xcolor} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata} + + \geometry{ + a4paper, + total={170mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\definecolor{mygray}{rgb}{0.0, 0.0, 0.0} +\definecolor{blue(pigment)}{rgb}{0.2, 0.2, 0.6} +\definecolor{brickred}{rgb}{0.8, 0.25, 0.33} +\definecolor{coolblack}{rgb}{0.0, 0.18, 0.39} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\bullet$} + +% A dokument itt kezdődik + +\date{} +\useunder{\uline}{\ul}{} +\fancyhf{} % sets both header and footer to nothing + \lfoot{ELTE-IK} + \cfoot{\thepage} + \rfoot{6. tétel } + +\pagestyle{fancy} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \hyphenation{oddword} + \uchyph=0 + \begin{center} + {\Large\bfseries\noindent 6. Mesterséges intelligencia} \\ + \end{center} + + \section*{Bevezetés} + + \noindent Az MI az intelligens gondolkodás számítógépes reprodukálása szempontjából hasznos elveket, módszereket, technikákat kutatja, fejleszti, rendszerezi.\\\\ + Megoldandó feladatai + \begin{itemize} + \item nehezek, mert ezek problématere hatalmas, + \item a megoldás megkeresése kellő intuíció hiányában kombinatorikus robbanáshoz vezethet. + \begin{itemize} + \small \color{mygray} + \item Például az utazó ügynök probléma $n$ város esetén $(n-1)!$ a lehetséges utak (élek) száma. Ebben az esetben az alaphalmaz elemeinek kis mértékű változása is már exponenciális mértékben nőveli a problématér elemeinek számát. + \begin{itemize} + \item $n = 5$ esetén, $4! = 24$ + \item $n = 50$ esetén, $49! \sim 6 * 10^{62}$ + \end{itemize} + \end{itemize} + \end{itemize} + A szoftver intelligensen viselkedik, és sajátos eszközöket használ. A reprezentáció átgondolt a feladat modellezéséhez, és az algoritmusok hatékonyak, heurisztikával megerősítve. + + \section*{Útkeresési problémák} + + \noindent Útkeresési problémaként sok MI feladat fogalmazható meg úgy, hogy a feladat modellje alapján megadunk egy olyan élsúlyozott irányított gráfot, amelyben adott csúcsból adott csúcsba vezető utak jelképezik a feladat egy-egy megoldását. Ezt a feladat \textbf{\textit{gráfreprezentációjának}} is szokás nevezni, amely magába foglal egy úgynevezett \textbf{\textit{$\delta$-gráfot} (delta gráf)} (olyan élsúlyozott irányított gráf, ahol egy csúcsból kivezető élek száma véges, és az élek költségére megadható egy $\delta$ pozitív alsó korlát), az abban kijelölt startcsúcsot és egy vagy több célcsúcsot. Ebben a reprezentációs gráfban keresünk egy startcsúcsból kiinduló célcsúcsba futó utat, esetenként egy legolcsóbb ilyet.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + \noindent Legyen az $(N,A,c)$ egy él-súlyozott irányított gráf, amely csúcsainak halmaza az $N$, éleinek halmaza az $A\subseteq N \times N$, az $(n,m) \in A$ egy $n$ csúcsból $m$ csúcsba irányuló élt jelöl (az él kiinduló csúcsát szülőnek, végcsúcsát gyereknek szokták hívni), a $c: A \rightarrow R$ pedig az élekhez súlyt (a továbbiakban költséget) rendelő függvény. + }\\ + + {\footnotesize + \noindent A szokásoktól némileg eltérően itt feltételezzük, hogy az irányított gráfokban akár \textbf{végtelen sok csúcs} is lehet. Ez abból adódik, hogy a vizsgált feladatok problématerének mérete nagyon nagy, sőt esetenként valóban végtelen. Az informatikai megoldások szempontjából viszont nincs különbség a végtelen és a nagyon nagy méret között: az olyan algoritmusok úgysem használhatók, amelyek arra rendezkednek be, hogy megvizsgálják a teljes problémateret. + }\\ + + {\footnotesize + \noindent A fentiek természetes következménye, hogy gráfjainkban végtelen sok irányított él fordulhat elő. Kikötjük azonban azt, hogy egy csúcsból kivezető élek száma legyen véges, azaz mindegyik csúcsnak csak \textbf{véges sok gyereke} van. (Egy csúcshoz azonban tartozhat végtelen sok szülőcsúcs.) Ez a megszorítás nem jelent valódi korlátozást, mert a kivezető éleket általában a megoldandó feladathoz definiált műveleteket generálják. Egy adott pillanatban alkalmazható műveletek száma pedig egy valós feladat esetében mindig véges. Ráadásul a műveletek pozitív végrehajtási költséggel rendelkeznek – már ha egyáltalán számít a végrehajtási költségük –, és megfigyelhető, hogy a műveletek költségeinek infinuma is egy pozitív szám. Így azt is kiköthetjük, hogy az él-súlyozott irányított gráfjaink élsúlyai (élköltségei) egy, a teljes gráfra érvényes pozitív valós számnál nem kisebbek. Ezt a súlykorlátot gyakran szokták a görög $\delta$ betűvel jelölni, az általa leírt tulajdonságot pedig \textbf{$\delta$-tulajdonságnak} hívni. (Az élek súlyait egységesen egységnyinek tekintjük akkor, amikor a megoldandó feladatban semmilyen utalás sincs a költségekre.) + }\\ + + {\footnotesize + \noindent Egy végtelen sok csúcsból álló, de egy csúcshoz csak véges sok kivezető élt rendelő, $\delta$-tulajdonságú $(N,A,c)$ él-súlyozott irányított gráfot röviden \textbf{$\delta$-gráfnak} szoktunk nevezni. Egy útkeresési feladat egy $\delta$-gráfbeli bizonyos tulajdonságú irányított út megkeresését jelenti. + }\\ + + {\footnotesize + \noindent Egy $n \in N$ csúcsból $m \in N$ csúcsba vezető irányított úton egy $<(n,n_1), (n_1,n_2), \cdots , (n_{k-1},m)>$ él-sorozatot értünk. + }\\ + + {\footnotesize + \noindent Egy irányított út hosszán az utat alkotó élek számát értjük, és egy $\alpha$ út esetében az $\alpha$ szimbólummal jelöljük. Az $\alpha = <(n_0,n_1), (n_1,n_2), ... , (n_{k-1},n_k)>$ út költségét a $c\alpha(n_0,n_k)$, vagy röviden a $c(\alpha)$ szimbólum jelöli majd, amelyet – a hosszúság fogalmához illeszkedően – az utat alkotó élek költségeinek összegeként definiáljuk: + } + \[ + c(\alpha) = \sum_{i=1}^{k}c(n_{i-1},n_{i}) + \] + + {\footnotesize + \noindent A $\delta$-gráfokban, amennyiben vezet egy csúcsból ($n$) egy csúcshalmazba ($M$) út, akkor létezik ezek között legrövidebb út is, sőt legolcsóbb költségű, azaz optimális út is. + }\\ + + {\footnotesize + \noindent Bevezetjük a $c^{*}:N \times N \rightarrow R$ függvényt, amely egy $\delta$-gráfban megadja azt az optimális (legolcsóbb) költséget, amely árán egy csúcsból egy másikba el lehet jutni. Ezt mindegyik n és m csúcsra értelmezzük: ha létezik { $n \rightarrow m$ }-beli út, akkor ezek költségeinek minimumaként; ha nem létezik, akkor végtelen nagynak tekintjük. Formálisan: + } + \[ + c^{*}(n, m) = \left\{ \begin{array}{cc} + min_{\alpha \in {n \rightarrow m}}c(\alpha) & ha\ \exists n \rightarrow m \\ + \infty & ha\ \not\exists n \rightarrow m + \end{array} + \right. + \] + {\footnotesize + \noindent Egy útkeresési feladat modellezésekor az a célunk, hogy a feladat problématerét egy $\delta$-gráfbeli, adott csúcsból (startcsúcsból) induló irányított utak halmazaként fogalmazzuk meg, amelyek között olyan utat keresünk, amely adott csúcsok (célcsúcsok) egyikébe vezet. Gyakran az optimális út megtalálása a célunk. Ennek megfelelően egy útkeresési feladat \textbf{gráfreprezentációján} azt értjük, ha megadunk egy $(N,A,c)$ $\delta$-gráfot, az úgynevezett \textbf{reprezentációs gráfot}, kijelöljük annak $s \in N$ startcsúcsát és $T \subseteq N$ célcsúcsait. A feladat általánosan az, hogy egy $s \rightarrow T$-beli úgynevezett \textbf{megoldási utat} (vagy röviden megoldást) kell megtalálnunk, esetenként egy $s \rightarrow^{*}T$-beli \textbf{optimális megoldási utat} (az optimális megoldást).}\\ + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \section*{Állapottér-reprezentáció} + + \noindent Az állapottér reprezentáció egy általános probléma-modellezési módszer, amellyel részletesen specifikálhatjuk a megoldandó feladatot úgy, hogy azt útkeresési feladattá fogalmazzuk át. Ez által lehetővé válik, hogy a problémára úgy tekinthessünk, mint egy $\delta$-gráfbeli út keresésére.\\ + {\small \color{mygray}Mivel ennek során arról is döntünk, hogy a feladatból kinyert ismereteket milyen formában rögzítsük a számítógépen, ezért az állapottér specifikáció helyett az \emph{állapottér reprezentáció} szóhasználat terjedt el.}\\ + + \noindent Az állapottér reprezentációnak négy fő eleme van: + \begin{itemize} + \item \textit{Állapottér}: A probléma leírásához szükséges adatok által felvett érték-együttesek (állapotok) halmaza. Az állapot többnyire összetett szerkezetű érték (osztály vagy stuktúra). Gyakran egy bővebb alaphalmazzal és egy azon értelmezett invariáns állítással definiáljuk. + \item \textit{Műveletek}: A műveletek az állapottéren definiált, azaz állapothoz állapotot rendelő operátorok, amelyek értelmezési tartománya jelöli ki azt, hogy mely állapotokra hajthatók végre. Megadásukhoz szükséges az előfeltétel és hatás leírása, valamint az invariáns tartó leképezés. + \item \textit{Kezdőállapot(ok)} A feladat lehetséges kezdő állapotai megadhatóak közvetlenül, vagy közvetve egy logikai állítás (a kezdő feltétel) segítségével. A feladat egy konkrét kitűzéséhez mindig egy konkrét kezdő állapotot kell meghatároznunk. + \item \textit{Célállapot(ok)}. Egy adott kezdő állapothoz tartozó célállapot (vagy célállapotok) megadható közvetlenül, vagy közvetve egy logikai állítás segítségével. + \end{itemize} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } + + \noindent Az objektum elvű programozási paradigma értelmében a definíció első két pontja egy adattípust (egy osztályt) definiál. A műveletek (metódusok) az osztály egy objektumára hajthatóak végre, amelynek állapota ennek hatására megváltozik. A számítógépes megvalósításoknál az objektum kezdő állapotát a konstruktor, vagy egy speciális inicializáló metódus állítja be, a célfeltételt pedig egy logikai értéket visszaadó metódus ellenőrzi.}\\ + + {\footnotesize + \noindent Az állapottér reprezentáció lehetőséget teremt arra, hogy a megoldandó problémának elkészítsük a gráfreprezentációját, amelyben a probléma már nyilvánvalóan útkeresési feladattá válik. Minden állapottér reprezentációnak megfeleltethető egy irányított élsúlyozott gráf, amelyben kijelölhetünk egy startcsúcsot és egy vagy több célcsúcsot. Egy állapottér reprezentáció \textbf{állapot gráfjának} nevezzük azt a $\delta$-gráfot, amelyben a csúcsok az állapotokat, az élek a műveletek végrehajtásait, azaz az állapot-átmeneteket szimbolizálják, az élek súlyai a megfelelő műveletek költségei lesznek, ezek hiányában egységesen egységnyi az értékük. Az állapottér reprezentációval leírt feladat egy konkrét kitűzésében szereplő kezdőállapotot megjelenítő csúcsot hívjuk startcsúcsnak ($s$), kezdőállapothoz tartozó célállapot(ok)nak megfeleltetett csúcso(ka)t célcsúcs(ok)nak ($T$). (Vegyük észre, hogy a gráfreprezentáció önmagában nem egy külön feladat modellező módszer, hanem csak az eredménye egy probléma modellezésnek.) + }\\ + \newpage + {\footnotesize\noindent Példa: n-királynő probléma állapottér reprezentációja}\\ + + {\footnotesize + \noindent State = rec(board: Board, count : $\mathbb{N}$)\\\\ + Board=$\Big\{$ + \begin{itemize} + \item[] $a \in \{\includegraphics[width=0.0225\linewidth]{img/queen.png}, \boxtimes , \square\}^{n \times n}$, + \item[] $a.count \in [0 \ldots n]\ \wedge$ + \item[] $\forall i \in [1\ \ldots\ a.count]: Count(a,\ i)=1\ \wedge$ + \item[] $\forall i \in [a.count + 1\ \ldots\ n]: Count(a,\ i)=0$ + \end{itemize} $\Big\}$\\\\ + Move(column): $State \ \rightarrow\ State\qquad (column \in [1 \ldots n],\ act \in State)$\\ + IF $(act.count < n) \wedge (act.board[act.count + 1,\ column] \neq \boxtimes)$\\ + THEN\\ + $act.count := act.count+1\ :\ act.board[act.count,\ column] := \includegraphics[width=0.0225\linewidth]{img/queen.png}$\\ + $\forall i,\ j: $\\ + IF ($act.board[i,\ j].threatenBy(\includegraphics[width=0.0225\linewidth]{img/queen.png})\ \wedge\ (act.board[i,\ j]\ == \square)$\\ + THEN\\ + $act.board[i,\ j] := \boxtimes$ + } + \begin{figure}[H] + \centering + \includegraphics[width=0.48\linewidth]{img/four_queen_problem_sample.png} + \caption{A 4-királynő probléma állapot gráfja.} + \label{fig:fourqueen_sample} + \end{figure} + + \color{mygray} \subsubsection*{Állapottér modell - Állapot-gráf} + \renewcommand{\arraystretch}{2} + {\noindent \footnotesize \color{mygray} + \begin{tabular}{lcl} + \hline + \textbf{Állapottér modell} & & \textbf{Állapot-gráf} + \\ + \textit{ - állapot} & $\sim$ & \textit{csúcs} + \\ + \textit{ - művelet hatása egy állapotra} & $\sim$ & \textit{irányított él} + \\ + \textit{ - művelet költsége} & $\sim$ & \textit{él költsége} + \\ + \textit{ - kezdő állapot} & $\sim$ & \textit{startcsúcs} + \\ + \textit{ - célállapot} & $\sim$ & \textit{célcsúcs} + \\ + \textbf{Gráf-reprezentáció} & & \textit{állapotgráf, startcsúcs, célcsúcsok} + \\ + \textit{ - egy műveletsorozat hatása} & $\sim$ & \textit{irányított út} + \\ + \textit{ - megoldás} & $\sim$ & \textit{irányított út a startcsúcsból egy célcsúcsba} + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}}\\\\\\ + \noindent Egy feladat állapottér modellje és problématere között szoros kapcsolat áll fenn, de az állapottér nem azonos a problématérrel. A problématér elemeit (lehetséges megoldásokat) a gráf reprezentációbeli startcsúcsból induló különböző hosszúságú irányított utak szimbolizálják.\\ + {\footnotesize $\triangleleft$ \faLightbulbO} + + \section*{Kereső-rendszerek} + + Azok a kereső algoritmusok, amelyek egy reprezentációs gráfban ($\delta$-gráfban) keresnek $s \rightarrow T$-beli utat az alapvető különbségeik ellenére egy közös ősből származtathatóak. Ezt hívjuk \emph{kereső rendszernek}. + + \subsubsection*{\textit{Általános keresőrendszer} részei} + + \begin{itemize} + \item \textit{{Globális munkaterület}} (a keresés memóriája) + \item \textit{{Keresési szabályok}} (a memória tartalmát változtatják meg) + \item \textit{{Vezérlési stratégia}} (adott pillanatban alkalmas szabályt választ) + \begin{itemize} + \item \emph{Általános}: független a feladattól és annak modelljétől. + \begin{itemize} + {\small + \color{mygray} + \item nem módosítható + \item módosítható} + \end{itemize} + \item \emph{Modellfüggő}: nem függ a feladat ismereteitől, de épít a feladat modelljének általános elemeire. + \item \emph{Heurisztikus}: a feladattól származó, annak modelljében nem rögzített, a megoldást segítő ismeret, amelyet közvetlenül a vezérlési stratégiába építünk be az eredményesség és a hatékonyság javítása céljából. + \end{itemize} + \end{itemize} + + {\footnotesize + \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } + \begin{itemize} + \item \textit{{Globális munkaterület}} A globális munkaterület annak az információnak a tárolására szolgál, amelyet a rendszer a keresés során megszerez, és megőrzésre fontosnak ítél. Egy $\delta$-gráfban történő keresésnél ez a gráfnak az a startcsúcsból elérhető része, amelyet a keresés felfedezett és megjegyzett. Ez lehet csak egyetlen csúcs, esetleg annak környezete, lehet egy út, amelyik a startcsúcsból az aktuálisan vizsgált csúcsba vezet, de lehet egy ennél tágabb részgráf is. A globális munkaterület minden keresés esetén rendelkezik valamilyen kezdeti értékkel, amely általában a startcsúcs. Akkor terminál, ha a globális munkaterület kielégíti a terminálási feltételt, amely egy célcsúcsnak a globális munkaterületen való megjelenésével kapcsolatos. + \item \textit{{Keresési szabályok}}: A kereső rendszer minden lépésben egy kereső szabály által változtatja meg a globális munkaterületet. A kereső szabály tehát a munkaterület operátora. Minden szabály rendelkezik egy előfeltétellel (ez határozza meg a szabály értelmezési tartományát) és egy hatással (amelyet a végrehajtásakor kifejt). Egy $\delta$-gráfban folyó keresésnél ez például új csúcsra cserélheti a globális munkaterületen tárolt csúcsot, vagy új élt fűzhet hozzá a munkaterületen levő úthoz. + \item \textit{{Vezérlési stratégia}} Egy adott pillanatban több végrehajtható kereső szabály is lehet. A vezérlési vagy keresési stratégia feladata ezek közül egyet kiválasztani. Amíg a globális munkaterületen és a kereső szabályokban a megoldandó feladat reprezentációjában rögzített ismeretei jelennek meg, addig a vezérlési stratégia a reprezentációtól független összetevője a kereső rendszernek. A stratégia megválasztását természetesen befolyásolja a megoldandó feladat, és a feladat reprezentálásához választott módszer, de a konkrét feladat reprezentációja nincsen rá hatással. Ugyanakkor a vezérlési stratégia megválasztása kihat a kereső rendszer többi komponensére is.\\ + \end{itemize} + A vezérlési stratégia három szintre tagolható: + \begin{itemize} + \item Az \textbf{\emph{elsődleges vezérlési stratégia}} (általános) teljesen független a megoldandó feladattól. Ezen a szinten nem módosítható és módosítható stratégiákat különböztethetünk meg. Az előbbiek azok, amelyek alkalmazásakor egy kiválasztott kereső szabály végrehajtása végleges, vissza nem vonható; az utóbbi alkalmazása során ellenben lehetőségünk van korrigálásra. + \item A \textbf{\emph{másodlagos vezérlési stratégia}} (modelfüggő) a megoldandó feladattól független ugyan, de függ a feladat reprezentálásához választott modelltől. Mivel ebben a jegyzetben csak egyféle modell szerepel (az állapottér reprezentáció), amelyhez viszont nem kapcsolódik jellegzetes másodlagos vezérlési stratégia, ezért erre itt nem tudunk példát mutatni. + \item A MI feladatainál a problématér olyan nagy, hogy nem szerencsés, ha a feladatokat csupán "vak" kereséssel, minden lehetséges utat szisztematikusan végig próbálva kíséreljük meg megoldani. Az ilyen módszer általában kombinatorikus robbanáshoz, azaz kezelhetetlenül nagy adattömeghez vezet. Egy keresés csak akkor lehet sikeres, ha a vezérlési stratégiájába olyan – a feladatból származó többlet – ismeretet épít be, amely korlátozni képes keresést úgy, hogy a lehetséges folytatások közül csak ígéretesekkel foglalkozzon. Ez a speciális vezérlési ismeret, az úgynevezett \emph{\textbf{heurisztika}}, a vezérlési stratégiák harmadik szintje. E nélkül a feladat megoldása még a mai számítógépek működési sebessége és memória kapacitása mellett is reménytelen.\\ + + Megkülönböztetjük tehát a feladattal kapcsolatos ismereteket aszerint, hogy azokat a reprezentációban deklaratív módon (azaz a globális munkaterületen) illetve procedurális módon (a kereső szabályokban) használjuk-e fel, vagy vezérlési ismeretként a stratégiát javítjuk-e általa. A heurisztikára úgy tekintünk, mint a feladattal kapcsolatos olyan információra, amit nem a reprezentációban rögzítünk, hanem közvetlenül az algoritmusba építünk be. A heurisztika feladata, hogy pontosítsa azt alkalmazható kereső szabályok közötti sorrendet, amelyet elsődlegesen, a feladattól függetlenül a vezérlés jelöl ki. A heurisztika a vezérlési stratégia finomítását, a mindenkori feladatra történő ráhangolását végzi.\\ + + A heurisztika alkalmazásától azt várjuk, hogy javítsa a keresés eredményességét, azaz találjon megoldást, esetleg jó minőségű megoldást, továbbá javítsa a keresés hatékonyságát. A heurisztikát alkalmazó keresések tulajdonságait az alábbiak szerint fogalmazhatjuk meg: + \begin{itemize} + \item a legtöbb esetben "elég jó" megoldást találnak, bár nem garantálnak optimális megoldást, sőt valójában semmiféle megoldást nem garantálnak. + \item jelentős mértékben javítják a problémamegoldó program hatékonyságát, főként a keresés próbálkozásai számának csökkentésével. + \end{itemize} + \end{itemize} + $\triangleleft$ \faLightbulbO} + + \subsection*{Lokális keresés} + + \begin{itemize} + \item A lokális keresések egyetlen aktuális csúcsot és annak szűk környezetét tárolják a globális munkaterületen. + \begin{itemize} + {\small + \color{mygray} + \item Kezdetben az aktuális csúcs a startcsúcs, és a keresés akkor áll le, ha az aktuális csúcs a célcsúcs lesz, vagy ha nem tud továbblépni.} + \end{itemize} + \item Keresési szabályai az aktuális csúcsot minden lépésben a szomszédjai közül vett lehetőleg ,,jobb” gyerekcsúccsal cserélik le. + \item A vezérlési stratégiájuk a ,,jobbság” eldöntéséhez egy \textit{rátermettségi függvényt} használ, amely annál jobb értéket ad egy csúcsra, minél közelebb esik az a célhoz. + \begin{itemize} + \item Ez egy \textit{nem-módosítható vezérlési stratégia}, mivel a keresés ,,elfelejti”, hogy honnan jött, így a döntések nem vonhatók vissza. + \end{itemize} + \end{itemize} + \emph{Lokális kereséssel megoldható feladatok} azok, ahol egy lokálisan hozott rossz döntés nem zárja ki a cél megtalálását. Ehhez vagy egy erősen összefüggő reprezentációs-gráf, vagy jó heurisztikára épített + célfüggvény kell. Jellemző alkalmazás: Adott tulajdonságú elem keresése, vagy például függvény optimumának keresése.\\ + + {\footnotesize + \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } + + {\footnotesize + \noindent A lokális keresések úgy próbálnak megoldási utat találni egy reprezentációs gráfban, hogy a keresés során a gráfnak csak egy csúcsát (az úgynevezett aktuális csúcsot) és annak környezetét (például a gyerekeit, szülőjét, esetleg visszamenőleg néhány ősét) ismerik. Ezen korlátozott ismeretek alapján döntenek arról, hogy az aktuális csúcsot annak melyik gyerekére cseréljék le. Ennek kiválasztásához nélkülözhetetlen egy heurisztikus függvény, az úgynevezett célfüggvény. Ez az aktuális csúcs gyerekeihez rendel olyan értékeket, amelyek alapján eldönthetjük, hogy melyik a legígéretesebbnek látszó gyerekcsúcs. + }\\ + + {\footnotesize + \noindent A lokális keresések nem-módosítható vezérlési stratégiát használó kereső rendszerek. Globális munkaterületükön az aktuális csúcsot (kezdetben a startcsúcsot) és annak környezetében levő csúcsokat tárolják. Kereső szabályaik az aktuális csúcsot cserélik annak környezetéből vett másik csúcsra (többnyire valamelyik gyerekére) és ezzel egyidejűleg módosítják az aktuális csúcs környezetéről nyilvántartott ismereteket. Több lehetőség esetén az adott pillanatban lehető legjobbnak látszó csúcsot választják új aktuális csúcsnak, azaz egyfajta mohó stratégiát követnek. A továbblépésnél hozott döntéseik visszavonhatatlanok (nem módosíthatóak), nem áll módjukban a döntéseiket meg nem történtté tenni, és új döntést hozni. Sikeres terminálás (azaz célcsúcs elérése) esetén nem képesek a megoldási utat visszaadni, csak ha működésük közben folyamatosan naplózzák (rögzítik) azt, hogy mely csúcsokat érintették a keresés során. + }\\ + + {\footnotesize + \noindent A lokális keresések csak speciális esetekben alkalmazhatók sikerrel az MI feladatok megoldására. Vagy a döntéseknél felhasznált célfüggvénynek, a heurisztikának kell elég erősnek lennie ahhoz, hogy csalhatatlanul a megfelelő irányba vezesse a keresést, vagy a reprezentációs gráfnak kell olyan alakúnak lenni, hogy egy-egy rossz döntés ne veszélyeztesse a célcsúcs elérését. Heurisztika ez utóbbi esetben is szükséges ahhoz, hogy a keresés eredményes és gyors legyen. + }\\ + + {\footnotesize + \noindent A lokális keresés alkalmazása kifejezetten előnytelen akkor, ha a reprezentációs gráf egy irányított fa (lásd n-királynő probléma vagy utazó ügynök probléma), mert kizárólag tökéletes heurisztikájú célfüggvény esetén lehet sikeres. + }\\ + $\triangleleft$ \faLightbulbO} + + \subsubsection*{Lokális keresést megvalósító algoritmusok} + + \begin{itemize} + \item \textit{\textbf{Hegymászó algoritmus}}: A legyegyszerűbb lokális keresési algoritmus. + \begin{itemize} + \item A \emph{globális munkaterületén} nyilvántartja: + \begin{itemize} + \item az aktuális csúcsot ($akt$), és + \item az $akt$ csúcs szülőjét $\pi(akt)$ + \end{itemize} + \item A keresési szabálya: + \begin{itemize} + \item előállítja az $akt$ csúcs gyermek csúcsait, + \item a cél elérése szempontjából leígéretesebb csúcsra lép, kizárva a szülő való visszalépést.\\ + (Az algoritmusban feltételezzük azt, hogy egy csúcs annál ígéretesebb, minél kisebb annak célfüggvény ($f$) értéke.) + \end{itemize} + \item \emph{Hátrányai}: + \begin{itemize} + {\small + \item Csak erős heurisztika esetén lesz sikeres, ennek hiányában gyakorta rossz, nem a cél irányába mutató döntést fog hozni, amely következtében akár véglegesen tévútra kerülhet. Általában egy reprezentációs gráf tartalmazhat olyan részeket, ahonnan már nem vezet út célcsúcsba. Ha a heurisztika ilyen helyre navigálja a keresést, akkor az már nem lehet eredményes. A hegymászó módszer tehát nem garantálja a megoldás megtalálását. + \item A módszer lokális optimum hely környezetében és ekvidisztans felületen (azonos célfüggvény értékű szomszédos csúcsok körzetében) eltévedhet. A keresést ugyanis ilyenkor nem irányítja a célfüggvény, véletlenszerűen kell új aktuális csúcsot választani, és mivel a keresés nem végezhet körfigyelést (nem tárolja a korábban bejárt csúcsokat) könnyen végtelen ciklusba eshet. + \item A keresés zsákutcába (olyan csúcs, amelynek nincsenek gyerekei) jutva beragad. + }\\ + \end{itemize} + \end{itemize} + \newpage + \item \textit{\textbf{Tabu keresés}}: Algoritmus a hegymászó algoritmus kis memóriájából származó hátrányok kiküszöbölésére. + \begin{itemize} + \item A \emph{globális munkaterületén} nyilvántartja: + \begin{itemize} + \item az aktuális csúcsot ($akt$), és + \item az eddig legjobbnak bizonyult csúcsot ($opt$), és + \item az utolsó néhány érintett csúcsot; ez a (sor tulajdonságú) tabu halmaz. + \end{itemize} + \item A keresési szabálya: + \begin{itemize} + \item minden lépésben az aktuális csúcs legjobb gyermekére lép, ami nincs a tabu halmazban, majd + \item frissíti a tabu halmazt, és ha $akt$ jobb, mint az $opt$, akkor $opt$-ot lecseréli $akt$-re. + \end{itemize} + \item \emph{Hátrányai}: + \begin{itemize} + \item A keresés zsákutcába (egy olyan csúcshoz, amelynek nincsenek gyerekei) jutva beragadhat. + \item A tabu halmaz segítéségével felismeri a tabu halmaz méreténél nem nagyobb köröket. Azonban a tabu halmaz méreténél nagyobb körök mentén végtelen ciklusba kerülhet.\\ + \end{itemize} + \end{itemize} + \item \textit{\textbf{Szimulált hűtés} algoritmusa}: Algoritmus a hegymászó-algoritmus móhoságának csillapítására. + \begin{itemize} + \item A keresési szabály a következő csúcsot véletlenszerűen választja ki az aktuális \emph{akt} csúcs gyermekei közül. + \item Ha az így kiválasztott új csúcs kiértékelő függvény-értéke nem rosszabb, mint az \emph{akt} csúcsé (itt $f(\text{új}) \leq f(\text{akt})$), akkor elfogadjuk aktuális csúcsnak. + \item Ha az új csúcs függvényértéke rosszabb (itt $f(\text{új}) > f(\text{akt})$), akkor egy olyan véletlenített módszert alkalmazunk, ahol az újcsúcs elfogadásának valószínűsége fordítottan arányos az $\mid f(\text{akt}) - f(\text{új}) \mid$ különbséggel: + \begin{center} + $e^{\frac{f(\text{akt}) - f(\text{új})}{T}} > random[0,1]$ + \end{center} + \item Ha a $T$ értékét a keresés során csökkentjük, akkor ugyanazon különbség esetén eltérő lehet egy új csúcs elfogadásának valószínűsége. A $T$ értékeinek változásához egy ütemtervet szoktak készíteni, amely egyrészt a $T$ által felvett $T_1, T_2, \ldots\ $értékek szigorúan monoton csökkenő sorozatát tartalmazza, másrészt azt az $L1,\ L2, \ldots $ egész számsorozatot, amely azt szabályozza, hogy a $T_k$ együtthatót $L_k$ lépésen $(k=1,\ 2, \ldots)$ keresztül kell majd használni. Ha $T_1,T_2, ...$ szigorúan monoton csökken, akkor egy ugyanannyival rosszabb függvényértékű új csúcsot kezdetben nagyobb valószínűséggel fogad el a keresés, mint később. + \begin{center} + $e^{\frac{f(\text{akt}) - f(\text{új})}{T_k}} > random[0,1]$ + \end{center} + \end{itemize} + \end{itemize} + + \subsection*{Visszalépéses keresések} + + A visszalépéses keresés egy olyan keresőrendszer, amelynek + \begin{itemize} + \item A \emph{globális munkaterületén} nyilvántartja: + \begin{itemize} + \item Az utat a startcsúcsból az aktuális csúcsba (az útról leágazó még ki nem próbált élekkel együtt). + \begin{itemize} + \small + \color{mygray} + \item Kezdetben a startcsúcsot tartalmazó nulla hosszúságú út. + \item \emph{Terminálás feltétel}: célcsúcs elérése vagy a startcsúcsból való visszalépés. + \end{itemize} + \end{itemize} + \item A keresési szabálya: + \begin{itemize} + \item a nyilvántartott út végéhez egy új (ki nem próbált) élt fűznek, vagy + \item a törlik a legutolsó élt (visszalépés szabálya). + \end{itemize} + \item A vezérlési stratégiája a visszalépés szabályát csak a legvégső esetben alkalmazza, amikor már nem lehet továbblépni. + \begin{itemize} + \item A visszalépéses keresés módszeresen végigvizsgálja a reprezentációs gráf startcsúcsból kivezető útjait. Ha egy útról kiderül, hogy nem vezet célba, akkor onnan visszalép. Egy-egy utat tehát olyan mélyen tár fel a keresés, amennyire csak lehet, azaz a mélységi bejárás stratégiáját követi. + \item \emph{A visszalépés feltételei}: + \begin{itemize} + \item Az aktuális csúcsból egyáltalán nem vezet ki él, azaz a keresés \textbf{\emph{zsákutcába}} jutott. + \item Az aktuális csúcsból kivezető összes útról kiderült, hogy nem vezet célba, tehát nincs a csúcsból kivezető még ki nem próbált él, akkor egy \textbf{\emph{zsákutca torkolatban}} állunk. + \item \textbf{\emph{Körre}} futunk, azaz az aktuális út egy olyan csúcsba vezet, amely korábban már szerepel az aktuális úton. + \item Az aktuális út hossza egy előre olyan megadott \textbf{\emph{mélységi korláton}} nőne túl, amelyet abból a célból vezetünk be, hogy a nagyon hosszú utakat ne vizsgálja meg a keresés, mert vagy nincs elég időnk vagy nincs elég memóriánk erre. + \end{itemize} + \end{itemize} + \end{itemize} + + \subsubsection*{Alacsonyabb rendű vezérlési stratégiák} + + \noindent A visszalépéses keresés több pontján alkalmazhatunk heurisztikát. A mélységi korlát is egyfajta heurisztika, hiszen megfelelő meghatározásához a konkrét feladat ismerete szükséges. A mélységi korlát figyelésével \emph{\textbf{vágásokat}} végzünk a probléma térben, mert használata bizonyos csúcsokból kivezető éleket kitöröl, ennél fogva kitöröl a problématérből több startcsúcsból kiinduló utat. Ehhez hasonló vágásokhoz összetettebb feltételeket is meg fogalmazhatunk. Sőt egy ilyen feltételt leíró \emph{\textbf{vágó heurisztika}} egyenként is megjelölheti azt, hogy egy csúcsból kivezető élek közül melyiket hagyja figyelmen kívül a keresés, melyiket nem.\\ + + \noindent A vágások megadásán kívül azzal is javíthatjuk a keresés hatékonyságát, ha egy úgynevezett \emph{\textbf{sorrendi heurisztikával}} jelöljük ki egy adott csúcsból kivezető élek kipróbálási sorrendjét. + + \subsubsection*{Viszzalépéses keresést megvalósító algoritmusok} + + \noindent Amikor a visszalépés feltételei közül csak az első kettőt építjük be a kereső rendszerbe, akkor a visszalépéses keresés első változatáról (\textbf{VL1}) beszélünk.\\ + + \noindent \textbf{Tétel.} A visszalépéses keresés első változata véges körmentes gráfokon mindig terminál, és ha létezik megoldás, akkor megtalálja azt.\\ + + \noindent A tétel azokat a körülményeket rögzíti, amelyek fennállása esetén a \emph{VL1} eredményes. Jó eredménynek számít, hogy a keresés biztosan terminál, és megoldást talál, ha van megoldás. Megjegyezzük, hogy ez az egyetlen olyan tételünk, amelyhez nincs szükség arra, hogy a gráf, amelyben keresünk, $\delta$-gráf legyen. A \emph{VL1} memória igénye kicsi, mindössze egy út tárolására van szüksége. Futási idejét sorrendi illetve vágó heurisztikával lehet gyorsítani.\\ + + \noindent A \emph{VL1} algoritmust sikerrel alkalmazhatjuk azokra a feladatokra, amelyek reprezentációs gráfja egy véges irányított fa. Az utazó ügynök probléma megoldására viszont nem alkalmazható a \emph{VL1} annak ellenére, hogy a reprezentációs gráfja egy fa, hiszen ott egy megoldást adni egyszerű, de nekünk optimális megoldást kellene találni.\\ + + {\footnotesize + \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } + + \noindent Kört is tartalmazó vagy végtelen nagy gráfokban a keresés könnyen ráfuthat egy célcsúcsot nem tartalmazó végtelen hosszú útra. Ezt egy mélységi korlát bevezetésével zárhatjuk ki. Ha a nyilvántartott út hossza eléri a mélységi korlátot, akkor visszalépünk. Ennek következtében a megadott korlátnál hosszabb utakat nem vizsgálja tovább az algoritmus, csak a legfeljebb ilyen hosszú utak között keresi a megoldást. Ha nincs a megadott mélységi korláton belül megoldási út, akkor az algoritmus bár terminál, de nem talál megoldást. A mélységi korlát megállapítása tehát nagy körültekintést igényel, célszerű a megoldandó feladat ismereteit felhasználni hozzá.}\\ + + {\footnotesize + \noindent A mélységi korlát körök esetén is biztosítja a terminálást. Ha azonban a megadott mélységi korlátnál jóval rövidebb körök is előfordulnak a gráfban, érdemes külön körfigyelést is beépíteni a keresésbe. Ez annyit jelent, hogy visszalépünk akkor is, ha olyan csúcsba jutottunk el, amely már szerepel az adatbázisban nyilvántartott úton. Megjegyezzük, hogy a mélységi korlát ellenőrzése jóval olcsóbb, mint a körfigyelés.\\ + $\triangleleft$ \faLightbulbO + }\\ + + \noindent Amikor a visszalépés feltételei közül az összest megvalósítjuk, akkor beszélünk a visszalépéses keresés második változatáról (\textbf{VL2}).\\ + + \noindent \textbf{Tétel.} A visszalépéses keresés második változata $\delta$-gráfokon mindig terminál, és ha létezik a mélységi korlátnál nem hosszabb megoldás, akkor talál egyet.\\ + + \noindent A 8-as kirakó játék reprezentációs gráfja köröket is tartalmaz, ezért ezt a feladatot a visszalépéses keresésnek csak a második változatával oldhatjuk meg. + + \subsubsection*{Visszalépéses keresés értékelése} + + \noindent Könnyen implementálható, kicsi memória igényű, mindig terminál, és ha van (a mélységi korlát alatt), akkor talál megoldást. De nem garantál optimális megoldást, egy kezdetben hozott rossz döntést csak nagyon sok lépés után képes korrigálni és egy zsákutca-szakaszt többször is bejárhat, ha abba többféle úton is el lehet jutni.\\ + + {\footnotesize + \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } + \noindent A visszalépéses keresés szerepe jelentős az MI rendszerekben. Ilyen keresést tartalmaznak többek között a szabályalapú szakértő rendszerek következtető gépei, erre épülnek a Prolog interpreterek vagy a kétszemélyes játékok programjaiban használt alfa-béta algoritmus.\\ + + \noindent Ennek az oka a visszalépéses keresés előnyös tulajdonságaiban keresendők. A visszalépéses keresés egy könnyen implementálható, kicsi memória igényű algoritmus, amely garantált eredményt ad. A könnyen implementálhatóság az algoritmus viszonylagos egyszerűségéből fakad. A működéséhez igényelt memória a még oly nagy problématerekben való kereséseknél is mindössze egy út méretével arányos, amelynek a maximális hosszát a mélységi korláttal szabályozhatjuk. Eredménye pedig azért garantált, mert egyrészt biztosan terminál, másrészt, ha van megoldás (mélységi korlát alkalmazása esetén ennél nem hosszabb megoldás), akkor talál megoldást.\\ + + \noindent Természetesen, mint minden keresésnek, ennek is vannak hátrányos tulajdonságai. Például nem garantálja az optimális megoldás előállítását. Lehet ugyan egy egyre növekvő mélységi korlát mellett iterációba szervezni visszalépéses algoritmust, amely már képes az optimális megoldás megtalálására a futási idő növekedése árán. A visszalépéses keresés másik hátránya az, hogy egy korai lépésnél elkövetett hibás döntést csak igen sok próbálkozás árán, sok visszalépés után képes korrigálni. Ennek ellensúlyozására lehet ugyan alkalmazni az úgynevezett visszaugrásos keresést, de ez csak speciális feladatok esetében működik. A visszaugráshoz ugyanis fel kell tudnunk ismerni, hogy a reprezentációs gráf olyan részében jár a keresés, ahol nincs remény a cél megtalálására, és meg kell tudnunk mondani, hogy az aktuális út melyik csúcsához érdemes visszaugrani, hogy onnan másik irányba haladva folytassuk a keresést.\\ + + \noindent A visszalépéses keresés hátránya az is, hogy mivel csak az aktuális utat tartja nyilván, azokat a csúcsokat, ahol a keresés már járt, de ahonnan visszalépett, \emph{elfelejti}. Ha a keresés egy ilyen elfelejtett csúcshoz később egy más irányból újra eljut, akkor újra be fogja járni az abból továbbvezető utakat, annak ellenére, hogy ezekről már korábban kiderült, hogy nem vezetnek célcsúcshoz. A két utóbbi hátrány az oka annak, hogy a visszalépéses keresés futási ideje nagy, legrosszabb esetben a problématérrel összemérhető, és ez csak megfelelő heurisztikák alkalmazása mellett javítható.\\ + $\triangleleft$ \faLightbulbO} + + \section*{Gráfkeresések} + + \noindent A gráfkeresés olyan keresőrendszer, amelynek + \begin{itemize} + \item \emph{globális munkaterülete}: \emph{startcsúcsból kiinduló már feltárt útjai} a reprezentációs gráfnak (\textbf{\emph{keresőgráf}}), külön megjelölve az utak azon csúcsait, amelyeknek még nem (vagy nem eléggé jól) ismerjük a rákövetkezőit. Ezek a \textit{nyílt csúcsok}. + \begin{itemize} + \item \emph{kiinduló értéke}: a startcsúcs, + \item \emph{terminálási feltétel}: célcsúcsot terjeszt ki vagy már nincs több nyílt csúcs. + \end{itemize} + \item \emph{keresési szabálya}: egy nyílt csúcs kiterjesztése + \item \emph{vezérlési stratégiája}: a legkedvezőbb csúcs kiterjesztésére törekszik, és ehhez egy ($f$) kiértékelő függvényt használ. Mivel egy nyílt csúcs, amely egy adott pillanatban nem kerül kiválasztásra, később még kiválasztódhat, ezért itt egy módosítható vezérlési stratégia valósul meg. + \end{itemize} + + \noindent A keresés minden csúcshoz nyilvántart + \begin{itemize} + \item egy odavezető utat {\small (\textbf{$\pi$} visszamutató pointerek segítségével)}, valamint + \item az út költségét ($g$). + \end{itemize} + \noindent Ezeket az értékeket működés közben alakítja ki, amikor \emph{a csúcsot először felfedezi} vagy később egy \emph{olcsóbb utat talál} hozzá. Mindkét esetben (amikor módosultak a csúcs ezen értékei) \emph{a csúcs nyílttá válik}. Amikor egy már korábban kiterjesztett csúcs újra nyílt lesz, akkor a már korábban felfedezett leszármazottainál a visszafelé mutató pointerekkel kijelölt út költsége nem feltétlenül egyezik majd meg a nyilvántartott $g$ értékkel, és az sem biztos, hogy ezek az értékek az eddig talált legolcsóbb útra vonatkoznak, vagyis előfordulhat, hogy elromlik a keresőgráf korrektsége. + + {\footnotesize + \noindent Példa:\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/incorrect_g1} + \caption{Gráf korrektségének elromlása 1.} + \label{fig:incorrect_gone} + \end{figure} + + \noindent Elindulunk az $s$ startcsúcsból. Tekintve, hogy a gráfkeresés nem terjeszt ki rosszabb csúcsot, így az $s \rightarrow m \rightarrow k$ úton a $k$ csúcsot már nem terjeszti ki, mert $\pi(m)=s$ esetén $g(v) = 6 > 5 \ \textit{(eddig talált legrövidebb út)}$.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/incorrect_g2} + \caption{Gráf korrektségének elromlása 2.} + \label{fig:incorrect_gtwo} + \end{figure} + + \noindent A $\pi(m) = n$ esetén a $g(m)=2$ azonban a gráf korrektsége nem megfelelő, mivel a korábban eltárolt $g(v)=5$ és $g(k)=5$ értékek már nem helyesek. + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/incorrect_g3} + \caption{Gráf korrektségének elromlása 3.} + \label{fig:incorrect_gthree} + \end{figure} + + \newpage + \section*{Nevezetes gráfkereső algoritmusok} + + \newcolumntype{L}{>{\arraybackslash}m{7cm}} + + \subsection*{Nem informált gráfkereső algoritmusok} + + \noindent Azokat a keresőket, melyek az aktuális állapotról csak annyit tudnak, hogy célállapot-e, nem informált keresési algoritmusoknak nevezzük.\\ + {\small + \renewcommand{\arraystretch}{2} + \begin{tabular}{ l|c|L } + \makecell{\\{\footnotesize \textit{\textbf{Mélységi gráfkeresés}}}\\\\\adjincludegraphics[valign=M,width=0.4\textwidth]{img/melysegi_graf_ker}\\ {\footnotesize {\color{white}$\triangle$}}} & \makecell{$f = -g$ \\ $\forall (n,m)$ élre\\$c(n,m)=1$} & + \begin{tabular}[c]{L} + - végtelen gráfokban csak mélységi korláttal garantál megoldást\\ + - {\scriptsize {\color{blue} \faLightbulbO\ $\triangleright$} a vizsgált reprezentációs gráf minden élének súlyát egységnyinek tekinti, és a kiértékelő függvénye az egyes csúcsokba vezető útköltségnek, az algoritmus által számolt g függvény értékének mínusz egyszerese, azaz f = –g. Egységnyi élsúlyok esetén a g költségfüggvény egy csúcsban a startcsúcsból odavezető már megtalált út hosszúságát mutatja, így a –g kiértékelés mindig a startcsúcstól legtávolabb eső, a legmélyebben fekvő nyílt csúcs kiterjesztését részesíti előnyben. (Azonos mélységű csúcsok esetén véletlenszerűen, vagy valamilyen másodlagos szempont alapján dönt.) Ezt a keresést gyakran egy mélységi korláttal is ellátják, így ha létezik a mélységi korlátnál nem hosszabb megoldási út, akkor a keresés megoldás megtalálásával terminál.$\triangleleft$ \faLightbulbO} + \end{tabular} + \\ \hline + \makecell{\\{\footnotesize \textit{\textbf{Szélességi gráfkeresés}}}\\\\\adjincludegraphics[valign=M,width=0.4\textwidth]{img/szelessegi_graf_ker}\\ {\footnotesize {\color{white}$\triangle$}}} & \makecell{$f = g$\\$c(n,m)=1$} & + \begin{tabular}[c]{L} + - optimális megoldást ad, ha van (még végtelen $\delta$ gráfban is)\\ + - egy csúcs kiterjesztésekor ismeri az odavezető legrövidebb utat (legfeljebb egyszer terjeszt ki) + \end{tabular} \\ \hline + \makecell{\\{\footnotesize \textit{\textbf{Egyenletes gráfkeresés}}}\\} & $f = g$ & + \begin{tabular}[c]{@{}L@{}} + - optimális (legolcsóbb) megoldást ad, ha van (még végtelen $\delta$ gráfban is)\\ + - egy csúcs kiterjesztésekor ismeri az odavezető legolcsóbb utat (legfeljebb egyszer terjeszt ki)\\ + \end{tabular}\\ + \end{tabular} + \renewcommand{\arraystretch}{1}} + + \subsection*{Heurisztikus gráfkereső algoritmusok} + + \noindent Az MI problémák szempontjából azok a kiértékelő függvények az érdekesek, amellyek egy nyílt csúcs ígéretességének megítélésekor heurisztikus ismeretekre is támaszkodnak. A heurisztika a gráfkereső algoritmusoknál olyan függvény formájában fogalmazható meg, amelyik minden csúcsra megbecsüli annak a legolcsóbb útnak a költségét, amelyen az adott csúcsból célcsúcsba lehet eljutni. \emph{\textbf{Heurisztikus függvény}}nek nevezzük azt a $h:N \rightarrow \R$ függvényt, amelyik egy csúcsnál megbecsüli a csúcsból a célba vezető (,,hátralévő”) optimális út költségét. + \begin{center} + $h(n) \approx h^{*}(n)$, ahol $h^{*}:N \rightarrow \R$ + \end{center} + A $h^{*}$ egy \emph{elméleti} költségfüggvény a hátralévő optimális költség $n$-ből a célcsúcsok valamelyikébe.\\\\ + \noindent \emph{Nevezetes tulajdonságai}:\\\\ + \renewcommand{\arraystretch}{2} + \begin{tabular}{l|l|l} + \textit{{Nem-negatív}} & $h(n) \geqq 0$ & $\forall n \in N$ + \\ \hline + \textit{{Megengedhető}} & $h(n) \leqq h^{*}(n)$ & $\forall n \in N$ {\small \text{(nem becsüli túl az optimális költséget ($h^{*}$))}} + \\ \hline + \textit{{Monoton megszorítás}} & $h(n)-h(m) \leqq c(n,m)$ & $\forall (n,m) \in A$ + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent \textbf{Definíció.} Egy gráfkereső algoritmus kiértékelő függvényét \emph{csökkenőnek} nevezzük akkor, ha egy nyílt csúcs kiértékelő függvényértéke csak akkor változik meg és akkor is csak csökken, ha az eddiginél olcsóbb utat találunk hozzá.\\ + + \noindent \textbf{Tétel}. Egy csökkenő kiértékelő függvényt használó GK soha nem terjeszt inkorrekt csúcsot.\\ + \newpage + \noindent \textbf{Heurisztikus keresést használó algoritmusok}\\ + \renewcommand{\arraystretch}{2} + \begin{tabular}{ l|c|L } + \textit{Előre tekintő gráfkeresés} & $f = h$ & + \begin{tabular}[c]{@{}L@{}} + - sikeres terminálást nem garantál\\ + - eredményessége és hatékonysága erősen függ a heurisztikus függvénytől + \end{tabular} + \\ \hline + \textit{\textbf{A} algoritmus} & \makecell{$f = g+h$\\ $h \geq 0$} & - megoldást ad, ha van + \\ \hline + \textit{\textbf{A}* algoritmus} & \makecell{$f = g+h$\\ $h^* \geqq h \geq 0$} & - optimális megoldást ad, ha van + \\ \hline + \textit{\textbf{A}$^C$ algoritmus} & \makecell{$f = g+h$\\ $h^* \geq h \geq 0$\\\\ $\forall (n,m)$ élre\\ $h(n)-h(m) \leq c(n,m)$} & + \begin{tabular}[c]{@{}L@{}} + - optimális megoldást ad, ha van\\ + - {\scriptsize {\color{blue} \faLightbulbO\ $\triangleright$} A monoton tulajdonság a heurisztikus függvény által adott becslés következetességére utal. Ilyenkor ugyanis nem fordulhat elő az, hogy a heurisztika rossznak látná a cél elérésének esélyét egy olyan csúcsból, amelynek kis költségű lépéssel elért utódcsúcsából már hirtelen igen ígéretesnek tartana $\triangleleft$ \faLightbulbO}\\ + - egy csúcs kiterjesztésekor ismeri az odavezető legolcsóbb utat\\ + - legfeljebb egyszer terjeszt ki + \end{tabular} + \\ \hline + \textit{\textbf{B} algoritmus} & \makecell{$f = g+h$\\ $h \geq 0$ \\ + belső kiértékelő függvény $g$} & - a $g$-t használjuk a kiterjesztendő csúcs kiválasztására azon nyílt csúcsok közül, amelyek $f$ értéke kisebb, mint az eddig kiterjesztett csúcsok $f$ értékeinek maximuma.\\ + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent Véges $\delta$-gráfokon minden gráfkeresés terminál, és ha van megoldás, talál egyet. A nevezetes gráfkeresések többsége végtelen nagy gráfokon is találnak megoldást, ha van megoldás. (Kivétel az előre-tekintő keresés és a mélységi korlátot nem használó mélységi gráfkeresés.)\\ + + \noindent Egy gráfkeresés memória igényét a kiterjesztett csúcsok számával, futási idejét ezek kiterjesztéseinek számával mérjük. (Egy csúcs általában többször is kiterjesztődhet, de $\delta$-gráfokban csak véges sokszor.)\\ + + \noindent $A$* algoritmusnál a futási idő legrosszabb esetben exponenciálisan függ a kiterjesztett csúcsok számától, de ha olyan heurisztikát választunk, amelyre már $A^C$ algoritmust kapunk, akkor a futási idő lineáris lesz. Persze ezzel a másik heurisztikával változik a kiterjesztett csúcsok száma is, így nem biztos, hogy egy $A^C$ algoritmus ugyanazon a gráfon összességében kevesebb kiterjesztést végez, mint egy csúcsot többször is kiterjesztő A* algoritmus.\\ + + \noindent A $B$ algoritmust tehát mindig érdemes az $A^*$ algoritmus helyett alkalmazni, ha a heurisztikánk nem monoton, mert a megvalósítása alig tér el az $A^*$ algoritmustól, eredményessége és memória igénye azonos vele, de a futási ideje jóval gyorsabb is lehet, lassabb viszont soha. +\newpage + \section*{Kétszemélyes (teljes információjú, zéró összegű, véges) játékok} + + \noindent Egy játék leírásához a következőket kell megadni: + \begin{itemize} + \item A játék lehetséges állásait (helyzeteit). + \item A játékosok számát. + \item Hogyan következnek/lépnek az egyes játékosok (pl. egy időben vagy felváltva egymás után). + \item Egy-egy állásban a játékosoknak milyen lehetséges lépései (lehetőségei) vannak. + \item A játékosok milyen -- a játékkal kapcsolatos -- információval rendelkeznek a játék folyamán. + \item Van-e a véletlennek szerepe a játékban és hol. + \item Milyen állásban kezdődik és mikor ér véget a játék. + \item Az egyes játékosok mikor, mennyit nyernek, illetve veszítenek. + \end{itemize} + + \subsubsection*{Osztályozás} + + \begin{itemize} + \item A játékosok száma szerint: pl. egy-, két-, \emph{\textbf{n-személyes}} játékok. + \item Ha a játszma állásból állásba vivő lépések sorozata \emph{\textbf{diszkrét}} a játék. + \item Ha az állásokban véges sok lehetséges lépése van minden játékosnak és a játszmák véges sok lépés után véget érnek \emph{\textbf{véges}} a játék. + \item Ha a játékosok a játékkal kapcsolatos összes információval rendelkeznek a játék folyamán,\\ + \emph{\textbf{teljes információjú}} a játék. + \item Ha nincs a véletlennek szerepe a játékban, \emph{\textbf{determinisztikus}} a játék. + \item A játékosok nyereségeinek és veszteségeinek összege 0, akkor \emph{\textbf{zérusösszegű}} a játék.\\ + \end{itemize} + + \noindent A továbbiakban játék alatt kétszemélyes, diszkrét, véges, teljes információjú, determinisztikus, zérusösszegű játékot értünk. + + \subsubsection*{Játékfa} + + \noindent A játékokat állapottér-reprezentációval szokás leírni, és az állapot-gráfot faként ábrázolják.\\\\ + {\small + \renewcommand{\arraystretch}{2} + \begin{tabular}{ l|L } + \textit{\textbf{csúcs}} & állás (egy állás több csúcs is lehet) + \\ \hline + \textit{\textbf{szint}} & játékos (felválltva A és B szintjei) + \\ \hline + \textit{\textbf{él}} & lépés (szintről-szintre) + \\ \hline + \textit{\textbf{gyökér}} & kezdő állás (kezdő játékos) + \\ \hline + \textit{\textbf{levél}} & végállások + \\ \hline + \textit{\textbf{ág}} & játszma + \\ + \end{tabular} + \renewcommand{\arraystretch}{1}}\\ + + \subsection*{Nyerő stratégia} + \begin{itemize} + \item A \textit{győztes (vagy nem-vesztes) stratégia} egy olyan elv, amelyet betartva egy játékos az ellenfél minden lépésére tud olyan választ adni, hogy megnyerje (ne veszítse el) a játékot. Valamelyik játékosnak biztosan van győztes (nem-vesztes) stratégiája. + \item Győztes (nem-vesztes) stratégia keresése a \textit{játékfában} kombinatorikus robbanást okozhat, ezért e helyett részfa kiértékelést szoktak alkalmazni a soron következő jó lépés meghatározásához. + \item A két esélyes (győzelem vagy vereség) teljes információjú véges determinisztikus kétszemélyes játékokban az egyik játékos számára biztosan létezik nyerő stratégia. + \item A három esélyes játékokban (van döntetlen is) a nem vesztő stratégiát lehet biztosan garantálni. + \end{itemize} + + \noindent \textbf{ÉS/VAGY gráf} + \begin{itemize} + \item A játék az egyik játékos szempontjából egy ÉS/VAGY fával ábrázolható. + \begin{itemize} + \item saját szinten egy csúcs utódai között VAGY kapcsolat van + \item ellenfél szintjén egy csúcs utódai között ÉS kapcsolat van + \end{itemize} + \item A nyerő (nem-vesztő) stratégiát az ÉS/VAGY játékfa azon hiper-útja mutatja, amely a gyökércsúcsból csupa nyerő (nem-vesztő) levélcsúcsba vezet. + \item A nyerő stratégia keresése tehát egy ÉS/VAGY fa beli hiper-út keresési probléma. + \end{itemize} + + \subsection*{Algoritmusok} + + \noindent A nyerő vagy nem-vesztő stratégia megkeresése egy nagyobb játékfa esetében reménytelen. Az optimális lépés helyett a soronkövetkező jó lépést keressük (\emph{részleges játékfa-kiértékelés}). \\ + + \noindent Ehhez az aktuális állapotból indulva kell a játékfa + \begin{enumerate} + \item néhány szintjét felépíteni, + \item ezen a részfa leveleinek a hasznosságát megbecsülni, + \item majd a soron következő lépést meghatározni. + \end{enumerate} + Minden esetben szükségünk van egy olyan heurisztikára, amely a mi szempontunkból becsüli meg egy állás hasznosságát.\\ + + \subsubsection*{Minimax \emph{algoritmus}} + + \begin{enumerate} + \item A játékfának az adott állás csúcsából leágazó részfáját felépítjük néhány szintig. + \item A részfa leveleit kiértékeljük a kiértékelő függvény segítségével. + \item Az értékeket felfuttatjuk a fában: + \begin{itemize} + \item A saját ($MAX$) szintek csúcsaihoz azok gyermekeinek maximumát: + \begin{center} + szülő := max\Big($gyerek_1,\ \ldots \,\ gyerek_k$\Big) + \end{center} + \item Az ellenfél (MIN) csúcsaihoz azok gyermekeinek minimumát: + \begin{center} + szülő := min\Big($gyerek_1,\ \ldots\ ,\ gyerek_k$\Big) + \end{center} + \item Soron következő lépésünk ahhoz az álláshoz vezet, ahonnan a gyökérhez felkerült a legnagyobb érték + \end{itemize} + \end{enumerate} + + \newpage + {\color{mygray} + \noindent Az algoritmust minden alkalommal megismételjük valahányszor mi következünk. Lehetséges, hogy az ellenfél nem feltétlenül az általunk várt legerősebb lépésekkel válaszol, mert: + \begin{itemize} + \item eltérő mélységű részfával dolgozik, + \item más kiértékelő függvényt használ, + \item nem minimaxeljárást alkalmaz, + \item hibázik.\\ + \end{itemize} + } + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/minmax_sample.png} + \caption{Minimax algoritmus példa.} + \label{fig:minmax_sample} + \end{figure} + + \noindent A $\ref{fig:minmax_sample}$. ábrán csak azt jelöljük, hogy melyik részfán indul el a játékos, mivel csak azt tudjuk, hogy merre kedvezőbb elindulnia. Az előző felsorolás alapján nem garantált, hogy végig is tudja játszani az adott pillanatban számára optimális játékot. + + \subsubsection*{Alfa-Béta \emph{algoritmus}} + \begin{itemize} + \item Visszalépéses algoritmus segítségével járjuk be a részfát (olyan mélységi bejárás, amely mindig csak egy utat tárol).\\ + Az aktuális úton fekvő csúcsok ideiglenes értékei: + \begin{itemize} + \item A $MAX$ szintjein $\alpha$ érték: ennél rosszabb értékű állásba innen már nem juthatunk + \item A $MIN$ szintjein $\beta$ érték: ennél jobb értékű állásba onnan már nem juthatunk + \end{itemize} + \item Lefelé haladva a fában $\alpha:= -\infty$, és $\beta:= +\infty$. + \item Visszalépéskor az éppen elhagyott (gyermek) csúcs értéke (\emph{felhozott érték}) módosíthatja a szülő csúcs értékét: + \begin{itemize} + \item A $MAX$ szintjein: $\alpha:= max\Big(\textit{felhozott érték},\ \alpha\Big)$ + \item A $MIN$ szintjein: $\beta:= min\Big(\textit{felhozott érték},\ \beta\Big)$ + \end{itemize} + \item Vágás történik, ha az úton van olyan $\alpha$ és $\beta$, hogy $\alpha\ \geq\ \beta$.\\ + \end{itemize} + \newpage + Példa:\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.72\linewidth]{img/alphabeta_01.png} + \caption{Alfa-Béta algoritmus példa.} + \label{fig:alphabetaone} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.32\linewidth]{img/alphabeta_02.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_03.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_04.png} + \caption{Alfa-Béta algoritmus példa.} + \label{fig:alphabetatwo} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.32\linewidth]{img/alphabeta_05.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_06.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_07.png} + \caption{Alfa-Béta algoritmus példa.} + \label{fig:alphabetathree} + \end{figure} + + \noindent A vágás a $\ref{fig:alphabetafour}$. ábra első képen a MIN ($\beta$) ágon történik. Mivel az ellenfél szempontjából a $-2$ jobb érték, mint a bal oldali részfán már megtalált $2$-es érték, ezért a MAX algoritmus használó játékos nem választaná ezt az ágat. Ennek oka, hogy az ellenfél szempontjából kedvezőbb ,,lépést" tartalmaz. Ezért nem számít, hogy a részfa maradék (még meg nem vizsgált) levelei között lenne nagyobb érték a $2$-nél. + + \begin{figure}[H] + \centering + \includegraphics[width=0.32\linewidth]{img/alphabeta_08.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_09.png} + \includegraphics[width=0.32\linewidth]{img/alphabeta_10.png} + \caption{Alfa-Béta algoritmus példa.} + \label{fig:alphabetafour} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.72\linewidth]{img/alphabeta_end.png} + \caption{Alfa-Béta algoritmus példa.} + \label{fig:alphabetaend} + \end{figure} + + \noindent Az algoritmus hatékonyságát az adja, hogy nagy problématér esetén rengeteg számítástól kíméli meg az algoritmust használó programot, így csökkentve a válaszidőt. Például egy sakk program esetén ki kell értékelni az egyes állásokat. Ez általában úgy történik, hogy konstans értéket rendel a program az egyes , ami már használható az algoritmusban. Ehhez például a sakkban konstans értékeket rendelhetünk az egyes figurákhoz. Majd egyes állásokat a megmaradt figurák összértéke alapján értékelhetünk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\linewidth]{img/chess_minmax.jpeg} + \caption{Sakk példa: lépés keresés (Minimax).} + \label{fig:minmaxchess} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\linewidth]{img/chess_alphabeta.jpeg} + \caption{Sakk példa: lépés keresés (Alfa-Béta).} + \label{fig:alphabetachess} + \end{figure} + + \noindent A $\ref{fig:alphabetachess}$. ábrán látható, hogy az Alpha-Beta algoritmussal megspórolunk rengeteg időt azzal, hogy az egyes állásokhoz tartozó konstans értéket nem szükséges kiszámítanunk.\\ + + \subsubsection*{A \emph{Minimax} algoritmus további módosításai} + + \begin{itemize} + \item \textbf{\emph{Átlagoló}}: Kisimítja a kiértékelő függvény esetleges tévedéseit. + \begin{itemize} + \item MAX szintre az $m$ darab legnagyobb értékű gyerek átlaga, + \item MIN szintre az $n$ darab legkisebb értékű gyerek átlaga kerül. + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/avgminmax_sample.png} + \caption{Átlagoló kiértékelésű Minimax.} + \label{fig:avgminmax} + \end{figure} + \item \textbf{\emph{Váltakozó mélységű kiértékelésű}}: A kiértékelő függvény minden ágon reális értéket mutat.\\ + Egy adott szintig (minimális mélység) mindenképpen felépítjük a részfát, majd ettől a szinttől kezdve egy másik adott szintig (maximális mélység) csak azon csúcsok gyerekeit állítjuk elő, amelyek még nincsenek nyugalomban, amelyre nemteljesül a nyugalmi teszt: + \begin{center} + $\Big|\ f(\textit{szülő})\ ‒\ f(\textit{csúcs})\ \Big|\ <\ K$\\ + \end{center} + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/variable_depth_minmax.png} + \caption{Vátozó mélységű kiértékelésű Minimax.} + \label{fig:avgminmax} + \end{figure} + \item \textbf{\emph{Negamax}}: A Negamax eljárást könnyebb implementálni. + \begin{itemize} + \item Kezdetben (‒1)-gyel szorozzuk azon levélcsúcsok értékeit, amelyek az ellenfél (MIN) szintjein vannak, majd + \item Az értékek felfuttatásánál minden szinten az alábbi módon számoljuk a belső csúcsok értékeit: + \begin{center} + $\textit{szülő := max}\Big(\ ‒gyerek_1,\ \ldots\ ,\ ‒gyerek_k\ \Big)$ + \end{center} + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/negamax_sample.png} + \caption{Negamax algoritmus példa.} + \label{fig:negamax} + \end{figure} + \end{itemize} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/5-ös_tanulók_száma.nsd b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/5-ös_tanulók_száma.nsd new file mode 100644 index 0000000..3e558c7 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/5-ös_tanulók_száma.nsd @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus.png new file mode 100644 index 0000000..daf69a1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus_pelda.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus_pelda.png new file mode 100644 index 0000000..d553681 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/adattipus_pelda.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/diagram b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/diagram new file mode 100644 index 0000000..1753a22 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/diagram @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolas_stuki.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolas_stuki.png new file mode 100644 index 0000000..35b5d7c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolas_stuki.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_halmaz.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_halmaz.png new file mode 100644 index 0000000..599daff Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_halmaz.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_intervallum.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_intervallum.png new file mode 100644 index 0000000..81496c0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_intervallum.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_matrix.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_matrix.png new file mode 100644 index 0000000..3f2531e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_matrix.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_seqin.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_seqin.png new file mode 100644 index 0000000..a3ec3ed Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_seqin.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_sorozat.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_sorozat.png new file mode 100644 index 0000000..b75de78 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_sorozat.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_speci.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_speci.png new file mode 100644 index 0000000..034ef97 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_speci.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_vektor.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_vektor.png new file mode 100644 index 0000000..9af1766 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolo_vektor.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolás.nsd b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolás.nsd new file mode 100644 index 0000000..5db16fb --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/felsorolás.nsd @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk1.png new file mode 100644 index 0000000..8a3eca2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk2.png new file mode 100644 index 0000000..e9c8336 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_alapszerk2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_pelda.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_pelda.png new file mode 100644 index 0000000..271d84d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/img/stuki_pelda.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.pdf new file mode 100644 index 0000000..6c58dcd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.tex new file mode 100644 index 0000000..09ce788 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/07.Programozás/tetel7.tex @@ -0,0 +1,633 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage[hungarian]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{listings} +\usepackage{makecell} +\usepackage{multirow} +\usepackage{pdfpages} +\usepackage{subcaption} +\usepackage{xcolor} +\usepackage{verbatim} +\usepackage{dashrule} + +\definecolor{mygray}{rgb}{0.15, 0.15, 0.15} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +% A dokument itt kezdődik + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{7. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + {\Large\bfseries\noindent 7. Programozás} \\ + + \section*{Egyszerű programozási feladat megoldásának lépései} + \subsection*{Bevezetés} + Egy programozási feladat megoldása nem csupán a kódolásból áll. Tartalmaz még jó néhány egyéb tevékenységet.\\ + + \noindent Az első teendő a feladat pontos meghatározása, a \emph{specifikáció}, ami tartalmazza: + \begin{itemize} + \item[-] A feladat szöveges és formalizált, matematikai leírását (a specifikáció ún. szűkebb értelmezésén) + \item[-] A megoldással szemben támasztott követelményeket, környezeti igényeket (ami a specifikáció ún. tágabb értelmezése). + \end{itemize} + + \noindent A specifikáció alapján meg lehet tervezni a programot, ahol elkészülhet + \begin{itemize} + \item[-] a \emph{megoldás algoritmusa}, és az + \item[-] algoritmus által használt \emph{adatok leírása}. + \end{itemize} + + \noindent Az algoritmus és az adatszerkezet finomítása egymással párhuzamosan halad, egészen addig a szintig, amelyet a programozó ismeretei alapján már könnyen, hibamentesen képes kódolni. Gyakran előfordul, hogy a tervezés során derül fény a specifikáció hiányosságaira, így itt visszalépésekre számíthatunk.\\ + + \noindent Az algoritmusírás után következhet a \emph{kódolás}. Ha a feladat kitűzője nem rögzítette, akkor ez előtt választhatunk a megoldáshoz programozási nyelvet. A kódolás eredménye a programozási nyelven leírt program.\\ + + \noindent A program első változatban általában sohasem hibátlan, a helyességéről csak akkor beszélhetünk, ha meggyőződtünk róla. A helyesség vizsgálatának egyik lehetséges módszere a \emph{tesztelés}. Ennek során próbaadatokkal próbáljuk ki a programot, s az ezekre adott eredményből következtetünk a helyességre.\\ + \emph{Megyjegyzés: (Ne legyenek illúzióink afelől, hogy teszteléssel eldönthető egy program helyessége. Hisz hogy valójában helyes-e a program – sajnos – nem következik abból, hogy nem találtunk hibát.)}\\ + + \noindent Ha a tesztelés során hibajelenséggel találkozunk, akkor következhet a \emph{hibakeresés}, a hibajelenséget okozó utasítás megtalálása, majd pedig a \emph{hibajavítás}.\\ + + \noindent A hiba kijavítása több fázisba is visszanyúlhat. Elképzelhető, hogy kódolási hibát kell javítanunk, de az is lehet, hogy a hibát már a tervezésnél követtük el.\\ + + \noindent Javítás után újra tesztelni kell, hiszen – legyünk őszinték magunkhoz!– nem kizárt, hogy hibásan javítunk, illetőleg – enyhe optimizmussal állítjuk:– a javítás újabb hibákat fed fel.\\ + + \noindent E folyamat végeredménye a helyes program. Ezzel azonban még korántsem fejeződik be a programkészítés. Most következnek a minőségi követelmények. Vizsgálnunk kell + \begin{itemize} + \item[-] a hatékonyságot (végrehajtási idő, helyfoglalás), másrészt + \item[-] a kényelmes felhasználhatóságot (felhasználó barát működés). + \end{itemize} + + \noindent Itt újra visszaléphetünk a kódolási, illetve a tervezési fázisba is. Ezzel elérkeztünk a jó programhoz. + + \subsection*{Specifikáció} + + A programkészítés menetének első lépése a feladat meghatározása, precíz "újrafogalmazása". Milyen is legyen, mit várjunk el tőle? Néhány – jónak tűnő – követelmény egyelőre címszavakban. (A továbbiakban a specifikáció szűkebb értelmezéséről lesz szó.)\\\\ + A specifikáció legyen: + + \begin{itemize} + \item[-] helyes, egyértelmű, pontos, teljes + \item[-] rövid, tömör + \subitem (ez legegyszerűbben úgy érhető el, hogy ismert formalizmusokra építjük) + \item[-] szemléletes, érthető + \subitem (amit időnként nehezít a formalizáltság) + \end{itemize} + + \noindent A specifikáció első közelítésben lehetne a feladatok szövege. Ez azonban több problémát vethet fel: + + \begin{itemize} + \item[-] Mi alapján adjuk meg a megoldást? + \item[-] Mit is kell pontosan megadni? + \end{itemize} + + \noindent Például az a feladat, hogy adjuk meg $N$ ember közül a legmagasabbat. A legmagasabb ember megadása mit jelent? Adjuk meg a sorszámát, vagy a nevét, vagy a személyi számát, vagy a magasságát, esetleg ezek közül mindegyiket? Tanulságként megállapítható, hogy a specifikációnak \emph{tartalmaznia kell a bemenő és a kimenő adatok leírását}. + + \begin{verbatim} + Bemenet: + N : az emberek száma, + A : a magasságukat tartalmazó sorozat. + + Kimenet: + MAX : a legmagasabb ember sorszáma. + \end{verbatim} + + \noindent Tudjuk-e, hogy a bemenő, illetve a kimenő változók milyen értéket vehetnek fel? + \begin{itemize} + \item[-] Például az emberek magasságát milyen mértékegységben kell megadni? + \item[-] Az eredményül kapott sorszám milyen érték lehet: 1-től sorszámozunk, vagy 0-tól? + \end{itemize} + + \noindent Megállapíthatjuk tehát, hogy a specifikációnak \emph{tartalmaznia kell a bemeneti és a kimeneti változók értékhalmazát}. + + \begin{verbatim} + Bemenet: + N : az emberek száma, természetes szám; + A : a magasságukat tartalmazó sorozat, egész számok, amelyek a magasságot + centiméterben fejezik ki (a sorozatot 1-tol N-ig indexeljük). + Kimenet: + MAX : a legmagasabb ember sorszáma, 1 és N közötti természetes szám. + \end{verbatim} + + \noindent Most már a bemenő és a kimenő változók értékhalmazát pontosan meghatároztuk, csupán az a probléma, hogy a feladatban használt fogalmakat és az eredmények kiszámítási szabályát nem definiáltuk.\\ + + \noindent A specifikációnak tehát \emph{tartalmaznia kell a feladatban használt fogalmak definícióját}, valamint az \emph{eredmény kiszámítási szabályát}.\\ + + \noindent Itt lehetne megadni a bemenő adatokra vonatkozó összefüggéseket is. A \emph{bemenő}, illetve a \emph{kimenő} adatokra kirótt feltételeket nevezzük \emph{előfeltétel}nek, illetve \emph{utófeltétel}nek. Az előfeltétel nagyon sokszor egy azonosan igaz állítás, azaz a bemenő adatok értékhalmazát semmilyen "külön” feltétellel nem szorítjuk meg. + + \begin{verbatim} + Bemenet: + N : az emberek száma, természetes szám, + A : a magasságukat tartalmazó sorozat, egész számok, + amelyek a magasságot centiméterben tartalmazzák + + (a sorozatot 1-tol N-ig indexeljük). + Kimenet: + MAX : a legmagasabb ember sorszáma, 1 és N közötti természetes szám. + + Elofeltétel: + A[i]-k pozitívak. + + Utófeltétel: + MAX olyan 1 és N közötti szám, amelyre A[MAX] nagyobb vagy egyenlo, + mint a sorozat bármely eleme (az 1. és az N. között). + \end{verbatim} + + \noindent Újabb probléma merülhet fel bármelyik feladattal kapcsolatban: az eddigiek alapján a "várttól” lényegesen különböző – nyugodtan állíthatjuk: "banális” –, az elő- és utófeltételnek megfelelő megoldást is tudunk készíteni.\\ + + \noindent Itt persze arról a hallgatólagos (tehát még meg nem fogalmazott, ki nem mondott) feltételezésről van szó, hogy a bemeneti változók értéke nem változik meg. Ez sajnos nem feltétlenül igaz.\\ + + \noindent A probléma megoldására kétféle utat követhetünk: + \begin{itemize} + \item az utófeltételbe automatikusan beleértjük, hogy "a bemeneti változók értéke nem változik meg”, s külön kiemeljük, ha mégsem így van; + \item az elő- és az utófeltételt a program paramétereire fogalmazzuk meg, amelyeket formailag megkülönböztetünk a program változóitól, és emiatt nem a paraméterek fognak változni, hanem a programbeli változók (ebben az esetben természetesen az elő- és az utófeltételben meg kell fogalmazni a paraméterek és a megfelelő programbeli változók értékének azonosságát). + \end{itemize} + + \noindent A második megoldásból az következik, hogy meg kell különböztetnünk egymástól a feladat és a program elő–, illetve utófeltételét! Ez hosszadalmasabbá – bár precízebbé – teszi a feladat megfogalmazását, emiatt ritkábban fogjuk alkalmazni.\\ + + \noindent Előfordulhat, hogy a feladat megfogalmazása alapján nem lehet egyértelműen meghatározni az eredményt, ugyanis az utófeltételnek megfelelő több megoldás is létezik. Ez a jelenség a \emph{feladat ún. nemdeterminisztikussága}. \\ + + \noindent Ehhez a nemdeterminisztikus feladathoz tehát determinisztikus programot kell írnunk, aminek az utófeltétele már nem engedheti meg a nem egyértelműséget, a nemdeterminisztikusságot. E probléma miatt tehát mindenképpen meg kell különböztetnünk egymástól a feladat és a program elő–, illetve utófeltételét. + \newpage + \begin{verbatim} + Bemenet: + N : az emberek száma, természetes szám, + A : a magasságukat tartalmazó sorozat, egész számok, + amelyek a magasságot centiméterben tartalmazzák + (a sorozatot 1-tol N-ig indexeljük). + Kimenet: + MAX : a legmagasabb ember sorszáma, 1 és N közötti természetes szám. + + Elofeltétel: + A[i]-k pozitívak. + + Utófeltétel: + MAX olyan 1 és N közötti szám, amelyre A[MAX] nagyobb vagy egyenlo, + mint a sorozat bármely eleme (az 1. és az N. között). + + Program utófeltétel: + MAX olyan 1 és N közötti szám, amelyre A[MAX] nagyobb vagy egyenlo, + mint a sorozat bármely eleme (az 1. és az N. között) és elotte + nincs vele egyenlo. + \end{verbatim} + + \noindent Megállapíthatjuk ebből, hogy \emph{a program utófeltétele lehet szigorúbb, mint a feladaté}, emellett \emph{az előfeltétele pedig lehet gyengébb}.\\ + + \noindent Visszatekintve a specifikáció eddig "bejárt pályájára” egy szemléletes modellje körvonalazódik a feladatmegoldásnak. Nevezetesen: nyugodtan mondhatjuk azt, hogy a feladatot megoldó program egy olyan automatát határoz meg, amelynek pillanatnyi állapota a feladat paraméterei (a program változói) által "kifeszített” halmaz egy eleme. (E halmaz annyi dimenziós, ahány paraméterváltozója van a programnak; minden dimenzió egyik változó értékhalmaza. Tehát egy konkrét időpillanatban e "gép” állapota: a változóinak abban a pillanatban érvényes értékeinek együttese.) Ezt a halmazt nevezzük a program állapotterének. Amikor megfogalmazzuk az előfeltételt, akkor tulajdonképpen kihasítjuk ebből az állapottérből azt a részt (azt az altért), amelyből indítva elvárhatjuk az automatánktól (amit a megoldó program vezérel), hogy a helyes eredményt előállítja egy végállapotában. A végállapotot jelöltük ki az utófeltétellel.\\ + + \noindent Ezt a modellt elfogadva adódik még egy további megoldásra váró kérdés. Akkor ugyanis, amikor a programot írjuk, lépten-nyomon a részeredmények tárolására újabb és újabb változókat vezetünk be. Fölvetődik a kérdés: hogyan egyeztethető össze az imént elképzelt modellel? A válasz egyszerű: minden egyes újabb változó egy újabb dimenziót illeszt az eddig létrejött állapottérhez. Tehát a programozás folyamata – leegyszerűsítve a dolgot – nem áll másból, mint annak pontosításából, hogy hogyan is nézzen ki a megoldó automata állapottere (és persze: hogyan kell az egyik állapotból a másik állapotba jutnia). A feladatban szereplő paraméterek meghatározta "embrionális” állapotteret hívhatjuk paramétertérnek, ami csak altere a program valódi állapotterének. Ez is azt sugallja, hogy a feladat előfeltétele gyengébb (azaz az általa kijelölt állapothalmaz) lehet, mint a program előfeltétele.\\ + + \noindent Foglaljuk most össze, hogy melyek a specifikáció részei! Ezek az eddigiek, valamint a programra vonatkozó további megkötések lesznek. + + \begin{enumerate} + \item A feladat specifikálása + \begin{itemize} + \item a feladat szövege, + \item a bemenő és a kimenő adatok elnevezése, értékhalmazának leírása, + \item a feladat szövegében használt fogalmak definíciói (a fogalmak fölhasználásával), + \item a bemenő adatokra felírt előfeltétel (a fogalmak fölhasználásával), + \item a kimenő adatokra felírt utófeltétel. + \end{itemize} + \item A program specifikálása + \begin{itemize} + \item a bemenő és a kimenő adatok elnevezése, értékhalmazának leírása, + \item (a feladat elő-, illetve utófeltételétől esetleg különböző) program elő- és utófeltétel, + \item a feladat megfogalmazásában használt fogalmak definíciói. + \end{itemize} + \end{enumerate} + + \noindent Ezek az absztrakt specifikáció elemei. Az alábbiak másodlagos, mondhatjuk: technikai specifikáció részei: + + \begin{itemize} + \item a program környezetének leírása (számítógép, memória- és perifériaigény, programozási nyelv, szükséges fájlok stb.), + \item a programmal szembeni egyéb követelmények (minőség, hatékonyság, hordozhatóság stb.). + \end{itemize} + + \noindent A technikai specifikáció nélküli leírást a program szűkebb specifikációjának nevezik.\\ + + \noindent Az elöbbi feladat progos specifikációja:\\\\ + $A=(N : \mathbb{N},\ A: \mathbb{N}^{1..N})$\\ + $Ef=(\forall i \in {1..N}\ :\ A_{i} > 0)$\\ + $Uf=(Ef\ \land\ \forall i \in {1..N}\ :\ A_{MAX} \geq A_{i}\ \land\ \forall j \in \{1, ... ,MAX-1\}\ :\ A_{j} < A_{MAX})$ + + \subsection*{Tervezés} + + A tervezés során algoritmusleíró eszközöket használunk, amelynek célja a feladatok megoldásának leírása programozási nyelvtől független nyelven. A programozási nyelvek ugyanis szigorú szintaxisúak, a tervezés szempontjából lényegtelen sallangokat tartalmaznak. A programozási nyelven történő tervezés esetén nehézzé válhat a program átírása más nyelvre, más gépre. Többféle algoritmusleíró eszköz is létezik, mi tanulmányaink során a struktogramot alkalmaztuk.\\ + + \noindent A \textbf{struktogram} a programgráfot élek nélkül ábrázolja. Így egyetlen egy alapelem marad, a \emph{téglalap}. Ezzel az alapelemmel építhetjük fel a szokásos strukturált alapszerkezeteket (és csak azokat). + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/stuki_alapszerk1} + \caption{A struktogram összetett alapszerkezetei.} + \label{fig:stuki_alapszerk1} + \end{figure} + + \noindent \emph{Szekvenciánál} a téglalapok egymás alatti sorrendje dönti el a végrehajtás sorrendjét.\\ + + \noindent Az \emph{elágazásfeltétel} igaz értéke esetén az i betűvel jelölt bal oldali téglalap utasítását kell végrehajtani, hamis értéke esetén pedig az n betűvel jelölt jobb oldali téglalapét.\\ Ha az elágazás valamelyik ága üres, akkor a neki megfelelő téglalap is üres marad. \\ + + \noindent A \emph{ciklus} elöltesztelős, azaz a benne levő utasítást mindaddig végre kell hajtani, amíg a feltétel igaz.\\ + + \noindent Az utasítások helyén lehet egyetlen elemi utasítás, lehet a három algoritmikus szerkezet valamelyike, és lehet egy eljáráshívás.\\ + + \noindent Ezt a leíróeszközt még többféle elemmel szokták bővíteni: + \begin{itemize} + \item Eljárásdefinícióval + \item Sokirányú elágazással + \item Hátultesztelős ciklussal + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/stuki_alapszerk2} + \caption{A struktogram további összetett alapszerkezetei.} + \label{fig:stuki_alapszerk2} + \end{figure} + + \noindent Sokirányú elágazásnál azt az ágat kell végrehajtani, amelynek igaz értékű a feltétele (közülük minden esetben pontosan egy teljesülhet).\\ + + \noindent A lokális adatokat az eljárások téglalapjai mellett, az eljárásnév után sorolhatjuk fel.\\ + + \noindent Nézzük meg ezzel az eszközzel leírva a következő példát!\\ + + \noindent Feladat: N tanuló év végi átlagának ismeretében adjuk meg a jeles átlagú tanulók számát! + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\linewidth]{img/stuki_pelda} + \caption{A példafeladat megoldása struktogrammal.} + \label{fig:stuki_pelda} + \end{figure} + + \subsection*{Megvalósítás} + + A program elkészítése a kiválasztott programozási nyelve(ke)n, azaz a kódolás. + \newpage + + \subsection*{Tesztelés} + + A tesztelés célja, hogy minél több hibát megtaláljunk a programban. Ahhoz, hogy az összes hibát fölfedezzük, kézenfekvőnek tűnik a programot kipróbálni az összes lehetséges bemenő adattal. Ez azonban általában sajnos nem lehetséges.\\ + + \noindent Példaként tekintsük a következő - pszeudokóddal megadott - egyszerű programot: + + \begin{verbatim} + Program: + Változó A,B:Egész + Be: A,B + Ki: A/B + Program vége. + \end{verbatim} + + \noindent Mivel $2^{16}$ különböző értékű egész számot tudunk tárolni, ezért az összes lehetőség $2^{32}$, aminek a leírásához már 9 számjegyre van szükség. Ez rengeteg időt venne igénybe, így nem is járható út.\\ + + \noindent Ha ezt a programot olyan bemenő adatokkal próbáljuk ki, amelyben A=0 vagy B=1, akkor a program helyesen működik, a hibát nem tudjuk felfedezni. Ezután azt gondolhatnánk, hogy reménytelen helyzetbe kerültünk: hiszen minden lehetséges adattal nem tudjuk kipróbálni a programot; ha pedig kevesebbel próbáljuk ki, akkor lehet, hogy nem vesszük észre a hibákat. A helyzet azért nem ennyire rossz: célunk csak az lehet, hogy a tesztelést olyan módszerrel hajtsuk végre, amellyel a próbák száma erősen lecsökkenthető.\\ + + \noindent Tesztesetnek a be- és kimeneti adatok és feltételek együttes megadását nevezzük. Akkor tudunk a tesztelés eredményeiről bármit is mondani, ha van elképzelésünk arról, hogy adott bemenő adatra milyen eredményt várunk.\\ + + \noindent Fogalmazzuk meg a tesztelés alapelveit: + \begin{itemize} + \item A jó teszteset az, ami nagy valószínűséggel egy még felfedetlen hibát mutat ki a programban.\\ + Például két szám legnagyobb közös osztóját számoló programot az [5,5] adatpár után a [6,6]-tal teljesen felesleges kipróbálni (ugyanis igencsak rafinált, valószínűtlen elírás esetén viselkedhet a program [6,6]-ra másként, mint [5,5]-re). + \item A teszteset nemcsak bemenő adatokból, hanem a hozzájuk tartozó eredményekből is áll. Egyébként nem tudnánk a kapott eredmény helyes vagy hibás voltáról beszélni.\\ + A későbbi felhasználás miatt célszerű a teszteseteket is leírni a fejlesztői dokumentációban vagy egy önálló tesztelési jegyzőkönyvben. + \item A meg nem ismételhető tesztesetek kerülendők, feleslegesen megnövelik a program-tesztelés költségeit, idejét. Nem is beszélve arról a bosszúságról, amikor a programunk egy hibás futását nem tudjuk megismételni, és így a hiba is felfedetlen marad. + \item Teszteseteket mind az érvénytelen, mind az érvényes adatokra kell készíteni. + \item Minden tesztesetből a lehető legtöbb információt "ki kell bányászni”, azaz minden teszteset eredményét alaposan végig kell vizsgálni. Ezzel jelentősen csökkenthető a szükséges próbák száma. + \item Egy próba eredményeinek vizsgálata során egyaránt fontos megállapítani, hogy miért nem valósít meg a program valamilyen funkciót, amit elvárunk tőle, illetve hogy miért végez olyan tevékenységeket is, amelyeket nem feltételeztünk róla. + \item A program tesztelését csak a program írójától különböző személy képes hatékonyan elvégezni. Ennek oka, hogy a tesztelés nem "jóindulatú” tevékenység, saját munkájának vizsgálatához mindenki úgy áll hozzá, hogy önkéntelenül jónak feltételezi. + \end{itemize} + + \noindent A programtesztelés módszereit két csoportba oszthatjuk aszerint, hogy a tesztelés során végrehajtjuk-e a programot, vagy nem. Ha csak a program kódját vizsgáljuk, akkor \emph{statikus} (erről nem esik több szó), ha a programot végre is hajtjuk a tesztelés során, akkor \emph{dinamikus} tesztelésről beszélünk. + + \paragraph{Dinamikus tesztelési módszerek} + + A dinamikus tesztelési módszerek alapelve az, hogy a programot működés közben vizsgáljuk. Teszteseteket kétféle módon tudunk választani. \\ + + \noindent Egy lehetőség az ún. \textbf{feketedoboz-módszer}, más néven adatvezérelt tesztelés.\\ + A módszer alkalmazásakor a tesztelő nem veszi figyelembe a program belső szerkezetét, pontosabban nem azt tekinti elsődleges szempontnak, hanem a teszteseteket a feladat meghatározás alapján választja meg.\\ + + \noindent A cél természetesen a lehető leghatékonyabb tesztelés elvégzése, azaz az összes hiba megtalálása a programban. Ez ugyan elvileg lehetséges, kimerítő bemenet tesztelést kell végrehajtani, a programot ki kell próbálni az összes lehetséges bemenő adatra. Ezzel a módszerrel azonban, mint korábban láttuk, mennyiségi akadályba ütközhetünk.\\ + + \noindent Egy másik lehetőség a \textbf{fehérdoboz-módszer} (logika vezérelt tesztelés). Ebben a módszerben a tesztesetek megválasztásánál lehetőség van a program belső szerkezetének figyelembevételére is.\\ + + \noindent A cél a program minél alaposabb tesztelése, erre jó módszer a kimerítő út tesztelés. Ez azt jelenti, hogy a programban az összes lehetséges utat végigjárjuk, azaz annyi tesztesetet hozunk létre, hogy ezt elérhessük vele. Az a probléma, hogy még viszonylag kis programok esetén is igen nagy lehet a tesztelési utak száma. Gondoljunk a ciklusokra! Sőt ezzel a módszerrel a hiányzó utakat nem lehet felderíteni.\\ + + \noindent Mivel sem a fehérdoboz-módszerrel, sem a feketedoboz-módszerrel nem lehetséges a kimerítő tesztelés, el kell fogadnunk, hogy nem tudjuk egyetlen program hibamentességét sem szavatolni. A további cél ezek után az összes lehetséges teszteset halmazából a lehető leghatékonyabb teszteset-csoport kiválasztása lehet.\\ + + \noindent A tesztelés hatékonyságát kétféle jellemző határozza meg: a tesztelés költsége és a felfedett hibák aránya. A leghatékonyabb teszteset-csoport tehát minimális költséggel maximális számú hibát fed fel.\\ + + \noindent A feketedoboz- és fehérdoboz-teszteken kívül még érdemes megemlíteni olyan speciális teszteket, amikor nem a helyesség belátása a cél. Ilyen pl. a stresszteszt (nagy adatmennyiséget hogyan bír kezelni a program, jól skálázódik-e) vagy a hatékonysági teszt (végrehajtási idő tesztelése). + + \section*{Az adattípus fogalma} + + \subsection*{Alapfogalmak, jelölések} + + \begin{itemize} + + \item Legyen\\ + $\begin{array}{r|l} + A^{*} & A\text{-beli \emph{véges} sorozatok halmaza} \\ + A^{\infty} & A\text{-beli \emph{végtelen} sorozatok halmaza} \\ + A^{*} \cup A^{\infty} = A^{**} & A\text{-beli \emph{véges vagy végtelen} sorozatok halmaza} \\ + \end{array}$ + + \item Legyen $R \subseteq A \times \mathbb{L}$ egy logikai reláció.\\ + Ekkor az $R$ \emph{\textbf{igazsághalmaza}} + $\lceil R \rceil ::= R^{-1}(\left\{{igaz}\right\}) $ + + \item Legyen $I$ egy véges halmaz és legyenek $A_{i},\ i \in I$ tetszőleges véges vagy megszámolható, nem üres halmazok.\\ + Ekkor az + \begin{itemize} + \item $A = \underset{i \in I}{\times} A_{i}$ halmazt \emph{\textbf{állapottér}}nek, az + \item $A_{i}$ halmazokat pedig \emph{\textbf{típus-érték halmaz}}oknak nevezzük. + \end{itemize} + \item Az $F \subseteq A \times A$ relációt \emph{\textbf{feladat}}nak nevezünk.\\ + {\footnotesize A feladat fenti definíciója természetes módon adódik abból, hogy a feladatot egy leképezésnek tekintjük az állapottéren, és az állapottér minden pontjára megmondjuk, hova kell belőle eljutni, ha egyáltalán el kell jutni belőle valahova.} + + \item Az $S \subseteq A \times A^{**}$ relációt \emph{\textbf{program}}nak nevezzük, ha + \begin{enumerate} + \item $\mathcal{D}_{S}=A$\\ + {\footnotesize (az állapottér minden pontjához rendel valamit = a program minden pontban csinál valamit)} + \item $\forall \alpha \in \mathcal{R}_{S} : \alpha = red(\alpha)$\\ + red: Egy $A^{**}$-beli sorozat redukáltja. Azonos elemek helyettesítése egy elemmel (distinct). + {\footnotesize(az állapot megváltozik, vagy ha mégsem, az az abnormális működés jele)} + \item $\forall a \in A : \forall \alpha \in S(A) : |\alpha| \not = 0$ és $\alpha_{1}=a$\\ + \end{enumerate} + \end{itemize} + + \noindent A fenti definícióval a "működés” fogalmát akarjuk absztrakt módon megfogalmazni. + + \subsection*{Típusspecifikáció} + + Először bevezetünk egy olyan fogalmat, amelyet arra használhatunk, hogy pontosan + leírjuk a követelményeinket egy típusértékhalmazzal és a rajta végezhető + műveletekkel szemben.\\ + + \noindent A $\mathcal{T_{S}}=(H,I_{S},\mathbb{F})$ hármast \emph{\textbf{típusspecifikáció}}nak nevezzük, ha + teljesülnek rá a következő feltételek: + + \begin{enumerate} + \item H az alaphalmaz, + + \item $I_{S} : H \to \mathbb{L} $ a \emph{specifikációs invariáns}, + + \item $T_{\mathcal{T}} = \left\{ {(\mathcal{T},x) | x \in \lceil I_{S}} \rceil\right\}$ a \emph{típusértékhalmaz}, + + \item $\mathbb{F} = \left\{ {F_{1},F_{2},...,F_{n}}\right\}$ a \emph{típusműveletek specifikációja}, ahol\\ + $\forall i \in [1..n]: F_{i} \subseteq A_{i} \times A_{i}$, $A_{i} = A_{i_{1}} \times ... \times A_{i_{n_{i}}}$ úgy,\\ + hogy $\exists j \in [1..n_{i}]: A_{i_{j}} = T_{\mathcal{T}} $ + \end{enumerate} + + \noindent Az alaphalmaz és az invariáns tulajdonság segítségével azt fogalmazzuk meg, hogy mi az a halmaz, $T_{\mathcal{T}}$, amelynek elemeivel foglalkozni akarunk, míg a feladatok halmazával azt írjuk le, hogy ezekkel az elemekkel milyen műveletek végezhetők el.\\ + + \noindent Az állapottér definíciójában szereplő típusértékhalmazok mind ilyen típusspecifikációban + vannak definiálva. Az állapottér egy komponensét egy program csak a típusműveleteken keresztül változtathatja meg. + +\newpage +\subsection*{Típus} + + \noindent Vizsgáljuk meg, hogy a típusspecifikációban leírt követelményeket hogyan valósítjuk meg.\\ + + \noindent A $\mathcal{T}=(\rho,I,\mathbb{S})$ hármast \emph{\textbf{típus}}nak nevezzük, ha + + \begin{enumerate} + \item $\rho \subseteq E^{*} \times T$ a reprezentációs függvény (reláció),\\ + T a típusértékhalmaz,\\ + E az elemi típusértékhalmaz + \item $I : E^{*} \to \mathbb{L} $ típusinvariáns + \item $\mathbb{S} = \left\{ {S_{1},S_{2},...,S_{m}}\right\}$, ahol\\ + $\forall i \in [1..m]: S_{i} \subseteq B_{i} \times B_{i}^{**}$ program, $B_{i} = B_{i_{1}} \times ... \times B_{i_{m_{i}}}$ úgy,\\ + hogy $\exists j \in [1..m_{i}]: B_{i_{j}} = E^{*}$ és $\not \exists j \in [1..m_{i}]: B_{i_{j}} = T$ + \end{enumerate} + + \noindent A típus első két komponense az absztrakt típusértékek reprezentációját írja le, míg a programhalmaz a típusműveletek implementációját tartalmazza. Az elemi típusértékhalmaz lehet egy tetszőleges másik típus típusértékhalmaza vagy egy, valamilyen módon definiált legfeljebb megszámolható halmaz. + + \subsection*{Invariáns} + + Az invariáns lényege, hogy ezt a tulajdonságot soha nem sérthetjük meg. Például halmaz típus esetén nem szabad, hogy megsérüljön + az az invariáns tulajdonság, hogy egy halmazban egy elem csak egyszer fordulhat elő. + + \subsection*{Reprezentáció} + + Azt, hogy egy típust milyen típusok segítségével, milyen módszerrel, stb., valósítottunk meg, reprezentációnak nevezzük. Például + egy verem típust meg lehet valósítani tömb segítségével, de láncolt listával is.\\ + + \noindent A reprezentáció a típusspecifikáció típusértékhalmazának leképezése a konkrét típusban, amit a reprezentációs függvény ad meg. + + \subsection*{Implementáció} + + Az implementáció a típusspecifikáció típusműveleteinek megvalósítása a konkrét típus programhalmaza által.\\ + + \noindent Az implementáció során a típus megvalósításakor a típusértékhalmaz megadását követően definiálni kell a típusműveleteket. Ahogyan a modellben is, a gyakorlatban is az állapottér változásait a program csak a típusműveleteken keresztül végezheti el. + + \subsection*{Emészthetőbb módon} + + \begin{figure}[H] + \centering + \includegraphics[width=0.75\linewidth]{img/adattipus} + \caption{Adattípus} + \label{fig:adattipus} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.75\linewidth]{img/adattipus_pelda} + \caption{BigNumber példa} + \label{fig:adattipus_pelda} + \end{figure} + \newpage + + \section*{A visszavezetés módszere} + + A programozási feladatok megoldásához különböző programozási mintákat, ún. programozási tételeket használunk fel, ezekre vezetjük vissza + a megoldást.\\ + + \noindent A visszavezetés lépései: + \begin{enumerate} + \item Megsejtjük a feladatot megoldó programozási tételt. + \item Specifikáljuk a feladatot a programozási tétel jelöléseivel. + \item Megadjuk a programozási tétel és a feladat közötti eltéréseket: + \begin{itemize} + \item intervallum határok: konkrét érték vagy kifejezés (pl. $[1..\frac{n}{2}]$), + a típusuk a $\mathbb{Z}$ helyett lehet annak valamely része (pl. $\mathbb{N}$) + + \item $\beta:[m..n] \to \mathbb{L}$ és/vagy $f:[m..n] \to H$ konkrét megfelelői + + \item a H megfelelője a szükséges művelettel + \begin{itemize} + \item $(H,>)$ helyett pl. $(\mathbb{Z},>)$ vagy $(\mathbb{Z},<)$ + \item $(H,+)$ helyett pl. $(\mathbb{Z},+)$ vagy $(\mathbb{R},*)$ + \end{itemize} + \item a változók átnevezése + \end{itemize} + \item A különbségek figyelembe vételével a tétel algoritmusából elkészítjük a konkrét feladatot megoldó algoritmust. + \end{enumerate} + + \section*{Felsoroló, a felsoroló típus specifikációja} + + A gyűjtemény (tároló, kollekció, iterált) egy olyan adat (objektum), amely valamilyen elemek tárolására alkalmas. + \begin{itemize} + \item Ilyenek az összetett szerkezetű, de különösen az iterált szerkezetű típusok értékei: halmaz, sorozat (verem, sor, fájl), fa, gráf + + \item De vannak úgynevezett virtuális gyűjtemények is: pl. egész számok + egy intervallumának elemei, vagy egy természetes szám prím-osztói + \end{itemize} + + \noindent Egy gyűjtemény feldolgozásán a benne levő elemek + feldolgozását értjük. + {\color{mygray} + \begin{itemize} + \item Keressük a halmaz legnagyobb elemét! + \item Hány negatív szám van egy számsorozatban? + \item Válogassuk ki egy fa leveleiben elhelyezett értékeket! + \item Járjuk be az [m .. n] intervallum minden második elemét visszafelé! + \item Adjuk össze az n természetes szám prím-osztóit! + \end{itemize} + } + + \noindent A feldolgozni kívánt elemek felsorolását (bejárását) az alábbi + műveletekkel szabványosítjuk: + \begin{itemize} + \item First() : Rááll a felsorolás első elemére, azaz elkezdi a felsorolást + \item Next() : Rááll az elkezdett felsorolás soron következő elemére + \item End() : Mutatja, ha a felsorolás végére értünk + \item Current() : Visszaadja a felsorolás aktuális elemét\\ + \end{itemize} + + \noindent Egy felsorolásnak különböző állapotai vannak + \begin{itemize} + \item indulásra kész + \item folyamatban van + \item befejeződött\\ + \end{itemize} + + \noindent A műveletek csak bizonyos állapotokban értelmezhetők (máshol a hatásuk nem definiált). \\ + + \noindent A feldolgozó algoritmus garantálja, hogy a felsoroló műveletek mindig megfelelő állapotban kerüljenek végrehajtásra. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\linewidth]{img/felsorolas_stuki} + \caption{A felsorolás algoritmusa} + \label{fig:felsorolas_stuki} + \end{figure} + + A felsorolást sohasem a felsorolni kívánt gyűjtemény, hanem egy külön felsoroló objektum végzi. + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_speci} + \caption{A felsoroló objektum és típusa} + \label{fig:felsorolas_stuki} + \end{figure} + + \section*{Felsorolóra megfogalmazott programozási tételek} + + A következő szakaszban találhatóak a felsorolókra megfogalmazott programozási tételek progos definíciója, valamint stuktorgramja. + + \includepdf[pages={1-2}]{progtetel_felsorolo.pdf} + + \section*{Nevezetes gyűjtemények felsorolói} + + \subsection*{Intervallum} + \begin{figure}[H] + \centering + \includegraphics[width=0.75\linewidth]{img/felsorolo_intervallum} + \caption{Intervallum felsorolója} + \label{fig:felsorolo_intervallum} + \end{figure} + + \subsection*{Tömb} + Itt két különböző tömbtípus felsorolóját mutatjuk be: az egydimenziós (vektor) és a kétdimenziós tömbét (mátrix). + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_vektor} + \caption{Vektor felsorolója} + \label{fig:felsorolo_vektor} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_matrix} + \caption{Mátrix sorfolytonos felsorolója} + \label{fig:felsorolo_matrix} + \end{figure} + + \noindent \emph{Megjegyzés}: a felsorolás történhet másképpen is, például vektor esetén végezhetjük a felsorolást visszafelé, a tömb végétől kezdve, vagy mátrixnál alkalmazhatunk pl. oszlopfolytonos bejárást. + + \subsection*{Sorozat} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_sorozat} + \caption{Sorozat felsorolója} + \label{fig:felsorolo_sorozat} + \end{figure} + + \subsection*{Halmaz} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_halmaz} + \caption{Halmaz felsorolója} + \label{fig:felsorolo_halmaz} + \end{figure} + + \subsection*{Szekvenciális inputfájl} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/felsorolo_seqin} + \caption{Szekvenciális inputfájl felsorolója} + \label{fig:felsorolo_seqin} + \end{figure} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Hasznalatieset.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Hasznalatieset.png new file mode 100644 index 0000000..c5def62 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Hasznalatieset.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Kompozicio2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Kompozicio2.png new file mode 100644 index 0000000..8797981 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Kompozicio2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Objektum.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Objektum.png new file mode 100644 index 0000000..f4f3dc5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Objektum.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Plane.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Plane.png new file mode 100644 index 0000000..e2409d3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Plane.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Tevekenyseg2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Tevekenyseg2.png new file mode 100644 index 0000000..4fb9c8f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/Tevekenyseg2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio.png new file mode 100644 index 0000000..a17c9ea Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio2.png new file mode 100644 index 0000000..670b1d5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aggregacio2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aktivacios_eletvonal.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aktivacios_eletvonal.png new file mode 100644 index 0000000..e8048c9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/aktivacios_eletvonal.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio.png new file mode 100644 index 0000000..093e2f6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio2.png new file mode 100644 index 0000000..c10b2d3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/asszociacio2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/diagram.drawio new file mode 100644 index 0000000..d746de6 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/eletvonal.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/eletvonal.png new file mode 100644 index 0000000..757ab46 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/eletvonal.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/evolucios.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/evolucios.png new file mode 100644 index 0000000..cb40931 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/evolucios.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kompozicio.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kompozicio.png new file mode 100644 index 0000000..581e96c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kompozicio.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kovetelmenyleiras.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kovetelmenyleiras.png new file mode 100644 index 0000000..b66cfcc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/kovetelmenyleiras.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/nemfunkckov.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/nemfunkckov.png new file mode 100644 index 0000000..a9a64d1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/nemfunkckov.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/oroklodes.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/oroklodes.png new file mode 100644 index 0000000..1d089c6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/oroklodes.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/osztaly.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/osztaly.png new file mode 100644 index 0000000..ba90246 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/osztaly.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/spiral.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/spiral.png new file mode 100644 index 0000000..c057b2e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/spiral.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/szekvencia_pelda.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/szekvencia_pelda.jpg new file mode 100644 index 0000000..d6dbbdd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/szekvencia_pelda.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/tevekenyseg.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/tevekenyseg.png new file mode 100644 index 0000000..2ad887f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/tevekenyseg.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/vizeses.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/vizeses.png new file mode 100644 index 0000000..e07427f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/img/vizeses.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.pdf new file mode 100644 index 0000000..7462256 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.tex new file mode 100644 index 0000000..8514724 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/08.Programfejlesztési modellek/tetel8.tex @@ -0,0 +1,663 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage[hungarian]{babel} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{listings} +\usepackage{makecell} +\usepackage{url} +\usepackage{multirow} +\usepackage{verbatim} + + \geometry{ + a4paper, + total={170mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{8. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + {\Large\bfseries\noindent 8. Programfejlesztési modellek} \\ + + \section*{Nagy rendszerek fejlesztési fázisai, kapcsolataik} + + \subsection*{Fejlesztési fázisok} + \begin{enumerate} + \item \textbf{A probléma megoldásának előzménye} + + Egy probléma megoldása előtt meg kell vizsgálni a megvalósíthatóságát, és annak mikéntjét.\\ + + \noindent Eredmény: \textit{Megvalósíthatósági tanulmány}, mely a következőkre válaszol: + \begin{itemize} + \item Erőforrások (hardver, szoftver, szakember) + \item Költségek + \item Határidő + \item Üzemeltetés + \end{itemize} + \item \textbf{Követelmények leírása} + + \noindent Rendszerint iteratív módon állítjuk elő, és a prototípust használjuk a finomításra (ábra \ref{fig:kovetelmenyleiras}). + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/kovetelmenyleiras.png} + \caption{Követelményleírás elkészítésének folyamata} + \label{fig:kovetelmenyleiras} + \end{figure} +\newpage + \textbf{Követelmények leírásának tartalma:} + + \begin{itemize} + \item Probléma + \item Korlátozó tényezők (hardver, szoftver, stb.) + \item Elfogadható megoldás + \end{itemize} + + \textbf{Követelmények leírásának fajtái:} + + \begin{itemize} + \item \textbf{\emph{Funkcionális követelmények}} + + A rendszer szolgáltatásainak, leképzéseinek leírása: + \begin{itemize} + \item Elindítás formája + \item Bemenő adatok (és azok megadásának formája) + \item Igénybevétel előfeltétele, korlátozások + \item Szolgáltatás kezdeményezésére a válasz, eredmények + \item Válasz megjelenési formája + \item Bemenő adatok és válasz közti reláció + \end{itemize} + \item \textbf{\emph{Nem funkcionális követelmények}} + + A nem funkcionális követelményeket rendszerint három osztályba soroljuk: a termék követelményei, menedzselési követelmények, külső követelmények. Az osztályokat tovább lehet bontani (ábra \ref{fig:nemfunkckov}). + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/nemfunkckov.png} + \caption{Nem funkcionális követelmények osztályozása} + \label{fig:nemfunkckov} + \end{figure} + \end{itemize} +\newpage + \item \textbf{Követelmények elemzése és prototípus} + + A következőket kell megvizsgálni: + \begin{itemize} + \item Önmagában jó-e a követelmények leírása? + \begin{itemize} + \item Konzisztens (nincs ellentmondás) + \item Komplett (teljes) + \end{itemize} + \item Validáció vizsgálat + + (Megfelel-e a felhasználó által elképzelt problémának?) + + \item Megvalósíthatósági vizsgálat + + (A követelményeknek megfelelő megoldás megvalósítható-e?) + + \item Tesztelhetőségi vizsgálat + + (A követelmények úgy vannak-e megfogalmazva, hogy azok tesztelhetők?) + + \item Nyíltság kritériumainak vizsgálata + + (A követelmények nem mondanak-e ellent a módosíthatóság, a továbbfejleszthetőség + követelményének?) + \end{itemize} + + \noindent A követelmények elemzésének egyik eszköze a prototípus-készítés. A prototípus magas szintű programozási környezetben létrehozott, a külső viselkedés szempontjából helyes megoldása a problémának. + \item \textbf{Programspecifikáció} + + \noindent A programspecifikáció a következő kérdésekre kell, hogy válaszoljon a követelmények leírása alapján: + + \begin{itemize} + \item Mik a bemenő adatok? (Forma, jelentés, megjelenés.) + \item Mik az eredmények? (Forma, jelentés, megjelenés.) + \item Mi a reláció a bemenő adatok és az eredmény adatok között? + \end{itemize} + \item \textbf{Tervezés} + + A tervezés során a következő kérdésekre adjuk + meg a választ: + \begin{enumerate} + \item Statikus modell + \begin{itemize} + \item Rendszer szerkezete + \item Programegységek, azok feladata és kapcsolata + \end{itemize} + \item Dinamikus modell + \begin{itemize} + \item Hogyan oldja meg a rendszer a problémát? + \item Milyen egységek működnek együtt? + \item Milyen üzenetek játszódnak le? + \item Rendszer és egységek állapotai + \item Események (melyek hatására állapotváltás történik) + \end{itemize} +\newpage + \item Funkcionális modell + \begin{itemize} + \item Milyen adatáramlások révén valósulnak meg a szolgáltatások? + \item Milyen leképezések játszanak szerepet az adatáramlásokban? + \item Mik az ajánlások az implementáció számára? + \begin{itemize} + \item Implementációs stratégiára vonatkozó ajánlás. + \item Programozási nyelvre vonatkozó előírás, ajánlás. + \item Tesztelési stratégiára vonatkozó ajánlás. + \end{itemize} + \end{itemize} + \end{enumerate} + + A gyakorlatban két tervezési módszer terjedt el: + \textit{procedurális} és a \textit{objektumelvű} + \begin{itemize} + \item \textit{Procedurális}: megvalósítandó funkciókból, műveletekből indulunk ki, és ezek alapján bontjuk fel a rendszert kisebb összetevőkre, modulokra\\ + \item \textit{Objektumelvű}: a rendszer funkciói helyett az adatokat állítjuk a tervezés középpontjába. A rendszer által használt adatok felelnek meg majd bizonyos értelemben az objektumoknak. + \end{itemize} + + \item \textbf{Implementáció} + + Fontos szempontok: + \begin{itemize} + \item Reprezentáció (Adatok ábrázolása) + \item Események leképezések megvalósítása + + Algoritmusok és optimalizálások + \end{itemize} + + Az implementáció egyik alapvető kérdése az implementációs stílus. + A jó programozási stílus néhány fontos eleme: + \begin{itemize} + \item absztrakció különböző szintjeinek alkalmazása + \item öröklődési technika használata, absztrakciós szintek hierarchikus + rendszere + \item absztrakciós szintekre bontás osztályon belül (deklaráció + megvalósítás) + \item korlátolt láthatóság + \item információ elrejtés (information hiding) + \item információ beburkolás (encapsulation) + \end{itemize} + + \item \textbf{Verifikáció, validáció} + + A rendszer eleget tesz-e a vele szemben támasztott elvárásoknak? + + Verifikáció: a specifikációszerinti helyesség igazolása + + Validáció: Minőségi előírások teljesítése (robusztusság hatékonyság, erőforrásigény) + + Ennek folyamata: tesztelés, melynek szakaszai: + \begin{itemize} + \item Egységteszt + \item Rendszerteszt + \end{itemize} + A tesztelésnek két módja lehet: + \begin{itemize} + \item fekete doboz - Csak a maguknak a hibáknak a felderítése. Nem veszi figyelembe a program belső működését. + \item fehér doboz - Hibák helyének felderítése. Figyelembe veszi a belső működést. + \end{itemize} + + \item \textbf{Rendszerkövetés és karbantartás} (maintenance) + + Karbantartás: Üzemebe helyezés után szükségessé váló szoftver jellegű munkák [pl.: rejtett hibák kijavítása, adaptációs munkák (új hardver-, szoftverkörnyezet), továbbfejlesztési munkák] + + Rendszerkövetés: a felhasználókkal való kapcsolattartás menedzsment jellegű, dokumentációs feladatai [pl.: konfigurációk nyilvántartása, verziók menedzselése, dokumentáció menedzselése] + + \item \textbf{Dokumentáció} + + Egy nagy méretű program önmagában nem tekinthető szoftverterméknek + dokumentáció nélkül. Egy jó dokumentáció a következőképp épül fel. + \begin{itemize} + \item Felhasználói leírás + \begin{itemize} + \item Feladatleírás + \item Futtató környezet + \item Fejlesztések, verziók + \item Installálás + \item Használat + \item Készítők + \end{itemize} + \item Fejlesztői leírás + \begin{itemize} + \item Modulok (és azok szerkezete) + \item Osztályok (és azok kapcsolata) + \item Rendszer dinamikus viselkedése + \item Osztályok implementálása (adatszerkezetek, sablon osztályok) + \item Tesztelés + \end{itemize} + \end{itemize} + \end{enumerate} + + \subsection*{Fejlesztési fázisok kapcsolatai} + + A fejlesztési fázisok leírására többféle modellt használhatunk + \begin{enumerate} + \item \textbf{Vízesés modell} + + Az egyes fázisok egymást követik, a + módosítások a futtatási eredmények ismeretében történnek. Egy bizonyos + fázisban elvégzett módosítás az összes rákövetkező fázist is érinti. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/vizeses.png} + \caption{Vízesés modell} + \label{fig:vizeses} + \end{figure} + + Hárányai: + \begin{itemize} + \item Új szolgáltatás minden fázison módosítást igényel + \item Validáció az egész életciklus megismétlését követelheti meg + \end{itemize} + \item \textbf{Evolúciós modell} + + A megoldást közelítő verzióinak, prototípusainak sorozatát + állítjuk egymás után elő, és így haladunk lépésenként egészen a végleges + megoldásig. Ennek során egy verzió elkészítésekor a specifikáció, a fejlesztés és a validáció párhuzamosan történik. + + \begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{img/evolucios.png} + \caption{Evolúciós modell} + \label{fig:evolucios} + \end{figure} +\newpage + Hárányai: + \begin{itemize} + \item Nehéz a projekt áttekintése + \item A gyors fejlesztés rendszerint a dokumentáltság rovására megy. + \end{itemize} + \item \textbf{Boehm-féle spirális modell} + + Ez a modell egy iterációs modell. Az iteráció a spirális egy + fázisával modellezhető, amely négy szakaszra bontható: + \begin{enumerate} + \item Célok, utak, alternatívák, korlátozások definiálása + \item Kockázatelemzés, stratégia kidolgozás + \item Feladat megoldása, validáció + \item Következő iteráció megtervezése + \end{enumerate} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/spiral.png} + \caption{Evolúciós modell} + \label{fig:spiral} + \end{figure} + + Hárányai: + \begin{itemize} + \item A modell alkalmazása általában munkaigényes, bonyolult feladat. + \item A projekt kidolgozásához szükséges szakembereket nem könnyű + gazdaságosan foglalkoztatni. + \end{itemize} + \end{enumerate} + + \section*{Az objektumelvű modellezés nézetrendszerei} + + \textbf{Objektumelvű programozás} = adatabsztrakció + absztrakt adattípus + típusöröklődés + \begin{itemize} + \item Absztrakció + + Programozás adott szintjén a megoldás szempontjából + lényegtelen részletek elhanyagolása. + + \item Adattípus + + Az adattípus egy $ (A,F) $ rendezett pár, ahol $ A $ az adatok halmaza $ F $ pedig a műveletek véges halmaza. + \[ + \forall f \in F | f : A^n \rightarrow A + \] + Létezik egyszerű és összetett adattípus.\\ + \textbf{Típusosztály:} A típus komplex leírása, mely az adott adattípus \underline{absztrakt} (PAR + EXP) és \underline{konkrét} (IMP + BODY) leírását szolgálja, azaz:\\\\ + Típusosztály = (PAR, EXP, IMP, BODY), ahol:\\ + PAR = \textless paraméterek tulajdonságai \textgreater\\ + EXP = \textless típusobjektumok halmaza és műveletei neve, szintaktikája, szemantikája \textgreater\\ + IMP = \textless más osztályból átvett szolgáltatások \textgreater\\ + BODY = \textless típusosztály ábrázolása, megvalósítása \textgreater\\ + + \item Típusöröklődés + + A típusöröklődés két fő formája: \textit{specializáció} és \textit{újrafelhasználás} + \begin{enumerate} + \item A subclass átveszi az absztrakt tulajdonságokat és azt az export részben használja fel + \item Típushalmaz, paraméterhalmazok, műveletek nevei átdefiniálódhatnak. + \item subclass típushalmaza = superclass típushalmaza + \end{enumerate} + + A specializáció következményei: + \begin{itemize} + \item Polimorfizmus + + Minden változónak két típusa van: \textit{statikus} (deklaráció során kapott) és \textit{dinamikus} (deklaráció pillanatában megegyezik a statikussal, de később megváltozhat, ha egy superclass példánynak adunk értékül egy subclass példányt) + \item Dinamikus kötés + + A dinamikus típusnak megfelelő kiszámítási szabály hozzárendelése a függvényhez attribútumhoz, a végrehajtás pillanatában + \end{itemize} + + \paragraph{Nézetrendszerek} + + \begin{itemize} + \item Használati szempont + + Kinek nyújt a rendszer szolgáltatást? (Személyek vagy más rendszerek, programok) + + \item Szerkezetei strukturális, statikus szempont + + Milyen egységek vannak, ezeknek mi a feladata, és hogyan kapcsolódnak egymáshoz? + + \item Dinamikus szempont + + Az egyes részegységek hogyan viselkednek, milyen állapotokat vesznek fel, azokat milyen események hatására váltják? Milyen az egységek között együttműködés mechanizmusa? Időben hogyan játszódnak le közöttük az üzentek? + + \item Implementációs szempont + + Milyen szoftverkomponensek, és azok között milyen kapcsolatok vannak? + + \item Környezeti szempont + + A rendszer milyen hardver és szoftver erőforrást igényel a megoldás során? + \end{itemize} + \end{itemize} + + \section*{Statikus modell (osztálydiagram, objektumdiagram)} + + \subsection*{Osztálydiagram} + + A megoldás szerkezetét leíró összefüggő gráf, melynek csomópontjaihoz az osztályokat, éleihez pedig az osztályok közötti relációkat (öröklődés, asszociáció, aggregáció, kompozíció) rendeljük. + + \noindent A rendszerhez csak egy osztálydiagram tartozik. + + \paragraph*{Osztályok\\} + + Egy osztály a következőképp néz ki: + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/osztaly.png} + \caption{Osztály} + \end{figure} + + Az osztályt leíró téglalap három részre van osztva. + \begin{itemize} + \item Az első részbe az osztály neve kerül. + + Ha az osztály absztrakt, a nevét dőlt betűvel írjuk. + + \item A második részbe az osztály attribútumai kerülnek. + + Az attribútum formátuma: \textit{Attribútumnév : Típus}\\ + A statikusságot aláhúzással jelöljük.\\ + Az attribútumok láthatóságát is fel lehet tüntetni: + \begin{itemize} + \item \textit{publikus (+)} + \item \textit{privát (-)} + \item \textit{védett (\#)} + \end{itemize} + + \item A harmadik részbe az osztály metódusai kerülnek. + + A metódusok formátuma: \textit{Metódusnév(Paraméterlista):Visszatérési érték}, ahol a paraméterlista \textit{Paraméternév:Típus} fomrátumú paraméterekből áll. + Absztraktságot, statikusságot, és láthatóságot az előzőekben leírtakkal azonosan jelöljük.\\ + \end{itemize} + \paragraph*{Osztályok közötti kapcsolatok\\} + + \begin{itemize} + \item Öröklődés + + Két osztály közötti absztrakciós kapcsolatot jelöl + \begin{figure}[H] + \centering + \includegraphics[width=0.2\textwidth]{img/oroklodes.png} + \caption{Öröklődés} + \end{figure} + + \item Asszociáció + + Ez a legáltalánosabb reláció két osztály között. Az asszociáció két osztály közötti absztrakt reláció, amely kétirányú társítást fejez ki. A reláció absztrakt volta azt jelenti, hogy a reláció konkretizálása osztályok objektumainak összekapcsolásában valósul meg. + + Az asszociációnak lehet: + \begin{itemize} + \item Neve, azonosítója + \item Iránya + \item Multiplicitása + + Akár egy érték, akár intervallum. A * szimbólum kitüntetett szerepet kap, jelentése: bármennyi, akár nulla is. (Pl: 3, 1..4, 5..*, *) + \item Szerepe + \item Navigálhatósága + + A társított osztályok közül csak az egyik ismeri a másikat. (Ha nem tüntetjük fel, kölcsönös elérhetőséget feltételezünk) + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/asszociacio.png} + \caption{Asszociáció} + \end{figure} + \end{itemize} +\newpage + \item Aggregáció + + Az aggregáció egy speciális asszociáció, mely egész-rész kapcsolatot fejez ki. Azonban ha két osztály között aggregációs reláció áll fenn, a két osztály objektumai egymástól függetlenül is létezhetnek (Ezt un. laza tartalmazási relációnak nevezik) A relációt jellemzi ezen kívül a tranzitivitás, és a közös attribútumok illetve szolgáltatások. Különböző aggregátumoknak lehetnek közös komponenseik. + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/aggregacio.png} + \caption{Aggregáció} + \end{figure} + \item Kompozíció + + A kompozíció egy speciális aggregáció, mely \textit{fizikai} tartalmazást jelöl. Nem jellemzi többé az objektumok független létezése, a két objektum egyszerre jön létre és szűnik meg. Tehát a tartalmazó objektumnak gondoskodnia kell a tartalmazott létrehozásáról és megszüntetéséről. Egy komponens legfeljebb egy tartalmazó \underline{objektumhoz} tartozhat. A kompozíciós kapcsolat és az attribútum jellegű kapcsolat két objektum között szemantikailag azonos. + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/kompozicio.png} + \caption{Kompozíció} + \end{figure} + \end{itemize} + + \subsection*{Objektumdiagram} + + Az objektumdiagram egyszeresen összefüggő gráf, amelynek csomópontjaihoz az objektumokat, éleihez pedig az objektumok közötti összekapcsolásokat rendeljük. + + \noindent A rendszerhez különböző időpillanatokban más-más objektumdiagram tartozhat. (Viszont mindegyiknek meg kell felelnie az osztálydiagramnak) + + \begin{itemize} + \item \textbf{Objektumok} + Az objektumokat az osztályokhoz hasonlóan egy téglalap írja le. Egy ilyen téglalapnak két része van. Az első részben az objektum neve (opcionális) és típusa található a következő formátumban: \textit{Objektumnév : Típus}, melyet aláhúzással tarkítunk. A második részbe az objektum attribútumai és azok értékei kerülhetnek, a következő formátumban: \textit{Attribútumnév=érték}. + \begin{figure}[H] + \centering + \includegraphics[width=0.2\textwidth]{img/objektum.png} + \caption{Objektum} + \end{figure} + \item \textbf{Objektumok közötti kapcsolatok} + Az objektumokat összekötő relációk az osztálydiagramon lévőkkel megegyezőek (Öröklődésnek ezen a szinten nincs értelme): + \begin{itemize} + \item \textbf{Asszociáció} + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/asszociacio2.png} + \caption{Asszociáció} + \end{figure} + \item \textbf{Aggregáció} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/aggregacio2.png} + \caption{Aggregáció} + \end{figure} + \item \textbf{Kompozíció} + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/kompozicio2.png} + \caption{Aggregáció} + \end{figure} + \end{itemize} + \end{itemize} + + \section*{Dinamikus modell (állapotdiagram, szekvenciadiagram,\\ együttműködési diagram, tevékenységdiagram)} + + \subsection*{Állapotdiagram} + + Az állapotdiagram egy összefüggő irányított gráf, amelynek csomópontjaihoz az állapotokat rendeljük, éleihez pedig az eseményeket. (Két csúcs között több állapotátmenetet is jelölhetünk, hiszen több esemény hatására is létrejöhet) + \begin{itemize} + \item \textbf{Állapot}: + Az objektum állapotát az attribútumok konkrét értékeinek n-esével jellemezzük. + + Az állapotnak van azonosítója, mely legtöbbször az állapot neve\\ + (de lehet maga az invariáns, vagy az attribútumok konkrét értéke). \\ + Az állapotot esemény hozza létre és szünteti meg. Az állapot mindaddig fennmarad, míg az attribútumok kielégítik az állapotot leíró invariánst. Az állapotot egy lekerekített téglalappal jelöljük, melyben az azonosítót tüntetjük fel. + + Speciális (rendszeren kívüli) állapotok: Kezdőállapot, Végállapot + \item \textbf{Esemény}: + Eseménynek nevezzük azt a tevékenységet, történést, amely valamely objektum állapotát megváltoztatja. + + Az esemény lehet paraméteres vagy paraméter nélküli, és lehet előfeltétele. Az események között sorrendiség áll fent, így egy esemény lehet megelőző eseménye. Egy eseményt a következőképp írhatunk le:\\ + \textless esemény \textgreater (\textless paraméterek\textgreater)[\textless feltétel\textgreater]/\textless megelőző esemény\textgreater + + Az eseményeket az állapotok közötti állapotátmenetekre írjuk. + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/plane.png} + \caption{Repülőgép állapotgépe} + \end{figure} + \end{itemize} + + \subsection*{Szekvenciadiagram} + + A szekvencia diagram az objektumok közötti üzenetváltások időbeli menetét szemlélteti. + \begin{itemize} + \item \textbf{Osztályszerep}: + Az osztály szerepét olyan egy vagy több objektum testesíti meg, melyek az üzenetküldés szempontjából konform módon viselkednek. + \item \textbf{Osztályszerep életvonal}: + Az életvonal az osztályszerep időben való létezését jelenti. + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/eletvonal.png} + \caption{Életvonal} + \end{figure} + \item \textbf{Aktivációs életvonal}: + Az aktivációs életvonal azt az állapotot jelenti, amikor az osztályszerep megtestesítői műveleteket hajtanak végre, vagy más objektumok vezérlése alatt állnak. + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/aktivacios_eletvonal.png} + \caption{Aktivációs életvonal} + \end{figure} + \item Üzenet + Az üzenet az objektumok közötti információátadás formája. Az üzenet küldésének az a célja, hogy az objektum működésbe hozza a másik objektumot. Az üzenet azok között az objektumok között jöhet létre, amelyek az objektumdiagramban kapcsolatban állnak. Az üzenetnek van azonosítója (neve, szövege), lehet paramétere, sorszáma. + \begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{img/szekvencia_pelda.jpg} + \caption{Szekvencia diagram} + \end{figure} + \blfootnote{https://gyires.inf.unideb.hu/KMITT/c02/images/image64.jpg} + \end{itemize} + + \subsection*{Együttműködési diagram} + + \noindent Az együttműködési diagram azt hivatott bemutatni, hogy miként működnek együtt az osztályok objektumai, milyen üzenetek cseréje révén valósul meg ez az együttműködés. + (Csak azok az objektumok relevánsak, amelyek osztályait az osztálydiagramban asszociációs kapcsolat köt össze. A diagram mutatja ezt az összekapcsolást és az ehhez tartozó üzenetváltásokat, ezért az együttműködési diagram az objektumdiagram bizonyos értelemben vett kiterjesztésének tekinthető.) + + \noindent Az üzenet küldését egy nyíl mutatja, amely az asszociáció mellett kap helyet és a címzett irányába mutat. Az üzenet azonosítója a nyíl mentén helyezkedik el. Az üzenetnek lehet argumentuma és eredménye. Ezeket egy kis körből induló nyíl mellett helyezzük el, ahol a nyíl az információ áramlásának irányát mutatja. + + \subsection*{Tevékenységdiagram} + + \noindent A tevékenységdiagram (aktivációs diagram) a probléma megoldásának lépéseit szemlélteti, a párhuzamosan zajló vezérlési folyamatokkal együtt. + + \noindent Ha egy tevékenységet egy másik tevékenység követ közvetlenül, akkor a két tevékenységet nyíllal kötjük össze. Ha adatot (objektumot) ad át egy tevékenység egy másik tevékenységnek, akkor a küldő tevékenységből szaggatott nyíl vezet az objektumot reprezentáló téglalaphoz, és a téglalaptól szaggatott nyíl mutat a fogadó tevékenységre. A téglalapban szögletes zárójelek között megadhatjuk az objektum állapotát, státuszát is. + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/tevekenyseg.png} + \caption{Objektum átadás} + \end{figure} + + \noindent Lehetőség van arra, hogy bizonyos feltételek teljesülése esetén eltérő tevékenységeket hajtsunk végre, illetve tevékenységek végrehajtását feltételekhez kössük. Ekkor egy rombuszt kell elhelyeznünk a diagramban, amelyből kivezető nyilakra írjuk a feltételeket. + + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/tevekenyseg2.png} + \caption{Feltétel ábrázolása} + \end{figure} + + \section*{Használati esetek diagramja} + + \noindent A használati esetek diagramja a felhasználók szempontjából kívánja szemléltetni azt, hogy a rendszer miként működik, függetlenül attól, hogy a szolgáltatásait hogyan valósítja meg.\\ + + \noindent A diagram részei: + \begin{itemize} + \item használati esetek (a rendszer funkciói) + \item aktorok (a rendszeren kívüli, azzal interakcióba lépő egységek) + \item relációk (két használati eset, vagy egy aktor és egy használati eset között állnak fent) + \end{itemize} + + \noindent A használati esetek a rendszer funkcióinak összefoglalásai, szolgáltatási egységek. Ez az egység az akcióknak egy olyan sorozata, amelyekkel a rendszer a felhasználók egy csoportjával működik együtt.\\ + + \noindent A használati esetet egy ovális alakzattal jelöljük. A használati eseteket téglalapba foglaljuk, ez jelzi a rendszer határait.\\ + + \noindent A felhasználók az adott rendszeren kívüli egységek, más programrendszerek, alrendszerek, osztályok, illetve személyek lehetnek. Ezek aktor szerepet töltenek be. A diagramon egy pálcikaember figurával jelöljük.\\ + + \noindent A felhasználási relációk kapcsolják össze a használati eseteket a felhasználókkal. A relációk egymással is kapcsolatban állhatnak, amit a diagramban fel lehet tüntetni.\\ + + \noindent A lehetséges relációk a következők: + \begin{itemize} + \item \textbf{Asszociáció}: Egy felhasználó és egy használati eset közötti kapcsolatot jelez.\\ + (Egyszerű vonal) + \item \textbf{Általánosítás}: Az egyik használati eset a másik általánosabb formája.\\ + (Egyszerű vonal, végén fehér háromszöggel) + \item \textbf{Kiterjesztés}: Az egyik használati eset a másikat terjeszti ki. Ennek során viselkedéseket illeszt be megadott beszúrási pontoknál.\\ + (Szaggatott nyíl $\ll$extend$\gg$ felirattal) + \item \textbf{Tartalmazás}: Az egyik használati eset tartalmazza a másik viselkedését.\\ + (Szaggatott nyíl $\ll$include$\gg$ felirattal) + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/hasznalatieset.png} + \caption{Használati esetek diagramja} + \end{figure} + + \noindent Az ügyfél akár pénzt vesz fel, akár az egyenlegét kérdezi le az ügyfél azonosítás mindkét folyamatnak része ($\ll$include$\gg$). Az automata előre megadott összegeket ajánl fel kivételre, de tetszőleges, az ügyfél által megadott összeg is kivehető ($\ll$exclude$\gg$).\\ + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/bajtkod_folyamatabra.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/bajtkod_folyamatabra.png new file mode 100644 index 0000000..8b55b12 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/bajtkod_folyamatabra.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/diagram.drawio new file mode 100644 index 0000000..7f7334c --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_folyamatabra.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_folyamatabra.png new file mode 100644 index 0000000..6b1d7f0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_folyamatabra.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_teljes_folyamata.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_teljes_folyamata.png new file mode 100644 index 0000000..4adc8d3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/forditas_teljes_folyamata.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/interpretalas_folyamatabra.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/interpretalas_folyamatabra.png new file mode 100644 index 0000000..0e7a54e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/img/interpretalas_folyamatabra.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.pdf new file mode 100644 index 0000000..0bf27dd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.tex new file mode 100644 index 0000000..a9a77ea --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/09.Programok fordítása és végrehajtása/tetel9.tex @@ -0,0 +1,716 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage{subcaption} +\usepackage{multirow} +\usepackage{listings} +\usepackage{hhline} +\usepackage{graphicx} +\usepackage{float} +\usepackage{fancyhdr} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{makecell} +\usepackage[utf8]{inputenc} +\usepackage[thinlines]{easytable} +\usepackage[table,xcdraw]{xcolor} +\usepackage[normalem]{ulem} +\usepackage[a4paper, margin=1in]{geometry} +\usepackage{enumitem} +\usepackage{xcolor} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} +\definecolor{mygray}{rgb}{0.15, 0.15, 0.15} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +% A dokument itt kezdődik +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{9. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\huge\bfseries\noindent 9. Programok fordítása és végrehajtása} \\ + \end{center} + +\section*{Bevezetés} + + Amikor programot írunk, azt valamilyen programozási nyelven tesszük. Ezt a programozási nyelvtől függvényében vagy lefordítjuk a gép által értelmezhető kódra, vagy interpreterrel futtatjuk azt. + +\section*{Fordítás és Interpretálás} + +\subsection*{Fordítás} + + A fordítás során általában egy magas szintű programozási nyelvből gépi kód keletkezik, amelyet a processzor már képes értelmezni és futtatni.\\ + + \noindent A következő elönyei vannak: + \begin{itemize} + \item \textbf{Gyors}, mivel a lexikális, szintaktikus és szemantikus elemzés fordítási időben, egyszer fut le, valamint ekkor optimalizáljuk a kódot. + \item \textbf{Fordítási időben sok hibát ki lehet szűrni}, ezáltal megkönnyítve a hibakeresést (debuggolást). + \item A gépi kód \textbf{nehezen visszafejthető}. (Reverse-engineering nehézkes) + \end{itemize} + Általában nagyobb programokhoz használjuk, ahol fontos a hatékonyság. A lefordított kódon később már nem (vagy csak nagyon nehezen) tudunk változtatni.\\ + + \noindent Hátránya, hogy a keletkezett kód nem platformfüggetlen, minden architektúrára külön-külön le kell fordítani.\\ + + \noindent \textbf{Például}: C, C++, Ada, Haskell + + \begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{img/forditas_folyamatabra.png} + \caption{A fordítás folyamata} + \label{fig:forditas_folyamatabra} + \end{figure} + + +\subsection*{Interpretálás} + + Az interpretálás során az értelmező a programkódot futás közben hajtja végre.\\ + + \noindent A következő elönyei vannak: + \begin{itemize} + \item Az interpretert mindössze \textbf{egyszer kell csak megírni} az adott rendszerre. + \item \textbf{Platformfüggetlen}. + \end{itemize} + + \noindent Hátránya, hogy \textbf{nehéz} benne \textbf{a hibakeresés}. Sok olyan hiba maradhat a kódban, amit egy fordító kiszűrt volna (pl. típus egyezőség).\\ + + \noindent \textbf{Például}: PHP, JavaScript, ShellScript + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/interpretalas_folyamatabra.png} + \caption{Az interpretálás folyamata} + \label{fig:interpretalas_folyamatabra} + \end{figure} + + +\subsection*{Fordítás és Interpretálás együtt} + + Egyes nyelvek (pl. Java) előfordítást használnak, melynek eredménye a \textit{bájtkód}, amely gépi kód egy virtuális gép számára.\\ + + \noindent A következő elönyei vannak: + \begin{itemize} + \item Elérhető a \textbf{fordítási idejű hibaellenőrzés és optimalizálás}. + \item \textbf{Platformfüggetlenség}. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/bajtkod_folyamatabra.png} + \caption{Az interpretálás folyamata} + \label{fig:bajtkod_folyamatabra} + \end{figure} + + \section*{Fordítási egység és a szerkesztés} + + \noindent Fordítási egység a nyelvnek az az egysége, amely a fordítóprogram egyszeri lefuttatásával, a program többi részétől elkülönülten lefordítható. Ha programunkat fordítási egységekre tagoljuk, akkor elkerülhetjük azt, hogy egyetlen kisebb módosítás miatt a teljes programot újra kelljen fordítani.\\ + + \noindent Mivel a fordító a neki átadott forrásfájlokat teljes egészében feldolgozza, ezért a fordítási egységeket úgy tudjuk kialakítani, hogy a forrásprogramot nem egy fájlban helyezzük el, hanem fordítási egységenként tagoljuk. Ezzel a módszerrel egyből a forráskód logikai tagolása is megtörténik, így a forrásszöveg könnyebben áttekinthetővé és megérthetővé válik.\\ + + \noindent A tárgykód létrehozása két fázisban történik. + \begin{itemize} + \item Először a forrásfájlokat \textit{lefordítjuk}, ebből keletkezik az un. \textit{objektumkód} (pl.: .obj, .class). Ebben a gépi utasítások már megvannak, de hiányznak belőle a hivatkozások (pl változók, függvények), melyek más fájlokban vannak megvalósítva. + \textit{Fordítási egységnek} nevezzük azt, amiből egy objektumkód keletkezik. + + \item Második lépésben a \textit{linker} (szerkesztő) feladata, hogy a hiányzó referenciákat kitöltse, hogy egyetlen fájlt generálva futtatható kódot kapjunk.\\\\ + \noindent A linkelés lehet: + \begin{itemize} + \item \textbf{Statikus}: az object fájlokat fordítási időbe összeszerkesztjük a könyvtárakkal. + \item \textbf{Dinamikus}, betöltéskor (load-time): fordítási időben úgynevezett import könyvtárakat használunk, ezek a megosztott könyvtárakra vonatkozó hivatkozásokat tartalmaznak, amiket majd az operációs rendszer a program betöltésekor kapcsol hozzá a futtatható fájlhoz. Ha valamelyik hivatkozott megosztott könyvtár hiányzik, a programot nem lehet betölteni. + \item \textbf{Dinamikus, futtatáskor} (run-time): fordítási időben a megosztott könyvtárak betöltésére és az eljárások címeinek lekérdezésére vonatkozó rendszerhívások kerülnek a programba. A megosztott könyvtárak betöltése futás közben történik, amikor szükség van rájuk. Ezzel a megoldással lehetőség van arra, hogy a program a neki megfelelő verziójú könyvtárat megkeresse, vagy például a program indításkor ellenőrizze, hogy van-e egyáltalán ilyen. \end{itemize} + \end{itemize} + + \section*{A fordítóprogram komponensei} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/forditas_teljes_folyamata.png} + \caption{A fordítás lépései} + \label{fig:forditas_teljes_folyamatabra} + \end{figure} + + \subsection*{Lexikális elemző} + + \noindent A lexikális elemző feladata, hogy tokenekre bontsa a forráskódot. + + \begin{itemize} + \item Bemenete maga a forráskód. + \item Adott egy a nyelvre jellemző reguláris (hármas típusú) nyelvtan. Ez adja meg, hogy milyen típusú tokenek szerepelhetnek a forrásban. + A tokenekhez tulajdonságokat rendelhet (pl. változó neve, literál értéke). + \item Kimenete ez a tokensorozat. Amennyiben az elemző olyan karaktersorozatot talál, amelynek nem feleltethető meg token, akkor az lexikális hibát vált ki. + + \textit{Megjegyzés: Lexikális hibánál nem feltétlen szakad meg a fordítás folyamata, megpróbálhatjuk átugrani az adott részt és folytatni az elemzést, így ha több hiba is van, akkor azokat egyszerre jelezhetjük.} + \end{itemize} + + \noindent A reguláris kifejezéseket \emph{véges determinisztikus automatákkal} ismerjük fel.\\ + + \noindent Amennyiben egy lexikális elemre az egyik automata elfogadó állapotba kerül, úgy felismertünk egy tokent. Egy karaktersorozatot egyszerre több automata is felismerhet.\\ + + \noindent Ha a felismert tokenek \emph{azonos hosszúak}, akkor \emph{a nyelv konfliktusos}. Ennek nem szabad előfordulnia. Az viszont lehetséges, hogy egy szót, és az ő prefixét is felismerte egy automata. Ekkor mindig a hosszabbat választjuk. + +\subsection*{Szintaktikus elemző} + + A szintaxis elemző bemenete a lexikális elemző kimenete. \\\\ + Feladata, hogy + \begin{itemize} + \item \textit{szintaxisfát} építsen a tokenekből, a nyelvez tartozó egy környezetfüggetlen (kettes típusú) grammatika alapján, vagy ha ez lehetetlen, akkor + \item jelezze ezt \emph{szintaktikus hibaként}. + \end{itemize} + +\subsubsection*{LR0 elemzés} + + A lexikális elemző által előállított szimbólumsorozatot balról + jobbra olvassuk, a szimbólumokat az elemző vermébe tesszük. + \begin{itemize} + \item \emph{Léptetés}: egy új szimbólumot teszünk a bemenetről a verem tetejére. + \item \emph{Redukálás}: a verem tetején lévő szabály-jobboldalt helyettesítjük a szabály bal oldalán álló nemterminálissal + \end{itemize} + \noindent A háttérben egy véges determinisztikus automata működik: + az automata átmeneteit a verem tetejére kerülő szimbólumok határozzák meg + ha az automata végállapotba jut, redukálni kell + egyéb állapotban pedig léptetni. + + \noindent Az automata bizonyos nyelvek esetén konfliktusos lehet: nem tudjuk eldönteni, hogy léptessünk vagy redukáljunk. + + \subsubsection*{LR1 elemzés} + + \noindent Az előző problémára kínál megoldást, kibővítve a lehetséges nyelvek halmazát. + + \noindent Az ötlet, hogy \emph{olvassunk előre} egy szimbólumot. + + \noindent Ha az aktuális állapot \emph{i}, és az előreolvasás eredménye az \emph{a} szimbólum: + \begin{itemize} + \item ha $ [A \rightarrow \alpha.a\beta, b] \in I_i $ és $read(I_i, a) = I_j$ + akkor léptetni kell, és átlépni a \emph{j} állapotba. + + \item ha $ [A \rightarrow \alpha., a] \in I_i (A \neq S'), $ + akkor redukálni kell az $ A \rightarrow \alpha $ szabály szerint. + + \item ha $ [S' \rightarrow S., \#] \in I_i $ és $ a = \# $, akkor el kell fogadni a szöveget, minden más esetben hibát kell jelezni. + + Ha az \emph{i} állapotban \emph{A} kerül a verem tetejére: + ha\ $read(I_i,A) = I_j$, akkor át kell lépni a \emph{j} állapotba, egyébként hibát kell jelezni. + \end{itemize} + +\subsubsection*{Jelmagyarázat/Kanonikus halmazok} + + \paragraph{Closure/lezárás} + + \noindent Ha $ I $ a grammatika egy $ LR(1) $ elemhalmaza, akkor $ closure(I) $ a legszűkebb olyan halmaz, amely az alábbi tulajdonságokkal rendelkezik: + + $I \subseteq closure(I) $ ha $ [A \rightarrow \alpha.B\gamma,a] \in closure(I)$, + és $ B \rightarrow \beta $ a grammatika egy szabálya, akkor $ \forall b \in FIRST1(\gamma{}a) $ esetén $ [B \rightarrow .\beta,b] \in closure(I) $ + + \paragraph{Read/olvasás} + Ha $ I $ a grammatika egy $ LR(1) $ elemhalmaza, $ X $ pedig terminális vagy nemterminális szimbóluma, akkor $ read(I, X) $ a legszűkebb olyan halmaz, amely az alábbi tulajdonsággal rendelkezik: + Ha $ [A \rightarrow \alpha. X\beta,a] \in I $, akkor $ closure([ A \rightarrow \alpha X.\beta,a]) \subseteq read(I, X) $. + + \paragraph{LR(1) kanonikus halmazok ($ I_n $)} + \begin{itemize} + \item + $ closure([S' \rightarrow .S, \#]) $ a grammatika egy kanonikus halmaza. + \item + Ha $ I $ a grammatika egy kanonikus elemhalmaza, $ X $ egy terminális vagy nemterminális szimbóluma, és $ read(I, X) $ nem üres, akkor $ read(I, X) $ is a grammatika egy kanonikus halmaza. + \item + Az első két szabállyal az összes kanonikus halmaz előáll. + \end{itemize} + +\subsection*{Szemantikus elemző} + + + A szemantikus elemzés jellemzően a környezetfüggő ellenőrzéseket + valósítja meg. + + %Dévai diáiról + \begin{itemize} + \item + deklarációk kezelése: változók, függvények, eljárások, operátorok, típusok + \item + láthatósági szabályok + \item + aritmetikai ellenőrzések + \item + a program szintaxisának környezetfüggő részei + \item + típusellenőrzés + \item + stb. + \end{itemize} + + + \noindent A szemantikus elemzéshez ki kell egészítenünk a grammatikát. Rendeljünk a szimbólumokhoz attribútumokat és a szabályokhoz akciókat! Egy adott szabályhoz tartozó feltételek csak a szabályban előforduló attribútumoktól függhetnek. (Ha egy feltétel nem teljesül, akkor szemantikus hibát kell jelezni!). A szemantikus rutinok csak annak a szabálynak az attribútumait használhatják és számíthatják ki, amelyikhez az őket reprezentáló akciószimbólum tartozik. Minden szintaxisfában minden attribútumértéket pontosan egy + szemantikus rutin határozhat meg. Az így létrejövő nyelvtant \emph{\textbf{attribútum fordítási grammatikának}} (ATG) hívjuk. + + \noindent A \emph{jól definiált attribútum fordítási grammatika}, olyan attribútum fordítási grammatika, amelyre igaz, hogy a grammatika által definiált nyelv mondataihoz tartozó minden szintaxisfában minden attribútum értéke egyértelműen kiszámítható. +\newpage + \noindent Egy attribútumot kétféleképpen lehet meghatározni: + \begin{itemize} + \item\noindent \textbf{Szintézissel}: a szintaxisfában alulról felfelé terjed az információ, egy szülő attribútumát a gyerekekből számoljuk. Kitüntetettnek hívjuk azokat az attribútumokat, melyeket a lexikális elemző szolgáltat. + \item \textbf{Öröklődéssel}: a szintaxisfában felülről lefelé terjed az információ. A gyerekek attribútumait a szülőé határozza meg. + \end{itemize} + \noindent Az \emph{L-ATG} olyan attribútum fordítási grammatika, amelyben minden + $ A \rightarrow X_1X_2 . . . X_n $szabályban az attribútumértékek az alábbi sorrendben meghatározhatók: + + \begin{itemize} + \item + A örökölt attribútumai + \item + $ X_1 $ örökölt attribútumai + \item + $ X_1 $ szintetizált attribútumai + \item + $ X_2 $ örökölt attribútumai + \item + $ X_2 $ szintetizált attribútumai + \item + \dots + \item + $ X_n $ örökölt attribútumai + \item + $ X_n $ szintetizált attribútumai + \item + A szintetizált attribútumai + \end{itemize} + + \noindent Amennyiben a nyelvtanunk ennek eleget tesz, úgy hatékonyan meghatározható minden attribútum. + + \noindent A szemantikus elemzéshez jellemzően szimbólumtáblát használunk, verem szerkezettel és keresőfával vagy hash-táblával. Minden blokk egy új szint a veremben, egy szimbólum keresése a verem tetejéről indul. + + % Kódgenerálás assemblyben alapvető imperatív vezérlési szerkezetekhez. + \section*{Kódgenerálás alapvető vezérlési szerkezetekhez} + + + A kódgenerálás feladata, hogy a szintaktikusan és szemantikusan elemzett programot tárgykóddá alakítsa. Általában szorosan összekapcsolódik a + szemantikus elemzéssel. +\newpage + \subsection*{Értékadás} + + \noindent assignment $ \rightarrow $ \emph{variable} \textbf{assignmentOperator} \emph{expression}\\ + + \noindent // a kifejezést az eax regiszterbe kiértékelő kód\\ + \noindent \texttt{mov [variable],eax} + + \subsection*{Egy ágú elágazás} + + \noindent statement $ \rightarrow $ \textbf{if} condition \textbf{then} program \textbf{end}\\ + + \noindent // a feltételt az al regiszterbe kiértékelő kód\\ + \texttt{ + cmp al,1\\ + je Then\\ + jmp End\\ + Then: \\ + } + // a then-ág programjának kódja\\ + \texttt{ + End:\\ + } + + \noindent \emph{Megjegyzés}: a dupla ugrásra azért van szükség, mert a feltételes ugrás hatóköre limitált. + + \subsection*{Több ágú elágazás} + + statement $ \rightarrow $ + \\if $ condition_1 $ then $ program_1 $ + \\elseif $ condition_2 $ then $ program_2 $ + \\\dots + \\elseif $ condition_n $ then $ program_n $ + \\else $ program_{n+1} $ end\\ + + \noindent // az 1. feltétel kiértékelése az al regiszterbe\\ + \texttt{ + cmp al,1\\ + jne near Condition\_2\\ + } + // az 1. ág programjának kódja\\ + \texttt{ + jmp End\\ + ...\\ + } + //az n-edik feltétel kiértékelése az al regiszterbe\\ + \texttt{ + Condition\_n: \\ + cmp al,1\\ + jne near Else\\ + } + // az n-edik ág programjának kódja\\ + \texttt{ + jmp End\\ + Else:\\ + } + // az else ág programjának kódja\\ + \texttt{ + End: + } + + \subsection*{Switch-case} + + statement $ \rightarrow $ \textbf{switch} \emph{variable} + \\case $ value_1 $ : $ program_1 $ + \\... + \\case $ value_n $ : $ program_n $\\ + + \noindent \texttt{cmp [variable], value\_1\\ + je near Program\_1\\ + cmp [variable], value\_2\\ + je near Program\_2\\ + . ..\\ + cmp [variable], value\_n\\ + je near Program\_n\\ + jmp End\\ + Program\_1:\\ + } + // az 1. ág programjának kódja\\ + \texttt{ + . ..\\ + Program\_n:\\ + } + // az n-edik ág programjának kódja\\ + \texttt{ + End: + } + + \subsection*{Ciklus} + + \subsubsection*{Elől tesztelő} + + statement $ \rightarrow $ \textbf{while} \emph{condition} statements \textbf{end}\\ + + \noindent \texttt{Begin:}\\ + //a ciklusfeltétel kiértékelése az al regiszterbe\\ + \texttt{cmp al,1\\ + jne near End}\\ + // a ciklusmag programjának kódja\\ + \texttt{jmp Begin\\ + End:} + + \subsubsection*{Hátul tesztelő} + statement $ \rightarrow $ loop statements \textbf{while} \emph{condition}\\ + + \noindent + \texttt{Begin: }\\ + //a ciklusmag programjának kódja\\ + . ..\\ + //a ciklusfeltétel kiértékelése az al regiszterbe\\ + \texttt{ + cmp al,1\\ + je near Begin + } + +\subsubsection*{For ciklus} + + statement $ \rightarrow $ \textbf{for} variable \textbf{from} $ value_1 $ to $ value_2 $ statements \textbf{end}\\ + + \noindent // a "from" érték kiszámítása a [Változó] memóriahelyre\\ + \texttt{Begin: }\\ + // a "to" érték kiszámítása az eax regiszterbe\\ + \texttt{cmp [variable],eax\\ + ja near End}\\ + // a ciklusmag kódja\\ + \texttt{inc [variable]\\ + jmp Begin\\ + End:} + +\subsection*{Statikus változók} + + Kezdőérték nélküli változódefiníció fordítása:\\ + + \noindent \texttt{section .bss}\\ + // a korábban definiált változók...\\ + \texttt{Lab12: resd 1 ; 1 x 4 bájtnyi terület}\\ + + \noindent Kezdőértékkel adott változódefiníció fordítása:\\ + + \noindent \texttt{section .data}\\ + // a korábban definiált változók...\\ + \texttt{Lab12: dd 5 ; 4 bájton tárolva az 5-ös érték} + + \subsection*{Logikai kifejezések} + + \subsubsection*{kifejezés1 $ < $ kifejezés2 } + + // a 2. kifejezés kiértékelése az eax regiszterbe\\ + \texttt{push eax}\\ + // az 1. kifejezés kiértékelése az eax regiszterbe\\ + \texttt{pop ebx\\ + cmp eax,ebx\\ + jb Smaller\\ + mov al,0 } // hamis\\ + \texttt{jmp End\\ + Smaller:\\ + mov al,1 }// igaz\\ + \texttt{End:} +\newpage + \subsubsection*{kifejezés1 $ \lbrace $ és, vagy, nem, kizáróvagy $ \rbrace $ kifejezés2 } + + // a 2. kifejezés kiértékelése az al regiszterbe\\ + \texttt{push ax} ; nem lehet 1 bájtot a verembe tenni!\\ + // az 1. kifejezés kiértékelése az al regiszterbe\\ + \texttt{pop bx} ; // bx-nek a bl részében van,\\ + // ami nekünk fontos\\ + \texttt{and al, bl}\\ + + \subsubsection*{ lusta "és" kiértékelés } + + // az 1. kifejezés kiértékelése az al regiszterbe\\ + \texttt{cmp al,0\\ + je End\\ + push ax}\\ + // a 2. kifejezés kiértékelése az al regiszterbe\\ + \texttt{mov bl,al\\ + pop ax\\ + and al,bl\\ + End:} + + \subsubsection*{ Alprogramok megvalósítása } + + + // az 1. kifejezés kiértékelése az al regiszterbe\\ + \texttt{ + cmp al,0\\ + je End\\ + push ax}\\ + // a 2. kifejezés kiértékelése az al regiszterbe\\ + \texttt{ + mov bl,al\\ + pop ax\\ + and al,bl\\ + End:} + + \subsubsection*{ Alprogramok hívása } + + // Alprogramok sémája\\ + // utolsó paraméter kiértékelése eax-be\\ + \texttt{push eax}\\ + // ...\\ + // 1. paraméter kiértékelése eax-be\\ + \texttt{push eax\\ + call alprogram\\ + add esp,’a paraméterek összhossza’} +\newpage + \section*{Kódoptimalizáló} + + Az optimalizálás feladata, hogy a keletkezett kód kisebb és gyorsabb legyen, úgy hogy a futás eredménye nem változik. A gyorsaság és a tömörség gyakran ellentmondanak egymásnak, és az egyik csak a másik rovására javítható.\\ + + \noindent Általában három lépésben szokás elvégezni: + + \begin{itemize} + \item + Optimalizálási lépések végrehajtása az eredeti programon, vagy egyszerűsített változatán + \item + Kódgenerálás + \item + Gépfüggő optimalizálás végrehajtása a generált kódon + \end{itemize} + + \subsection*{Lokális optimalizáció} + + \noindent Egy programban egymást követő utasítások sorozatát \emph{alapblokknak} nevezzük, + \begin{itemize} + \item ha az első utasítás kivételével egyik utasítására sem lehet távolról átadni a vezérlést + \begin{itemize} + \item assembly programokban: ahová a \textbf{jmp}, \textbf{call}, \textbf{ret} utasítások "ugranak" + \item magas szintű nyelvekben: \emph{eljárások és ciklusok eleje}, \emph{elágazások ágainak első utasítása}, \emph{goto utasítások célpontjai}. + \end{itemize} + \item az utolsó utasítás kivételével nincs benne vezérlés-átadó utasítás + \begin{itemize} + \item assembly programokban: ahová a \textbf{jmp}, \textbf{call}, \textbf{ret} utasítások "ugranak" + \item magas szintű nyelvekben: \emph{elágazások és ciklusok vége}, \emph{eljárás vége}, \emph{goto utasítások célpontjai}. + \end{itemize} + \end{itemize} + + \noindent Az utasítás-sorozat nem bővíthető a fenti két szabály megsértése nélkül.\\ + + \noindent Jelöljük meg: + \begin{itemize} + \item a program első utasítását + \item azokat az utasításokat, amelyekre távolról át lehet adni avezérlést + \item a vezérlés-átadó utasításokat követő utasításokat + \end{itemize} + + \noindent Minden megjelölt utasításhoz tartozik egy alapblokk, ami a következő megjelölt utasításig (vagy az utolsó utasításig) tart.\\ + + \noindent \textbf{main: mov eax,[Label1]}\\ + \texttt{cmp eax,[Label2]}\\ + \texttt{jz True}\\ + \textbf{dec dword [Label1]}\\ + \texttt{inc dword [Label2]}\\ + \texttt{jmp vege}\\ + \textbf{True: inc dword [Label1]}\\ + \texttt{dec dword [Label2]}\\ + \textbf{End: ret} + + \noindent Ha az optimalizálás az alapblokkok keretein belül történik, akkor garantált, hogy az átalakításnak nincs mellékhatása. Ez a \emph{lokális optimalizálás}.\\ + + \paragraph*{Tömörítés} + + \noindent Cél: minél kevesebb konstans és konstans értékű változó legyen.\\ + \noindent Konstansok összevonása: a fordítási időben kiértékelhető kifejezések kiszámítása.\\ + + \noindent \emph{Eredeti kód}: \texttt{a := 1 + b + 3 + 4;}\\ + \noindent \emph{Optimalizált kód}: \texttt{a := 8 + b;}\\ + + \noindent \emph{Eredeti kód}:\\ + \texttt{a := 6;}\\ + \texttt{b := a / 2;}\\ + \texttt{c := b + 5;}\\ + + \noindent \emph{Optimalizált kód}:\\ + \texttt{a := 6;}\\ + \texttt{b := 3;}\\ + \texttt{c := 8;}\\ + + \noindent \emph{Eredeti kód}:\\ + \texttt{x := 20 - (a * b);}\\ + \texttt{y := (a * b) \^\ 2;}\\ + + \noindent \emph{Optimalizált kód}:\\ + \texttt{t := a * b;}\\ + \texttt{x := 20 - t;}\\ + \texttt{y := t \^\ 2;}\\ + + \paragraph{Ablakoptimalizálás} + + \noindent Ez egy módszer a lokális optimalizálás egyes fajtáihoz. Egyszerre csak néhány utasításnyi részt vizsgálunk a kódból. A vizsgált részt előre megadott mintákkal hasonlítjuk össze. Ha illeszkedik, akkor a mintához megadott szabály szerint átalakítjuk ezt az "ablakot" végigcsúsztatjuk a programon. Az átalakítások megadása: + + \begin{center} + $ \lbrace$ minta $ \rightarrow $ helyettesítés $\rbrace$ szabályhalmazzal\\ + (a mintában lehet paramétereket is használni) + \end{center} + + \noindent Példák: + \begin{itemize} + \item + felesleges műveletek törlése: nulla hozzáadása vagy kivonása + \item + egyszerűsítések: nullával szorzás helyett a regiszter törlése + \item + regiszterbe töltés és ugyanoda visszaírás esetén a visszaírás elhagyható + \item + utasításismétlések törlése: ha lehetséges, az ismétlések törlése + \end{itemize} +\newpage + \noindent Példa: \\ + + \noindent Ablak mérete: 1 utasítás\\ + Szabályhalmaz:\\ + \{\texttt{mov reg,0 $\to$ xor reg,reg},\\ + \texttt{add reg,0 $\to$ elhagyható}\}\\ + + \noindent \emph{Eredeti kód}:\\ + \texttt{add eax,0}\\ + \texttt{mov ebx,eax}\\ + \texttt{mov ecx,0}\\ + + \noindent \emph{Optimalizált kód}:\\ + \texttt{; elhagyott utasítás}\\ + \texttt{mov ebx,eax}\\ + \texttt{xor ecx,ecx} + + \subsection*{Globális optimalizáció} + + A teljes program szerkezetét meg kell vizsgálni. Ennek módszere az adatáram-analízis: + \begin{itemize} + \item + Mely változók értékeit számolja ki egy adott alapblokk? + \item + Mely változók értékeit melyik alapblokk használja fel? + \end{itemize} + + \noindent Ez lehetővé teszi az + \begin{itemize} + \item azonos kifejezések többszöri kiszámításának kiküszöbölését akkor is, ha különböző alapblokkokban szerepelnek + \item a konstansok és változók továbbterjesztését alapblokkok között + \item elágazások, ciklusok optimalizálását + \end{itemize} + + \paragraph*{Kódkiemelés} + +\newenvironment{lbmatrix}{\begin{bmatrix*}[l]}{\end{bmatrix*}} + + \noindent \emph{Eredeti kód}: + \begin{verbatim} +if( x < 10 ) +{ + b++; + a = 0; +} +else +{ + b--; + a = 0; +} + \end{verbatim} +\newpage + \noindent \emph{Optimalizált kód}:\\ + \noindent \textbf{a = 0;} + \begin{verbatim} +if( x < 10 ) +{ + b++; +} +else +{ + b--; +} + \end{verbatim} + + \section*{A szekvenciális és párhuzamos/elosztott végrehajtás összehasonlítása} + + \subsection*{Szekvenciális végrehajtás:} + + \noindent Ilyenkor a végrehajtás egy processzoron történik. Minden művelet atomi. Egy inputhoz egy output tartozik. Két szekvenciális program ekvivalens, ha ezek a párosok megegyeznek. Nem használja fel az összes rendelkezésre álló erőforrást. + + \subsection*{Párhuzamos végrehajtás:} + + \noindent Több processzoron hajtódik végre a program. A párhuzamos folyamatok egymással kommunikálva, szinkronban oldják meg az adott problémát. A konkurens program szétbontható elemi szekvenciális programokra, ezek a folyamatok. A folyamatok használhatnak közös erőforrásokat: pl. változók, adattípus objektumok, kommunikációs csatornák. + + \noindent A kommunikációt általában kétféleképpen szokták megvalósítani. + + \paragraph{Osztott memóriával.} Ekkor szinkronizálni kell, hogy ki mikor fér hozzá, hogy ne legyen ütközés. + + \paragraph{Kommunikációs csatornával.} Garantálni kell, hogy ha egy folyamat üzenetet küld egy másiknak, akkor az meg is kapja azt, és jelezzen is vissza. Ügyelni kell, nehogy deadlock alakuljon ki. + +\end{document} + + + diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/img/rekord.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/img/rekord.png new file mode 100644 index 0000000..7ab54b8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/img/rekord.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.pdf new file mode 100644 index 0000000..846e63a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.tex new file mode 100644 index 0000000..46de69f --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/10.Programnyelvi alapok/tetel10.tex @@ -0,0 +1,842 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[hungarian]{babel} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +%\usepackage{fontawesome} +%\usepackage{geometry} +%\usepackage{graphicx} +%\usepackage{hhline} +%\usepackage{ifthen} +%\usepackage{listings} +%\usepackage{makecell} +%\usepackage{multirow} +%\usepackage{newunicodechar} +%\usepackage{pgf,tikz} +%\usepackage{subcaption} +%\usepackage{tipa} +%\usepackage{wasysym} +%\usepackage{xcolor} +%\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata} + + \geometry{ + a4paper, + total={170mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\definecolor{mygray}{rgb}{0.0, 0.0, 0.0} +\definecolor{blue(pigment)}{rgb}{0.2, 0.2, 0.6} +\definecolor{brickred}{rgb}{0.8, 0.25, 0.33} +\definecolor{coolblack}{rgb}{0.0, 0.18, 0.39} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\bullet$} + +\date{} +\useunder{\uline}{\ul}{} +\fancyhf{} % sets both header and footer to nothing + \lfoot{ELTE-IK} + \cfoot{\thepage} + \rfoot{10. tétel } + +\pagestyle{fancy} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \hyphenation{oddword} + \uchyph=0 + \begin{center} + {\Large\bfseries\noindent 10. Programnyelvi alapok} \\ + \end{center} + + \section{Kifejezések kiértékelésének szabályai} + + \paragraph*{Fogalmak} + \begin{itemize} + \item Operandusok: Változók, konstansok, függvény- és eljáráshívások. + + \item Operátorok: Műveleti jelek, amelyek összekapcsolják egy kifejezésben az operandusokat és valamilyen + műveletet jelölnek. + + \item Kifejezés: operátorok és operandusok sorozata. + + \item Precedencia: A műveletek kiértékelési sorrendjét határozza meg. + + \item Asszociativitás iránya: Az azonos precedenciájú operátorokat tartalmazó kifejezésekben a kiértékelés iránya. + Megkülönböztetünk bal-asszociatív és jobb-asszociatív operátorokat. + \end{itemize} + + \noindent Az operátorokat háromféleképpen írhatjuk az operandusokhoz képest: + + \begin{itemize} + \item Infix : Egy operátort a két operandusa közé kell írni (tehát csak kétoperandusú műveletek operátorait + lehet így írni). + Amikor egy kifejezésben több operátor is szerepel, akkor a különböző operátorok végrehajtási + sorrendjét az operátorok precedenciája dönti el. Amelyik operátor precedenciája magasabb (pl. a + szorzásé magasabb, mint az összeadásé), az általa jelölt műveletet értékeljük ki először. Ugyanazon + operátorok végrehajtási sorrendjét pedig az asszociativitás iránya dönti el (pl. a bal-asszociatív azt + jelenti, hogy balról jobbra haladva kell végrehajtani). Ezeket a (programozási nyelvekbe beépített) + szabályokat zárójelek segítségével lehet felülírni.\\ + Példa: A * (B + C) / D + + \item Postfix (Lengyelforma) : Az operátorokat az operandusaik mögé írjuk. A kiértékelés sorrendje mindig balról jobbra + történik – tehát egy n operandusú operátor a tőle balra levő első n operandusra érvényes.\\ + Példa: A B C + * D /\\ + Ugyanez zárójelezve (felesleges): ((A (B C +) *) D /) + + \item Prefix : Az operátorokat az operandusuk elé írjuk. A kiértékelés sorrendje balról + jobbra történik.\\ + Példa: / * A + B C D\\ + Ugyanez zárójelezve (felesleges): (/ (* A (+ B C) ) D)\\ + Habár a prefix operátorok esetén is balról jobbra történik a kiértékelés, viszont ha egy operátortól + jobbra egy másik operátor következik, akkor értelemszerűen az ehhez az operátorhoz tartozó + műveletet kell először végrehajtani, hogy a bal oldalit is végre tudjuk hajtani. A fenti példában is a + szorzást az osztás előtt, az összeadást pedig a szorzás előtt kell elvégezni. + \end{itemize} + + \paragraph{Logikai operátorokat tartalmazó kifejezések kiértékelése} + + \noindent Az ilyen kifejezéseknek kétféle kiértékelése létezik: + \begin{itemize} + \item Lusta kiértékelés : Ha az első argumentumból meghatározható a kifejezés értéke, akkor a másodikat + már nem értékeli ki. + \item Mohó kiértékelés : Mindenféleképpen megállapítja mindkét argumentum logikai értékét. + \end{itemize} + + \noindent A két kiértékelési módszer bizonyos esetekben különböző eredményt adhat: + \begin{itemize} + \item A 2. argumentum nem mindig értelmes\\ + Példa (C++): +{\small + \begin{verbatim} + if ((i>=0) && (T[i]>=10)) + { + //... + } + \end{verbatim} +} + Tegyük fel, hogy a T egy \texttt{int} tömb, 0-tól indexelődik. + Itt ha az $i>=0$ hamis, akkor T-t alul indexelnénk. Ez mohó kiértékelés esetén futási idejű hibát okozna. + Lusta kiértékelés esetén (a C++ alapértelmezetten ezt használja) viszont tudhatjuk, hogy a feltétel már nem lehet igaz, emiatt $T[i]>=10$-et már nem kell kiértékelni. + \item A 2. argumentumnak van valamilyen mellékhatása.\\ + Példa (C++): +{\small + \begin{verbatim} + if ((i>0) || (++j>0)) + { + T[j] = 100; + } + \end{verbatim} +} + Ebben az esetben ha $i>0$ igaz, akkor a feltétel biztosan igaz, viszont a $++j>0$ kifejezés mellékhatásos, növeli j értékét. + Mivel a C++ lusta kiértékelést használ a $||$ operátor esetén ($|$ operátor esetén mohó a kiértékelés), ezért ebben az esetben nem növeli j értékét. (csak akkor, ha $i>0$ hamis). + \end{itemize} + + \section{Utasítások, vezérlési szerkezetek} + + \subsection{Egyszerű utasítások} + + \begin{itemize} + \item Értékadás : Az értékadás bal oldalán egy változó, a jobb oldalán bármilyen kifejezés állhat. Az + értékadással a változóhoz rendeljük a jobb oldali kifejezést. Figyelni kell arra, hogy a bal oldali + változó típusának megfelelő kifejezés álljon a jobb oldalon (vagy létezik implicit konverzió, pl. C++-ban + az egész és logikai típus között). A legtöbb nyelvben az értékadás operátora az \texttt{=} (például C++, Java, C\#), + vagy a \texttt{:=} (például Pascal, Ada). + + \item Üres utasítás : Nem mindenhol lehet ilyet írni. A lényege, hogy nem csinál semmit. + Azokban a nyelvekben lehet létjogosultsága, ahol üres blokkot nem írhatunk, + muszáj legalább 1 utasításnak szerepelnie benne. (pl. Ada) Erre szolgál az üres utasítás. + (Ada-ban ez a \texttt{null} utasítás) + + \item Alprogramhívás : Alprogramokat nevük és paramétereik megadásával hívhatunk. + Példák: + \begin{itemize} + \item \texttt{System.out.println("Hello”);} + \item \texttt{int x = sum(3,4);} + \end{itemize} + \item Visszatérés utasítás : Az utasítás hatására az alprogram végrehajtása befejeződik. Ha az alprogram egy + függvény, akkor meg kell adni a visszatérési értéket is. + + \noindent Példák (C++): + \begin{itemize} + \item Ebben a példában a \texttt{doSomething} egy eljárás, nincs visszatérési értéke. A paraméterül kapott + x változót értékül adjuk a j-nek. Ha ez az érték nem 0, akkor visszatérünk, azaz megszakítjuk az alprogram + végrehajtását (konkrét értéket viszont nem adunk vissza). Ha ez az érték 0, akkor a végrehajtás folytatódik tovább, + meghívjuk a \texttt{doSomethingElse} függvényt a j paraméterrel. +{\small + \begin{verbatim} + void doSomething(int x) + { + int j; + if(j=x) + return; // j!=0, do nothing + + doSomethingElse(j); + } + \end{verbatim} +} + \item Ebben a példában az \texttt{isOdd} egy függvény, \texttt{int} visszatérési értékkel. Megmondja a paraméterül kapott + x egész számról, hogy páratlan-e. Ehhez bitenkénti ÉS művelettel "összeéseli" az x-et az 1-gyel (0...01). Ha az eredmény + nem 0, akkor páratlan, visszatérünk igaz értékkel. Különben folytatjuk a működést, majd visszatérünk hamis értékkel. +{\small + \begin{verbatim} + int isOdd(int x) + { + if(x & 1) //bitwise AND with 0...01 is not 0...0 + return true; + + return false; + } + \end{verbatim} +} + \end{itemize} + + \item Utasításblokk: A blokkon belüli utasítások "összetartoznak”. + Ez több esetben is jól alkalmazható nyelvi elem: + \begin{itemize} + \item Vezérlési szerkezetekben: Az adott vezérlési szerkezetekhez tartozó utasításokat különíthetjük el. + + \item Az olyan nyelvekben, amelyekben deklaráció csak a program elején található deklarációs + blokkokban lehetséges (pl. Ada), van lehetőség arra, hogy a programkód későbbi részében nyissunk + egy blokkot, ahol deklarációk is szerepelhetnek. + + \item Osztályok inicializáló blokkja pl. Java-ban (konstruktor előtt hajtódik végre): +{\small + \begin{verbatim} + public class MyClass{ + private ResourceSet resourceSet; + + { + resourceSet = new ResourceSetImpl(); + UMLResourcesUtil.init(resourceSet); + } + + /* ... */ + } + \end{verbatim} +} + \item Osztályok statikus inicializáló blokkja pl. Java-ban: +{\small + \begin{verbatim} + public class MyClass{ + private static ResourceSet resourceSet; + + static{ + resourceSet = new ResourceSetImpl(); + UMLResourcesUtil.init(resourceSet); + } + + /* ... */ + } + \end{verbatim} +} + \end{itemize} + + \end{itemize} + + \subsection{Vezérlési szerkezetek} + + \begin{itemize} + \item Elágazás : Az elágazás egy olyan vezérlési szerkezet, amellyel meghatározhatjuk, hogy bizonyos + (blokkban megadott) utasítások csak a megadott feltétellel jöhessenek létre. + Általában több feltételt is megadhatunk egymás után (if L1 then … else if L2 then … else if L3 then …). + Megadhatjuk azt is, hogy mi történjen, ha egyik feltétel sem teljesül (if L then … else …). + + Elágazásokat lehet egymásba ágyazni (if … then if ...). + + "Csellengő else” ("Dangling else”) probléma: Azokban a nyelvekben lép fel, ahol egy feltétel egy + utasításblokkját nem zárja le külön kódszó (pl. endif). Ekkor abban az esetben, ha elágazásokat + egymásba ágyazunk, a következő probléma léphet fel:\\ + Példa: \texttt{if (A>B) then if (C>D) then E:=100; else F:=100;} + + A fenti esetben nem lehet megállapítani, hogy a programozó az else kulcsszót melyik elágazásra + értette. + + \item Ciklus : Egy utasításblokk (ciklusmag) valahányszori végrehajtását jelenti. + \begin{itemize} + \item Feltétel nélküli ciklus : Végtelen ciklust kódol, kilépni belőle a strukturálatlan utasításokkal lehet + (ld. lentebb), vagy return-nel, esetleg hiba fellépése esetén. + + Példa (ADA): +{\small + \begin{verbatim} + loop + null; + end loop; + \end{verbatim} +} + \item Elöltesztelő ciklus : A ciklus a ciklusmag minden végrehajtása előtt megvizsgálja, hogy az adott + feltétel teljesül-e. Ha teljesül, akkor végrehajtja a magot, majd újra ellenőriz. Különben a ciklus + után folytatódik a futás. + + Példák: + \begin{itemize} + \item C++: +{\small + \begin{verbatim} + int x=0,y=0; + while(x<5 && y<5) + { + x+=y+1; + y=x-1; + } + cout<0) + return n * fact (n-1); + else + return 1; + } + \end{verbatim} +} + \item Haskell: +{\small + \begin{verbatim} + fact :: (Integral a) => a -> a + fact n + | n>0 = n * fact (n - 1) + | otherwise = 0 + \end{verbatim} +} + \end{itemize} + + \section{Típusok} + + \subsection{Tömb} + + A tömb (angolul array) olyan adatszerkezet, amelyet nevesített elemek csoportja alkot, melyekre sorszámukkal (indexükkel) lehet hivatkozni. Vektornak is nevezik, ha egydimenziós, mátrixnak esetenként, ha többdimenziós. A legtöbb programozási nyelvben minden egyes elemnek azonos adattípusa van és a tömb folytonosan helyezkedik el a számítógép memóriájában. A készítés módja alapján lehet: + + \begin{itemize} + \item statikus :a méret fix, deklarációban szabályozott + \item dinamikus tömb: a mérete változik, folyamatosan bővíthető + \end{itemize} + + \subsection{Rekord} + + A rekord egy összetett értékek leírásához használható konstrukció. Névvel és típussal ellátott összetevői vannak, ezeket mezőknek nevezzük. + Értékhalmaz a mezők értéktípusai által meghatározott alaphalmazok direktszorzata. + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/rekord} + \caption{A rekord-típuskonstrukciók általános szintaxisa.} + \label{fig:rekord} + \end{figure} + + \noindent Műveletek: + \begin{itemize} + \item Szelekciós függvény (.mezőszelektor szintaxisú); + + \item konstrukciós függvény (Rekordtípus(mezőértékek) szintaxisú); + + \item elképzelhetők transzformációs függvények, amelyek a teljes rekordstruktúrát érintik. + \end{itemize} + + \noindent Példa rekordra és használatára C-ben: +{\small + \begin{verbatim} + //definition of Point + struct Point + { + int xCoord; + int yCoord; + }; + + const struct Point ORIGIN = {0,0}; + + \end{verbatim} +} + \subsection{Osztály} + + Az osztály egy felhasználói típus, amelynek alapján példányok (objektumok) + hozhatók létre. Az osztály alapvetően attribútum és metódus (művelet) definíciókat + tartalmaz. Az osztály írja le az objektum típusát: megadja a tulajdonságait és azok + lehetséges értékeit (azaz a típusértékeket), valamint az objektumon végrehajtható műveleteket (típusműveletek).\\ + + \noindent Példa C++-ban: +{\small + \begin{verbatim} + //definition of Point + class Point { + private: + int xCoord; + int yCoord; + public: + //constructor + Point(int xCoord, int yCoord) : xCoord(xCoord),yCoord(yCoord) {} + + void Translate(int dx, int dy) { + xCoord+=dx; + yCoord+=dy; + } + + void Translate(Point delta) { + xCoord+=delta.xCoord; + yCoord+=delta.yCoord; + } + + int getX() { return xCoord; } + + int getY() { return yCoord; } + }; + + int main(int argc, char* argv[]) + { + Point point(0,0); + point.Translate(5,-2); + cout<; + function Square (X : Element_T) return Element_T; + \end{verbatim} + Itt a \texttt{with function} kezdetű sor végén az \texttt{is <>} azt jelenti, hogy ha az adott típusra már létezik * + művelet (pl. egész számokra), akkor nem kell külön megadni példányosításkor, a program automatikusan azt használja. + + A törzs: + \begin{verbatim} + function Square (X: Element_T) return Element_T is + begin + return X * X; -- The formal operator "*". + end Square; + \end{verbatim} + + \item A példányosításnak biztosítania kell mindent, amit a sablon specifikációja megkövetel tőle. + A következő példában a négyzetre emelő függvényt mátrixokra alkalmazzuk, feltéve, hogy definiáltuk a + mátrixszorzást. + \begin{verbatim} + with Square; + with Matrices; + procedure Matrix_Example is + function Square_Matrix is new Square + (Element_T => Matrices.Matrix_T, "*" => Matrices.Product); + A : Matrices.Matrix_T := Matrices.Identity; + begin + A := Square_Matrix (A); + end Matrix_Example; + \end{verbatim} + \end{itemize} + + \noindent Például a C++-ban a sablonszerződés nem így működik. Ott a sablon specifikációja az egész definíció (emiatt sablonosztályokat csak teljes egészében header fájlokban definiálhatunk). + Példányosításkor ezt is ismerni kell, hogy tudjuk, hogyan példányosíthatunk. Az információelrejtés elve tehát sérül.\\ + + \noindent Más nyelvekben (pl. Java, funkcionális nyelvek) nem kell a sablonokat példányosítani – mindig ugyanaz a + megírt kód hajtódik végre, csak épp az aktuális paraméterekkel. Pl. Java-ban a típusparaméter fordításkor "elveszik", + csak futási időben derül ki. + + \section{Hatókör/láthatóság} + + \begin{enumerate} + \item Hatókör: Deklarációkor a programozó összekapcsol egy entitást (például egy változót vagy függvényt) egy névvel. A hatókör alatt a forrásszöveg azt a részét értjük, amíg ez az összekapcsolás érvényben van. Ez általában annak a blokknak a végéig tart, amely tartalmazza az adott deklarációt. + + \item A láthatóság a hatókör részhalmaza, a programszöveg azon része, ahol a deklarált névhez a megadott entitás tartozik. Mivel az egymásba ágyazott blokkokban egy korábban már bevezetett nevet más entitáshoz kapcsolhatunk, ezért ilyenkor a külső blokkban deklarált entitás a nevével már nem elérhető. Ezt nevezzük a láthatóság elfedésének. + + Egyes nyelvekben (például C++) bizonyos esetekben (például osztályszintű adattagok) a külső blokkban deklarált entitáshoz minősített névvel hozzá lehet férni ekkor is. + \end{enumerate} + + \section{Automatikus, statikus és dinamikus élettartam,\\ szemétgyűjtés} + + Élettartam: A változók élettartama alatt a program végrehajtási idejének azt a szakaszát értjük, amíg a változó számára lefoglalt tárhely a változóé. + + \subsection{Automatikus élettartam} + + A blokkokban deklarált lokális változók automatikus élettartamúak, ami azt jelenti, hogy a deklarációtól a tartalmazó blokk végéig tart, azaz egybeesik a hatókörrel. A helyfoglalás számukra a végrehajtási verem aktuális aktivációs rekordjában történik meg. + + \subsection{Statikus élettartam} + + A globális változók, illetve egyes nyelvekben a statikusként deklarált változók (például C/C++ esetén a \texttt{static} kulcsszóval) statikus élettartamúak. Az ilyen változók élettartama a program teljes végrehajtási idejére kiterjed, számukra a helyfoglalás már a fordítási időben megtörténhet. + + \subsection{Dinamikus élettartam} + + A dinamikus élettartamú változók esetén a programozó foglal helyet számukra a dinamikus tárterületen (heap), és a programozó feladata gondoskodni arról is, hogy ezt a tárterületet később felszabadítsa. Amennyiben utóbbiról megfeledkezik, azt nevezzük memóriaszivárgásnak (memory leak). + Mint látjuk, a dinamikus élettartam esetén a hatókör semmilyen módon nem kapcsolódik össze az élettartammal, az élettartam szűkebb vagy tágabb is lehet a hatókörnél. + + \subsection{Szemétgyűjtő} + + \noindent A szemétgyűjtő másik neve a hulladékgyűjtő, az angol Garbage Collector név után pedig gyakran csak GC-nek rövidítik. Feladata a dinamikus memóriakezeléshez kapcsolódó tárhelyfelszabadítás automatizálása, és a felelősség levétele a programozó válláról, így csökkentve a hibalehetőséget.\\ + + \noindent A szemétgyűjtő figyeli, hogy mely változók kerültek ki a hatókörükből, és azokat felszabadíthatóvá nyilvánítja. A módszer hátránya a számításigényessége, illetve a nemdeterminisztikussága. A szemétgyűjtő ugyanis nem szabadítja fel egyből a hatókörükből kikerült változókat, és a felszabadítás sorrendje sem ugyanaz, amilyen sorrendben a változók felszabadíthatóvá váltak.\\ + + \noindent Azt, hogy a hulladékgyűjtő mikor és mely változót szabadítja fel, egy programozási nyelvenként egyedi, összetett algoritmus határozza meg, amelyben rendszerint szerepet játszik a rendelkezésre álló memória telítettsége, illetve a felszabadításhoz szükséges becsült idő. (Például ha egy objektum rendelkezik destruktorral, akkor általában a GC később szabadítja csak fel.)\\ + + \noindent Összességében a szemétgyűjtő csak annyit garantál, hogy előbb-utóbb (legkésőbb a program futásának végeztével) minden dinamikusan allokált változót felszabadít.\\ + + \noindent Szemétgyűjtést használó nyelvek pl. Java, C\#, Ada.\\ + A C/C++-ban nincs szemétgyűjtés, a programozónak kell gondoskodni a dinamikusan allokált memóriaterületek felszabadításáról. + + \section{Konstruktor, destruktor} + + \subsection{Konstruktor} + + A konstruktor az objektumok inicializáló eljárása, akkor fut le, ha egy osztályból új objektumot példányosítunk. Alapértelmezett konstruktor alatt a paraméter nélküli konstruktort értjük, a legtöbb programozási nyelv esetén ezt a fordítóprogram automatikusan generálja üres törzzsel, amennyiben nem lett megadva egy konstruktor sem egy osztályban. + Többek között a konstruktorban szokás gondoskodni arról, hogy az objektum dinamikus élettartamú változói számára tárhelyet foglaljunk. + + \subsection{Destruktor} + + A destruktor a konstruktor ellentétes párja, ez az eljárás az objektumok felszabadításakor fut le. Meghívása automatikusan megtörténik, attól függetlenül, hogy az objektum felszabadítása automatikusan történik a hatókör végeztével (lokális objektumok esetén), manuálisan a programozó által (dinamikus élettartamú objektumok esetén) vagy a szemétgyűjtő által (szintén dinamikus élettartamú objektumok esetén).\\ + + \noindent A desktruktorban szokás többek között az objektum dinamikus helyfoglalású adattagjait és a lefoglalt erőforrásokat felszabadítani. + + \section{Objektumok másolása, összehasonlítása} + + Az objektumok másolása egy speciális konstruktorral, az úgynevezett másoló konstruktorral (copy constructor) történik. Ez paraméterül az adott osztály egy példányát kapja meg, és azt a programozó által megadott működési logika szerint lemásolja az éppen inicializált objektumba.\\ + + \noindent Több programozási nyelv (például C++) fordítóprogramja automatikusan elkészít egy másoló konstruktort, ha a programozó nem definiál sajátot. Ez az alapértelmezett másoló konstruktor lemásolja a forrásobjektum összes adattagjának értékét, ezt nevezzük sekély másolatnak (shallow copy). Ha az objektum dinamikus foglalású adattagokat is tartalmaz, akkor azoknak nem az értéke, hanem csak a hivatkozása lesz lemásolva, ami általában nem a kívánt működés. Ez esetben saját másoló konstruktor írása szükséges, ami mély másolatot (deep copy) készít. + + \section{Alprogramok, paraméterátadás, túlterhelés} + + \subsection{Alprogramok} + + Alprogramoknak a függvényeket, eljárásokat és műveleteket nevezzük. Segítségükkel a program feladatonként tagolható, a főprogramból az önálló feladatok kiszervezhetőek. + + \subsection{Paraméterátadás} + + Az alprogramoknak szüksége lehet bemenő adatokra és vissza is adhat értékeket. Az alprogramokat általános írjuk meg, saját változónevekkel, ezek a formális paraméterek. Az alprogram meghívásakor az átadott aktuális paraméterek alapján a formális paraméterek értéket kapnak. Az, hogy a formális paraméterek értéke mi lesz, a paraméterátadás módjától függ. + + \subsubsection{Szövegszerű paraméterátadás} + + A makrókban használatosak mind a mai napig. A makró törzsében a formális paraméter helyére beíródik az aktuális paraméter szövege. + + \subsubsection{Név szerinti paraméterátadás} + + Az aktuális paraméter kifejezést újra és újra kiértékeljük, ahányszor hivatkozás történik a formálisra. A paramétert a törzs kontextusában értékeljük ki, így a formális paraméter különböző előfordulásai mást és mást jelenthetnek az alprogramon belül. + Alkalmazása archaikus (például: Algol 60, Simula 67). + + \subsubsection{Érték szerinti paraméterátadás} + + Az egyik legelterjedtebb paraméterátadási mód (például: C, C++, Pascal, Ada, Java), bemeneti szemantikájú. A formális paraméter az alprogram lokális változója, híváskor a vermen készül egy másolat az aktuális paraméterről, ez lesz a formális. Az alprogram végén a formális paraméter megszűnik + + \subsubsection{Cím szerinti paraméterátadás} + + A másik legelterjedtebb paraméterátadási mód (például: Pascal, C++, C\#), be- és kimeneti szemantikájú. A híváskor az aktuális paraméter címe adódik át, azaz a formális és az aktuális paraméter ugyanazt az objektumot jelentik, egy alias jön létre.\\ + + \noindent Megjegyzés: A Java-ban nincs cím szerinti paraméterátadás, csak érték szerinti. A Java ugyanis a primitív típusoknak az értékét tárolja, objektumok esetén pedig egy referenciát az adott objektumra (mint C++-ban a referencia típus). Objektum átadásakor ez a referencia másolódik le, azaz a referencia adódik át érték szerint.\\ + + \noindent Például: + \begin{verbatim} + public static void BadSwap(Object x, Object y) + { + Object tmp = x; + x = y; + y = tmp; + } + \end{verbatim} + + \noindent A fenti függvény nem cseréli ki az x-et és y-t, csak lokálisan (a függvénytörzsön belül), viszont a hívás helyén x és y is helyben maradnak. + + \subsubsection{Eredmény szerinti paraméterátadás} + + Kimeneti szemantikájú paraméterátadási mód. A formális paraméter az alprogram lokális változója, az alprogram végén a formális paraméter értéke bemásolódik az aktuálisba. Azonban az alprogram meghívásakor az aktuális értéke nem másolódik be a formálisba. (Használja például az Ada.) + + \subsubsection{Érték/eredmény szerinti paraméterátadás} + + Az érték és eredmény szerinti paraméterátadás összekombinálása, így egy be- és kimeneti szemantikájú paraméterátadási módot kapunk. (Használja például az Algol-W vagy az Ada.) + + \subsubsection{Megosztás szerinti paraméterátadás} + + Objektumorientált programozási nyelvek (például: CLU, Eiffel) paraméterátadási módja. Lényege, hogy ha a formális paraméter megváltoztatható és az aktuális paraméter egy megváltoztatható változó, akkor cím szerinti paraméterátadás történik, egyébként pedig érték szerinti. A paraméterátadás módját külön megadni nem lehet. + Megváltoztatható (mutable) objektum alatt azt értjük, hogy tulajdonságai, ezáltal állapota megváltoztatható. + + \subsubsection{Igény szerinti paraméterátadás} + + Ezt a paraméterátadási módot a lusta kiértékelésű funkcionális nyelvek (például: Clean, Haskell, Miranda) alkalmazzák. Az aktuális paramétert nem híváskor értékeli ki, hanem akkor, amikor először szüksége van rá a számításokhoz. + + \subsection{Túlterhelés} + + A túlterhelés (overloading) segítségével azonos nevű alprogramokat hozhatunk létre eltérő szignatúrával. A szignatúra a legtöbb programozási nyelvben az alprogram nevét és a formális paraméterek számát és típusát jelenti, de egyes nyelvekben (például Ada) a visszatérési érték típusa is beletartozik. A túlterhelés elsődleges felhasználási területe, hogy ugyanazt a tevékenységet különböző paraméterezéssel is elvégezhessük.\\ + + \noindent A fordító az alprogramhívásból el tudja dönteni, hogy a túlterhelt változatok közül melyiket kell meghívni. Ha egyik sem illeszkedik vagy több is illeszkedik, akkor fordítási hiba lép fel. + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.pdf new file mode 100644 index 0000000..dbf08a2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.tex new file mode 100644 index 0000000..581f0a1 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/11.Formális nyelvek/tetel11.tex @@ -0,0 +1,834 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[hungarian]{babel} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{fontawesome} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{makecell} +\usepackage{tikz} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} +\DeclareMathOperator\arcsinh{arcsinh} +\DeclareMathOperator\arccosh{arccosh} +\DeclareMathOperator\sh{sinh} +\DeclareMathOperator\ch{cosh} + +\geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm +} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{11. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\tikzset{declare function={y(\x)=\x^2;}, + plot fill/.style={fill=white!75}, + plot/.style={draw=black!80, thick}, + bar/.style={fill=cyan, draw=white, thick}, + marking/.style={fill=cyan!50!black, draw=cyan!50!black}, + axis/.style={thick, draw=black!65, stealth-stealth} +} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + {\Large\bfseries\noindent 11. Formális nyelvek} \\ + + \section*{Formális nyelvtanok és a Chomsky-féle nyelvosztályok} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + \subsection*{Alapfogalmak\\} + + \subsubsection*{Ábécé, szó\\} + + \begin{itemize} + \item \textbf{\emph{Ábécének}} nevezzük egy tetszőleges véges szimbólumhalmazt. + \item Az ábécé elemeit \textbf{\emph{betűk}}nek hívjuk. + \item Egy $V$ ábécé elemeiből képzett \emph{véges sorozatokat} $V$ feletti \textbf{\emph{szavaknak}}. + \item Adott $v \in V$ \textbf{\emph{szó hossza}} a benne szereplő betűk száma. Jelölése: $l(v)$ vagy $|v|$. + \item A $V$ ábécé feletti $\varepsilon$ szót \textbf{\emph{üres szó}}nak nevezzük, ha $l(\varepsilon) = 0$. + \item $V^{0} := \{\varepsilon \}$ + \item $V^{n} := V \times V^{n - 1},\ n \geq 1$ + \item A $V$ ábécé feletti szavak halmazát (beleértve az üres szót is) $\boldsymbol{V^*}$-gal jelöljük.\\ + $V^{*} := \bigcup\limits_{i = 0}^{\infty}V^{i} = V^{0} \cup V^{1} \cup \ldots$ a V \textbf{\emph{ábécé lezártja}}. + \item A nemüres szavak halmazát $\boldsymbol{V^+}$-szal jelöljük ($V^{+} := V^{*}\backslash\{\varepsilon\}$).\\ + $V^{+} := \bigcup\limits_{i = 1}^{\infty}V^{i} = V^{1} \cup V^{2} \cup \ldots$ a V \textbf{\emph{ábécé pozitív lezártja}}.\\ + + Példa: $V:= \{a, b\}$\\ + $V^{*} := \{\varepsilon, a, b, aa, ab, ba, bb, aaa, aab, \ldots\}$\\ + $V^{+} := \{a, b, aa, ab, ba, bb, aaa, aab, \ldots\}$ + \end{itemize} + + \subsubsection*{Szavak konkatenációja\\} + + \noindent Legyenek \emph{u} és \emph{v} szavak egy V ábécé felett. Ekkor a két szó \textbf{\emph{konkatenációjának}} nevezzük azt a szimbólumsorozatot, amelyet a két szó szimbólumainak egymás után fűzésével kapunk. Jelölése: \emph{uv}.\\ + + \noindent \emph{Példa}: $V = \{a,b,c\},\ u = abb, v = cbb$. Ekkor $uv = abbcbb$.\\ + + \noindent A konkatenáció asszociatív, de nem kommutatív művelet, melynek egységeleme $\varepsilon$.\\ + + \noindent Így $V^{*}$ a konkatenációval mint művelettel és $\varepsilon$-nal egységelemes félcsoportot alkot. + \begin{itemize} + \item \noindent $V^*$ zárt a konkatenációra. + \begin{align*} + u,v \in V^* \Rightarrow uv \in V^* + \end{align*} + + \item $\varepsilon$ egységelem $V^*$-gal és a konkatenációval: + + \begin{align*} + u \in V^* \Rightarrow u\varepsilon \in V^* \textrm{, és }\varepsilon u \in V^* + \end{align*} + \end{itemize} + + \noindent Legyen $v \in V^{*}$ + \begin{itemize} + \item $v^{0} = \varepsilon$ (bármely szó nulladik hatványa az üres szó) + \item $v^{n} = vv^{n-1}\quad (n \geq 1)$ (bármely szó n. hatványa a szó n-szeres konkatenációja) + \end{itemize} + + \subsubsection*{Egyéb definíciók} + + \begin{itemize} + \item $u,v \in V$. Az $u$ szót a $v$ \textbf{\emph{részszavának}} nevezzük, ha $ \textbf{v} = x\textbf{u}y , \ (x,y \in V)$ teljesül.\\ + Ha még $xy\neq\varepsilon$, akkor $u$ \textbf{\emph{valódi részszó}}. + + \emph{Példa}: $v = aabbbcc \in V$ Az $u = abbbc$ valódi részszava $v$-nek. + + \item $ v = xuy \ (x,y,u,v \in V)$. Ekkor: + \begin{itemize} + \item Ha $x=\varepsilon$, akkor $u$-t a $v$ szó \textbf{\emph{prefix}}ének nevezzük\\ + \emph{Példa}: $v = aabbbcc$. Az $u = aabbb$ szó prefixe $v$-nek. + \item Ha $y=\varepsilon$, akkor $u$-t a $v$ szó \textbf{\emph{szufix}}ének nevezzük\\ + \emph{Példa}: $v = aabbbcc$. Az $u = bbbcc$ szó szufixe $v$-nek. + \end{itemize} + + \item Egy $u\in V$ szó tükörképe alatt a szimbólumai fordított sorrendben való felírását értjük. (Jelölése: $u^{-1}$) + \noindent Legyen $u = a_1 \ldots a_n,\ a_i \in V,\ 1 \leq i \leq n$, ekkor + \[ + u^{-1} = a_n \ldots a_1 + \] + \end{itemize} + + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \subsection*{Formális nyelvtanok és a Chomsky-féle nyelvosztályok} + + \paragraph*{Nyelv} + + \noindent A $V^{*}$ valamely részhalmazát ($2^{V^{*}}$ valamely elemét) a $V$ ábécé feletti \textbf{\emph{nyelv}}nek nevezzük. Jelölése: L. $(L \subset V^*)$.\\ + + \noindent Az üres nyelv (egy szót sem tartalmaz) jele: $\emptyset$\\ + + \noindent $L$ nyelv \textbf{\emph{véges nyelv}}, ha véges számú szót tartalmaz, különben \textbf{\emph{végtelen nyelv}}.\\ + + \noindent $L_1 = \Big\{a,b,\varepsilon \Big\}$ \emph{véges} nyelv, $L_2 = \Big\{a^ib^i\ \Big|\ 0 \leq i\Big\}$ \emph{végtelen} nyelv.\\ + + \noindent \emph{Megjegyzés}: A formális nyelv nem más, mint egy adott ABC jeleiből alkotott tetszőleges hosszú szavak halmazának részhalmaza, vagyis a formális nyelv egy adott ABC jeleiből alkotható, meghatározott szavak halmaza. A formális nyelv állhat véges sok szóból, állhat végtelen sok szóból és tartalmazhatja az üres szót is.\\ + + \noindent Nyelvek valamely összességét nyelvosztálynak, nyelvcsaládnak hívjuk. Jelölése: $\mathcal{L}_i$ .\\ + + \paragraph*{Nyelvekre vonatkozó műveletek} + + \begin{itemize} + \item $ L_1 \cup L_2 = \Big\{\ u\ |\ \ u \in L_1 \vee u \in L_2\ \Big\}$ : az $L_1$ és $L_2$ nyelv uniója + \item $ L_1 \cap L_2 = \Big\{\ u\ |\ \ u \in L_1 \wedge u \in L_2\ \Big\}$ : az $L_1$ és $L_2$ nyelv metszete + \item $ L_1 - L_2 = \Big\{\ u\ |\ \ u \in L_1 \wedge u \notin L_2\ \Big\}$ : az $L_1$ és $L_2$ nyelv különbsége + \item $\overline{L} = V^* - L$ : az $L \subseteq V^*$ komplementere + \item $L_1L_2 = \Big\{\ u_1u_2\ |\ \ u_1 \in L_1, u_2 \in L_2\ \Big\}$ : az $L_1$ és $L_2$ nyelv konkatenációja\\ + + Minden nyelvre fennáll: $\emptyset L = L \emptyset = \emptyset$ illetve $\{\varepsilon\}L = L\{\varepsilon\} = L$ + \item $L^i$ : az $L$ nyelv $i$-edik hatványa, és + \begin{itemize} + \item $L^0 = \{\varepsilon\}$ + \item $L^i = L^{i-1}L \qquad (i \geq 1)$ + \end{itemize} + \item $ L^* = \bigcup\limits_{i \geq 0} L^i$ : az $L$ nyelv iteratív lezártja + \item $ L^+ = \bigcup\limits_{i \geq 1} L^i$ nyelvet értjük + \end{itemize} + + \noindent Az \emph{unió}, \emph{konkatenáció} és \emph{iteráció lezárása} műveleteket \emph{reguláris műveletek}nek nevezzük. + + \paragraph*{Nyelvekre vonatkozó leképezések} + + \noindent Legyen $V_1,\ V_2$ ábécé. + + \noindent A $h: V_1 \to V_2$ leképezést \textbf{\emph{homomorfizmus}}nak nevezzük, ha + \[ + h(uv) = h(u)h(v) \qquad \forall u,v \in V_1^{*} + \] + + \noindent Valamint minden $u = a_1a_2\ldots a_n$ szóra, ahol $a_i \in V,\ 1 \leq i \leq n$ fenáll, hogy + \[ + h(u) = h(a_1)h(a_2)\ldots h(a_n) + \] + + \noindent Legyen $h: V_1 \to V_2$ homomorfizmus. + \noindent A $h$ \textbf{\emph{homomorfizmus $\varepsilon$-mentes}}, ha + \[ + h(u) \neq \varepsilon,\ \forall u \in V_1^{*}\ \text{szóra},\ \text{ahol}\ u \neq \varepsilon + \] + + \noindent Egy $h$ homomorfizmust \textbf{\emph{izomorfizmus}}nak nevezzük, ha bármely $\forall u, v \in V_1^{*}$ szóra teljesül, hogy + \[ + h(u) = h(v) \Rightarrow u = v + \] + + \noindent \emph{Példa}: izomorfizmus (decimális számok bináris reprezentációja): + \begin{center} + $V_1 = \Big\{0,1,2,\ldots,9\Big\},\ V_2 = \Big\{0,1\Big\}$\\ + $h(0) = 0000,\ h(1) = 0001,\ \ldots,\ h(9) = 1001$ + \end{center} + + \paragraph*{Nyelvek megadása} + + \noindent A formális nyelvek megadási módszereitől elvárjuk, hogy a leírás véges legyen.\\ + + \noindent A formális nyelv megadható: + \begin{enumerate} + \item felsorolással (csak véges nyelvek esetén). + \item a szavakat alkotó szabály szöveges leírásával.\\ + Például: \emph{Legyen $L_2$ a páratlan számok nyelve}. + \item a szavakat alkotó szabály matematikai leírásával.\\ + Például: $V := \{a, b\}$ és legyen $L := \{u\ |\ u = a^{n}b^{n} \wedge n \in \mathbb{N}\}$ + \item generatív grammatika segítségével. + \end{enumerate} + + \subsection*{Grammatika} + + \noindent A nyelveket megadhatjuk nyelvtanukkal is, vagyis egy szabályrendszerrel, aminek a felhasználásával a nyelv mondatai levezethetők. Egy generatív nyelvtan a jelsorozatok transzformációs szabályait leíró szabályok halmazából áll. A nyelvet alkotó jelsorozatok létrehozásához szükséges, hogy legyen egy egyedi „kezdő” szimbólum, ezután csak a szabályokat kell egymás után alkalmazni (bárhányszor, tetszés szerinti sorrendben) a kezdő szimbólum átalakítására. A nyelv azokból a jelsorozatokból áll, amelyeket az említett módon elő lehet állítani.\\ + + \noindent Tegyük fel például, hogy egy ábécéhez a 'a' és a 'b' szimbólumok tartoznak, a kezdő szimbólum pedig legyen az 'S' és adottak a következő szabályok: + \begin{itemize} + \item $S \to aSb$ + \item $S \to ba$ + \end{itemize} + + \noindent Kezdő szimbólumunk az 'S', de ezután kiválaszthatjuk, hogy melyik szabályt alkalmazzuk a jelsorozat következő elemének előállításához. \\ + + \noindent \emph{Példa}: + \begin{itemize} + \item Ha az 1-es szabályt választjuk, akkor annak alapján az 'S' szimbólumot a 'aSb'-al helyettesítjük, eredményül tehát a "aSb" jelsorozatot kapjuk. \\ + \item Ha most ismételten az 1-es szabály alkalmazását választjuk, akkor helyettesítjük az 'S' szimbólumot a 'aSb'-vel, és akkor a "aaSbb" jelsorozatot kapjuk.\\ + \item Ezt az eljárást addig ismételhetjük, amíg az ábécé szimbólumai megengedik.\\ + \item Befejezve a példát, most válasszuk a 2-es szabályt, helyettesítsük az 'S' szimbólumot a 'ba' jelsorozattal, eredményül pedig a "aababb" jelsorozatot kapjuk, és ezzel be is fejeztük. + \end{itemize} + + \noindent A nyelvtan által meghatározott nyelv nem lesz más, mint az összes olyan jelsorozat halmaza, amelyeket ezzel az eljárással elő tudunk állítani: + \[ + \Big\{ba, abab, aababb, aaababbb, \ldots \Big\} + \] +\newpage + \noindent A $G$ generatív nyelvtan egy $\Big$ négyest értünk, ahol: + \begin{itemize} + \item $N$ és $T$ diszjunkt ábécék, a nemterminális ($N$) és terminális ($T$) szimbólumok ábécéi. + \item $S\in N$ a kezdőszimbólum. + \item $\mathcal{P}$ az $(x,y)$ rendezett párok halmaza, ahol $x,y \in (N \cup T)^*$ és $x$ legalább egy nemterminális szimbólumot tartalmaz. \\ + A $\mathcal{P}$ halmaz elemeit átírási szabályoknak nevezzük.\\ + \end{itemize} + + \noindent \emph{Megjegyzés}: $N\ \cap\ T = \emptyset$ és az $(x,y)$ jelölés helyett az $x \rightarrow y$ jelölést alkalmazzuk.\\ + + \noindent \textbf{Példa}: $N = \Big\{S, B\Big\},\ T = \Big\{a, b, c\Big\}$\\ + $\mathcal{P}$: + \begin{itemize} + \item[(1)] $S \to aBSc$ + \item[(2)] $S \to abc$ + \item[(3)] $Ba \to aB$ + \item[(4)] $Bb \to bb$ + \end{itemize} + És $S \in N$ nemterminális kezdőszimbólum.\\ + + \noindent Ekkor $L(G)$, a G grammatika által generált nyelvben generált néhány szimbólumsorozat. + \begin{itemize} + \small + \item[] $S \to (2)\ abc$ + \item[] $S \to (1)\ aB\textbf{S}c \to (2)\ a\textbf{Ba}bcc \to\ (3)\ aa\textbf{Bb}cc \to (4)\ aabbcc$ + \item[] $S \to (1)\ aB\textbf{S}c \to (1)\ aBaB\textbf{S}cc \to (2)\ a\textbf{Ba}Babccc \to\ (3)\ aaB\textbf{Ba}bccc \to (3)\ aa\textbf{Ba}Bbccc \to (3)\ aaaB\textbf{Bb}ccc \to (4)\ aaa\textbf{Bb}bccc \to (4)\ aaabbbccc$ + \end{itemize} + + \noindent (zárójelben az adott lépésre alkallmazott szabály azonosítója, a helyettesíthető rész pedig kiemelt terminális, nem terminális). + + \noindent A $G$ grammatika által leírt nyelv: $L(G) := \Big\{a^nb^nc^n\ \Big|\ n > 0\Big\}$. + + \subsection*{Levezetés} + + \noindent \textbf{Mondatforma}: Mondatformának nevezzük terminális és nemterminális szimbólumok véges sorozatát: $(N \cup T)^{*}$.\\ + + \paragraph*{Közvetlen levezetés} + + $ G = \Big$, és $u,v \in (N\cup T)^*$. A $v$ mondatforma közvetlenül (egy lépésben) levezethető $u$ mondatformaból $G$-ben, ha + \[ + \textbf{u} = w_1\textbf{x}w_2, \ v = w_1\textbf{y}w_2\textrm{, ahol} \ \boldsymbol{x \rightarrow y} \in \mathcal{P} \quad (w_1, w_2 \in (N \cup T)^*) + \] + Jelölése: $ u \xrightarrow[G]{} v$\\ + + \paragraph*{Közvetett levezetés} + + \noindent Azt mondjuk, hogy a $v$ mondatforma közvetetten levezethető az $u$ mondatformaból $G$-ben, ha létezik olyan $(\mathbb{N} \ni k \geq 0)$ szám és $x_0, x_1, \ldots, x_k \in (N \cup T)^{*}$ mondhatformák úgy, hogy + \[ + \begin{array}{c} + u = x_0 \\ + v = x_{k} + \end{array} + \quad \textrm{és} \quad x_i \xrightarrow[G]{} x_{i+1} \quad (1 \leq i \leq k-1) + \] + + \noindent Másképp: A $v$ mondatforma levezethető az $u$ mondatformából G-ben (jele: $ u \xrightarrow[G]{}^{*} v $), ha $u=v$ vagy $\exists z \in (N\cup T)^*$ mondatforma, hogy $ u \xrightarrow[G]{}^* z $ és $ z \xrightarrow[G]{} v $ + + \paragraph*{Generált nyelv} + + \noindent A $G$ formális nyelvtan által generált nyelv szavai a kezdőszimbólumból levezethető szavak. + + \noindent $L(G)$ a $G=\Big$ grammatika által generált nyelv, ha: + \[ + L(G) = \Big\{w \in T^{*}\ |\ S \xrightarrow[G]{}^{*} w\Big\} + \] + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \textbf{Ekvivalens nyelvtanok}: A $G_1$ és $G_2$ nyelvtanok ekvivalensek, ha $L(G_1) = L(G_2)$, azaz ugyanazt a nyelvet generálják. Jelölése: $G_1 \sim G_2$.\\ + + \noindent \textbf{Kvázi ekvivalens nyelvtanok}: A $G_1$ és $G_2$ nyelvtanok kvázi ekvivalensek, ha $L(G_1)\backslash\{\varepsilon\}= L(G_2)\backslash\{\varepsilon\}$, azaz legfeljebb az üres szó tartalmazásában különböznek. Jelölése: $G_1 \begin{array}{c} \sim \\ kv \end{array} G_2$ + $\triangleleft$ \faLightbulbO} + + \subsection*{Generatív nyelvtanok osztályozása} + + \noindent A generatív nyelvtanok osztályozását a szabályok alakja alapján tehetjük meg.\\ + + \noindent $G = \Big$ generatív grammatika $i$-típusú ($i=0,1,2,3$), ha $\mathcal{P}$ szabályhalmazára a következők teljesülnek: + + \begin{itemize} + \item \emph{\textbf{Mondatszerű grammatika}} (i=0)\\ \\ + Tetszőleges, azaz $p\textbf{A}q \rightarrow \textbf{B}$ alakú, ahol, $A \in N,\ p,\ q,\ B \in (N \cup T)^{*}$ + \item \emph{\textbf{Környezetfüggő grammatika}} (i=1)\\ \\ + $p\textbf{A}q \rightarrow p\textbf{B}q$ alakú, ahol, $A \in N,\ p,\ q,\ B \in (N \cup T)^{*}$\\ + és $B \neq \varepsilon$, kivéve az $S \rightarrow \varepsilon$ szabály (ha létezik), ekkor $S$ nem fordul elő egyetlen szabály jobboldalán sem. + + Itt az A nemterminális szimbólum adott $p,\ q$ szavak esetén helyettesíthető egy $pAq$ mondatformában egy $B \in (N \cup T)^{+}$ szóval. Azaz, az $p = q = \varepsilon$ kivételével A helyettesítése B-vel, függ A környezetétől. + + Továbbá minden $\omega_1 \to \omega_2 \in \mathcal{P}$ szabályra (kivéve $S \rightarrow \varepsilon$): $l(\omega_1) \leq l(\omega_2)$ + \item \emph{\textbf{Környezetfüggetlen grammatika}} (i=2)\\ \\ + $A \rightarrow q$, ahol $A \in N,\ q \in (N \cup T)^{*}$.\\ + \item \emph{\textbf{Reguláris grammatika}} (i=3)\\ \\ + $A \rightarrow vB$ vagy $A \rightarrow v$ alakú, ahol, $A,B\in N,\ v \in T^*$. + \end{itemize} + + \noindent A 3. típusú grammatikákat ill. nyelveket \emph{jobb lineáris}aknak is nevezzük, mivel minden szabály jobb oldalán legfeljebb egy nemterminális állhat és az is csak a jobb oldal végén.\\ + + \noindent A különböző típusú nyelvtanok összességét \textbf{\emph{nyelvtani osztályoknak}} hívjuk és $\mathcal{G}_{i}$ jelöljük. + \[ + \mathcal{G}_{i} := \big\{\text{i. típusú nyelvtanok}\big\} + \] + + \noindent A definíciók alapján: $\mathcal{G}_3 \subseteq \mathcal{G}_2 \subseteq \mathcal{G}_1 \subseteq \mathcal{G}_0$.\\ + + \noindent A nyelvtani osztályozást felhasználva a nyelveket is osztályozhatjuk: + \[ + \mathcal{L}_{i} := \Big\{L\ \big|\ \text{L nyelv, és van olyan}\ G \in \mathcal{G}_{i},\ \text{amelyre}\ L(G) = L \Big\} + \] + + \noindent Az előző nyelv hierarchia alapján $ \mathcal{L}_3 \subseteq \mathcal{L}_2 \subseteq \mathcal{L}_1 \subseteq \mathcal{L}_0 $ az ún. \textbf{\emph{Chomsky-féle hierarchia}}.\\ + + \noindent Igaz a hierarchia erősebb változata is: $\mathcal{L}_3 \subset \mathcal{L}_2 \subset \mathcal{L}_1 \subset \mathcal{L}_0$.\\ + + \noindent \textbf{Tétel}. Nem minden nyelv írható le nyelvtannal.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Miért érdekes a Chomsky-féle osztályozás?\\ + + \noindent Az algoritmusok - mint ismeretes - problématípusok (problémaosztályok) megoldására szolgáló lépéssorozatok. A generatív grammatikákkal kapcsolatban több, számítógéppel (esetleg) megoldható probléma merül fel, melyekre algoritmusok készíthetők. Nagyon fontos annak eldöntése, hogy ha egy konkrét generatív grammatika egy konkrét problémájának megoldására kifejlesztett algoritmus alkalmazható-e más grammatika ugyanazon problémájára, illetve mennyi módosítással alakítható át.\\ + + \noindent Amennyiben a két grammatika ugyanazon Chomsky-osztályba tartozik, úgy egy jól megfogalmazott algoritmus váza a paraméterektől eltekintve elvileg alkalmazható lesz.\\ + + \noindent Másik fontos indok, ami miatt fontos ismerni egy grammatika Chomsky-osztályát, hogy igazolható bizonyos problémakörökről, hogy nem készíthető hozzá általános érvényű megoldó algoritmus. + $\triangleleft$ \faLightbulbO}\\ + + \noindent Az $\mathcal{L}_i \ (i=0,1,2,3)$ \emph{nyelvosztályok mindegyike zárt a nyelveken végezhető műveletekre nézve}. Tehát valahányszor $\mathcal{L}$-beli nyelveken végezzük el a műveletet, mindannyiszor $\mathcal{L}$-beli nyelvet kapunk eredményül. \\ + + \noindent \textbf{Tétel}. (\emph{Kis Bar-Hillel lemma}): Tetszőleges $L \in \mathcal{L}_3$ nyelvhez $\exists n(L) > 0 \in \mathbb{Z}$, hogy $\forall u \in L,\ l(u) \geq n: u = xyz$ a következő tulajdonságokkal bír: + \begin{itemize} + \item $y \neq \varepsilon$ + \item $l(xy) \geq n$ + \item $\forall i = 0,1,\ldots: xy^{i}z \in L$ + \end{itemize} + + \noindent Azaz L nyelv minden szavának elég hosszú részszavában létezik elég rövid, nem üres, beiteralható részszó. pl. K-B HL $\Rightarrow HE \not \in \mathcal{L}_3$. HE: A $\left\{(,)\right\}$ ábécé feletti helyes zárójelezések halmaza.\\ + + \noindent \textbf{Tétel}. (\emph{Zártság}): $\mathcal{L}_3$ zárt az unió, konkatenáció, lezárás, komplementerképzés, metszet, különbség és szimmetrikus differencia műveletekre nézve.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \textbf{Zsákutca}: Olyan nyelvtani jel, melyből az adott 2. típusú nyelvtanban nem vezethető le terminális szó.\\ + + \noindent \textbf{Nem elérhető nyelvtani jel}: Olyan nyelvtani jel, mely az adott 2. típusú nyelvtanban semmilyen, a kezdőszimbólumból történő levezetésben nem szerepel.\\ + + \noindent \textbf{Láncszabály}: Egy $G$ grammatika egy $x \to y \in \mathcal{P}$ szabálya láncszabály, ha $x,\ y \in N$, azaz nemterminálisok.\\ + + \noindent \textbf{Láncszabálymentes nyelvtan}: Egy nyelvtan láncszabálymentes, ha nincs láncszabálya.\\ + + \noindent \textbf{Epszilon-szabály}: Egy $G$ grammatika egy $x \to y \in \mathcal{P}$ epszilon-szabály, ha $y = \varepsilon$.\\ + + \noindent \textbf{Korlátozott epszilon-szabály (KeS)}: Egy $G = \Big$ nyelvtanra teljesül a korlátozott epszilonszabály, ha nincsenek epszilonszabályai az $S \to \varepsilon$ szabály esetleges kivétel, de ez esetben minden $x \to y \in \mathcal{P}$ szabályra $y \in (N \cup T \backslash \{S\})^{*}$ (azaz semelyik szabály jobboldala sem tartalmazza a kezdőszimbólumot). + $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Epszilonmentes nyelvtan}: Egy nyelvtan epszilonmentes, ha teljesül rá az epszilon-szabály. + + \section*{Automaták} + + Formális nyelvek megadása nemcsak generatív, hanem felismerő eszközökkel is lehetséges, azaz olyan számítási eszközök segítségével, amelyek szavak feldolgozására és azonosítására alkalmasak. + Ilyen eszköz például az automata, amely egy szó, mint input hatására kétféleképpen viselkedhet: vagy \emph{elfogadja}, vagy \emph{elutasítja}. + + \subsection*{Véges automaták} + + \noindent \textbf{Definíció}. A véges automata egy rendezett ötös, + \[ + \mathcal{A}=\Big + \] + \begin{itemize} + \item Q - állapotok véges, nemüres halmaza + \item T - bementi szimbólumok ábécéje (véges) + \item $\delta : Q \times T \rightarrow Q$ - állapot-átmeneti függvény + \item $q_0 \in Q$ - kezdőállapot + \item $F \subseteq Q$ - végállapotok halmaza + \end{itemize} + + \noindent \emph{Működése}:\\ + + \noindent A véges automata diszkrét időintervallumokban végrehajtott lépések sorozata által működik. Minden egyes lépés során az automata elolvassa a következő input szimbólumot és átmegy egy olyan állapotba, amelyet az állapotátmeneti függvény meghatároz (az aktuális állapot és input szimbólum alapján).\\ + + \noindent Kezdetben az $A$ véges automata a $q_0$ kezdőállapotban van és az olvasófej az input szalagon levő $u \in T^*$ szó első betűjét dolgozza fel. Ezután a véges automata lépések sorozatát végrehajtva elolvassa az input $u$ szót; betűről betűre haladva olvas és új állapotba kerül.\\ + + \noindent Miután az $u$ input szó utolsó betűjét is elolvasta a véges automata, vagy $q \in F,$ azaz elfogadó állapotba kerül, és akkor az $u$ szót az automata elfogadja, vagy az új állapot nem lesz eleme $F$-nek, és ekkor az automata a szót nem fogadja el.\\ + + \noindent \textbf{Automata által felismert nyelv}: Az automata által felismert nyelv azon szavak halmaza, amelyekre a kezdő állapotból valamelyik végállapotba jut, azaz + \[ + L(\mathcal{A}) = \Big\{u \in T^{*}\ \Big|\ \delta(q_0,u) \in F\Big\}. + \] + + \paragraph*{Az automata megadási módszerei} + + \begin{itemize} + \item \emph{Átmeneti gráf}: Olyan irányított gráf, melynek pontja az állapotok, és $A$ állapotból $t$-vel címkézett él fut $B$ állapotba, ha $\delta(A, t) = B$. + \item \emph{Táblázat}: egyik tengelyén az állapotok, a másikon a terminálisok találhatók\\ + - lényegében az átmeneti gráf mátrixreprezentációja. + \item \emph{Képlet}: a $\delta$ függvény megadása valamilyen zárt számítási képlettel, formulával. + \end{itemize} + + \paragraph*{VDA - Véges determinisztikus automata} + + \noindent A $\delta$ függvény egyértékű, ezért minden egyes $(q, a)$ párra, ahol $(q, a) \in Q \times T$ egyetlen olyan $s$ állapot létezik, amelyre $\delta(q, a) = s$ teljesül. Ezért ezt a véges automatát determinisztikusnak nevezzük.\\ + + \paragraph*{VNDA - Véges nemdeterminisztikus automata} + + \noindent Ha többértékű állapot-átmeneti függvényt is megengedünk, azaz $\delta : Q \times T \rightarrow 2^Q$, akkor nemdeterminisztikus véges automatáról beszélünk. (Ebben az esetben aktuális állapotnak egy állapothalmaz valamely elemét, mintsem egyetlen állapotot tekinthetünk.)\\ + + \noindent Ez azt jelenti, hogy a kezdeti állapot helyettesíthető egy $Q_0 \subseteq Q$ kezdőállapot halmazzal.\\ + \noindent (És az is előfordulhat, hogy egy a input szimbólum esetén $\delta(q, a)$ üres az aktuális állapotok mindegyikére.) + + \paragraph*{Tulajdonságok} + + Az állapot-átmeneteket + \[ + qa \rightarrow p + \] + alakú szabályok formájában is írhatjuk $p \in \delta(q, a) $ esetén. Jelöljük $M_\delta$-val az $A = \Big$ nemdeterminisztikus véges automata $\delta$ állapot-átmenet függvénye által az előbbi módon származó szabályok halmazát.\\ + + \noindent Ha minden egyes $(q, a)$ párra egyetlen $qa \rightarrow p$ szabály van $M_\delta$-ban, akkor a véges automata determinisztikus, egyébként nemdeterminisztikus. + + \begin{itemize} + \item Közvetlen redukció: \\ + Legyen $A = (Q, T, \delta, q_0, F)$ egy véges automata és legyenek $u, v \in QT^*$ szavak. Azt mondjuk, hogy az $A$ automata az $u$ szót a $v$ szóra redukálja egy lépésben/közvetlenül. Ha van olyan $qa \rightarrow p$ szabály $M_\delta$-ban, és van olyan $w \in T^*$ szó, amelyre $u = qaw$ és $v = pw$ teljesül. + + \item Redukció:\\ + Az $A = (Q, T, \delta, q_0, F)$ véges automata az $u \in QT^*$ szót a $v \in QT^*$ szóra redukálja $(u \Longrightarrow_A^* v)$, ha $u = v$, vagy $ \exists z \in QT^*$, amelyre $u \Longrightarrow_A^* z$ és $z \Longrightarrow_A v$ teljesül. + \end{itemize} + + \noindent Az automata által elfogadott nyelv:\\ + \noindent Az $A = \Big$ véges automata által elfogadott/felismert nyelv alatt az + \[ + L(A) = \Big\{u \in T^* | \ q_0u \Longrightarrow_A^* p, \quad q_0 \in Q_0 \textrm{ és } p \in F\Big\} + \] + szavak halmazát értjük. (Az üres szó, akkor és csak akkor van benne az automata által elfogadott $L(A)$ nyelvben, ha $Q_0 \cap F \neq \emptyset$).\\ + + \noindent \textbf{Tétel}. Minden $A$ nemdeterminisztikus véges automatához meg tudunk adni egy 3-típusú $G$ grammatikát úgy, hogy $L(G) = L(A)$ teljesül.\\ +% \ \\ +% \textbf{3. típusú nyelvtan konstrukciója automatából}: A konstrukció alapötlete a következő: +% \begin{enumerate} +% \item hozzuk normálformára a nyelvtant, +% \item a nyelvtani jeleket feleltessük meg az automata állapotainak, +% \item $q_0$-t rendeljük az S startszimbólumhoz, +% \item $q \to tq' \in \mathcal{P} \Leftrightarrow \delta(q, t) = q'$, +% \item $q \to \varepsilon \in \mathcal{P} \Leftrightarrow q \in F.$ +% \end{enumerate} + + \noindent \textbf{Tétel}. Minden 3-típusú G grammatikához meg tudunk adni egy $A$ véges automatát úgy, hogy $L(A) = L(G)$ teljesül.\\ + + \noindent Ezek után fenáll a kérdés: Létezik-e olyan reguláris nyelv, amely VNDA-val felismerhető, de nem ismerhető fel VDA-val? \\ + \noindent Válasz: Nincs. + + \noindent \textbf{Tétel}. Minden $A = (Q, T, \delta,Q_0, F)$ VNDA-hoz meg tudunk konstruálni egy $A' = (Q', T, \delta', q_0', F')$ VDA-t úgy, hogy $L(A) = L(A')$ teljesül.\\ + + \noindent \textbf{Automata konstrukciója 3. típusú nyelvből.} A fentihez hasonló, fordított konstrukcióval készíthető 3. típusú nyelvtan alapján automata, ez azonban nem mindig lesz determinisztikus - ha nemdeterminisztikus állapotátmeneti függvényt kapunk, az automatát még determinisztikussá kell tennünk.\\ + + \subsection*{Veremautomaták} + + \paragraph*{Definíció} + + Az egy veremmel rendelkező (1-verem) automatát a következő hetessel azonosítjuk + \[ + A = \Big + \] + ahol + \begin{itemize} + \item Q - az állapotok véges halmaza + \item T - input ábécé + \item $\Sigma$ - veremábécé + \item $\delta : Q \times (T \times \cup \{\varepsilon\}) \times \Sigma) \rightarrow 2^{Q \times \Sigma^{*}},\ |\delta(q,t,\sigma)| < \infty$ - átmeneti függvény + \item $q_0 \in Q $ - kezdőállapot + \item $\sigma_{0} \in \Sigma $ - a verem kezdőszimbóluma + \item $F \subseteq Q$ - az elfogadó állapotok halmaza + \end{itemize} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A veremautomata egy ütemben kiolvassa a központi egység állapotát, az input szó aktuális szimbólumát és a verem tetőelemét, ennek függvényében új állapotba kerül, a verem tetőelemét felülírja egy vagy több jellel (azaz egy szóval), az input szó következő betűjére áll az olvasófej (kivéve $\varepsilon$-mozgás) és a tetőmutató az új tetőelemre áll.\\ + + \noindent A veremautomata konfigurációja alatt egy $uq$ alakú szót értünk, ahol $u \in Z^*$ a verem aktuális tartalma és $q \in Q$ az aktuális állapot. \\ + \noindent A kezdeti konfiguráció $\sigma_0q_0$.\\ + + \noindent Működés: \\ + + \noindent Tegyük fel, hogy az $A$ veremautomata olvasófeje az $a$ inputszimbólumon áll, a veremautomata $q$ állapotban van, valamint a verem tetején levő szimbólum $z$. Legyen $ \delta(z, q, a) = {(u_1, r_1), . . . , (u_n, r_n)}$, ahol $u_i \in Z^*$ és $r_i \in Q, 1 \leq i \leq n$. Ekkor $A$ következő állapota valamely $r_i$ lesz és egyidejűleg $z$-t helyettesíti az $u_i$ szóval, továbbá az olvasófej egy cellával jobbra lép az input szalagon.\\ + Ha $\delta(z, q, \varepsilon)$ nem üres, akkor ún. $\varepsilon$-átmenet hajtható végre. + + \noindent Ha az input szalag a $w \in T^*$ szót tartalmazza és a $z_0q_0$ kezdeti konfigurációból kiindulva a lépések sorozatát végrehajtva az $A$ veremautomata egy $up$ konfigurációba ér, ahol $p$ elfogadó állapot, akkor azt mondjuk, hogy $A$ elfogadta a $w$ szó. + $\triangleleft$ \faLightbulbO}\\ + + \noindent A veremautomata elfogadja a szót, ha üres a verem, és elfogadó állapotban van.\\ + + \paragraph*{Tulajdonságok} + + \begin{itemize} + \item Közvetlen redukció: \\ + $\alpha, \beta \in Z^*QT^*$\\ + Az $A$ veremautomata az $\alpha $ szót a $\beta$ szóra redukálja egy lépésben ($\alpha \Longrightarrow_A \beta$), ha: + \[ + \exists z \in Z, \ p,q \in Q, \ a \in T \cup \{\varepsilon\}, \ r,u \in Z^* \textrm{ és } w\in T^* + \] + hogy: + \[ + (u,p) \in \delta(z,q,a) \textrm{ és } \alpha = rzqaw \textrm{ és } \beta = rupw + \] + \item Redukció: \\ + Az A veremautomata az $\alpha$ szót a $\beta$ szóra redukálja ($\alpha \Longrightarrow_A^* \beta$), ha vagy $\alpha = \beta$, vagy + $ \exists \gamma_1,...,\gamma_n \in Z^*QT^*$ szavakból álló véges sorozat, hogy $\alpha = \gamma_1, \ \beta = \gamma_n, \quad \textrm{ és } \quad \\ {\gamma_i \Longrightarrow_A \gamma_{i+1} \quad (i=1,...,n-1)}$ + \item A veremautomata által elfogadott nyelv: \\ + Az A veremautomata által (elfogadó állapottal) elfogadott nyelv: + \[ + L(A) = \Big\{ w \in T^* | \ z_0q_0w \Longrightarrow_A^* up, \textrm{ ahol } u \in Z^*, p \in F \Big\} + \] + \item Determinizmus: \\ + A $\delta$ leképezést szabályok formájában is megadhatjuk. Az így nyert szabályhalmazt $M_\delta$-val jelöljük. Tehát + \begin{enumerate} + \item $zqa \rightarrow up \in M_\delta$ ha $(u, p) \in \delta(z, q, a)$ + \item $zq \rightarrow up \in M_\delta$ ha $(u, p) \in \delta(z, q, \varepsilon)$ + \end{enumerate} + + Az $A = (Z,Q, T,\delta, z_0, q_0, F)$ veremautomatát determinisztikusnak mondjuk, ha minden $(z, q) \in Z \times Q$ pár esetén: + \begin{enumerate} + \item $\forall a \in T: |\delta(z, q, a)| = 1$ és $\delta(z, q, \varepsilon) = \emptyset$ + + vagy + \item $|(z, q, \varepsilon)| = 1 $ és $\forall a \in T: \delta(z, q, a) = \emptyset$ + \end{enumerate} + \item Üres veremmel elfogadott nyelv: \\ + Az $N(A)$ nyelvet az $A$ veremautomata üres veremmel fogadja el, ha + \[ + N(A) = \Big\{w \in T^* | \ z_0q_0w \Longrightarrow_A^* p, \textrm{ ahol } p \in Q \Big\} + \] + \end{itemize} + + \noindent \textbf{Tétel}. Tétel. Az 1-verem automatákkal felismerhető nyelvek osztálya megegyezik a 2. típusú grammatikák által generált nyelvek osztályával, azaz $\mathcal{L}_{V} = \mathcal{L}_{2}$. + + \section*{Reguláris nyelvek tulajdonságai és alkalmazásai} + + \noindent \textbf{Reguláris nyelv}: Reguláris nyelveknek nevezzük az alábbi három tulajdonsággal definiált ($\mathcal{L}_{REG}$) nyelvosztály elemeit: + \begin{itemize} + \item[(1)] $\mathcal{L}_{REG}$ tartalmazza az elemi nyelveket: $\emptyset, \{\varepsilon\},\{a\}\qquad (a \in U)$ (U: univerzális ábécé) + \item[(2)] $\mathcal{L}_{REG}$ zárt az \emph{unió}, \emph{konkatenáció} és a \emph{lezárás} műveletekre. + \item $\mathcal{L}_{REG}$ a legszűkebb olyan nyelvosztály, mely az $(1),\ (2)$ feltételeknek megfelel.\\ + \end{itemize} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize\\ + \noindent \textbf{Reguláris kifejezés}: A reguláris kifejezések a reguláris nyelvek egyszerűsített leírását jelentik, ahol: + \begin{itemize} + \item az elemi reguláris kifejezések: $\emptyset, \varepsilon, a \qquad (a \in U)$ + \item ha $R_1$ és $R_2$ reguláris kifejezések, akkor $(R_1 \cup R_2), (R_1R_2),R_1^{*}$ is $V$ ábécé feletti reguláris kifejezések + \item a reguláris kifejezések halmaza a legszűkebb, melyre az előbbi két pont teljesül\\ + \end{itemize} + + \noindent \textbf{V ábécé feletti reguláris kifejezések} (rekurzív definíció) + \begin{itemize} + \item az elemi reguláris kifejezések: $\emptyset, \varepsilon, a \qquad (a \in V)$ + \item ha $R_1$ és $R_2$ $V$ ábécé feletti reguláris kifejezések, akkor $(R_1 \cup R_2), (R_1R_2),R_1^{*}$ is reguláris kifejezések + \item a $V$ ábécé feletti reguláris kifejezések halmaza a legszűkebb, melyre az előbbi két pont teljesül\\ + \end{itemize} + + \noindent \textbf{V ábécé feletti általánosított reguláris kifejezések} (rekurzív definíció) + \begin{itemize} + \item az elemi reguláris kifejezések: $\emptyset, \varepsilon, a \qquad (a \in V)$ + \item ha $R_1$ és $R_2$ $V$ ábécé feletti általánosított kifejezések, akkor $(R_1 \cup R_2), (R_1R_2), R_1^{*}, (R_1 \cap R_2), \overline{R_1}$ is $V$ ábécé feletti általánosított reguláris kifejezések + \item a $V$ ábécé feletti általánosított reguláris kifejezések halmaza a legszűkebb, melyre az előbbi két pont teljesül\\ + \end{itemize} + + \noindent \textbf{Reguláris kifejezések szemantikája} (rekurzív definíció) + \begin{itemize} + \item az $\emptyset, \varepsilon, a$ reguláris kifejezések rendre az $\emptyset, \{\varepsilon\}, \{a\}$ nyelveket reprezentálják + \item ha $R_1$ az $L_1$ és $R_2$ az $L_2$ nyelvet reprezentálja, akkor $(R_1 \cup R_2),\ (R_1R_2),\ R_1^{*}$ rendre az $L_1 \cup L_2,\ L_1L_2,\ L_1^{*}$ nyelveket reprezentálja + \end{itemize} + + \noindent \textbf{Reguláris kifejezések általánosított szemantikája} (rekurzív definíció) + \begin{itemize} + \item az $\emptyset, \varepsilon, a$ reguláris kifejezések rendre az $\emptyset, \{\varepsilon\}, \{a\}$ nyelveket reprezentálják + \item ha $R_1$ az $L_1$ és $R_2$ az $L_2$ nyelvet reprezentálja, akkor $(R_1 \cup R_2),\ (R_1R_2),\ R_1^{*}, \overline{R_1}$ rendre az $L_1 \cup L_2,\ L_1L_2,\ L_1^{*}, \overline{L_1}$ nyelveket reprezentálja + \end{itemize} + + \paragraph*{Axiómák} + + \noindent $P,Q,R$ reguláris kifejezések. Ekkor fennállnak a következő tulajdonságok: + \begin{itemize} + \item Asszociativitás: + \[ + P+(Q+R) = (P+Q)+R + \] + \[ + P\cdot(Q\cdot R) = (P\cdot Q)\cdot R + \] + \item Kommutativitás: + \[ + P+Q = Q+P + \] + \item Disztributivitás: + \[ + P\cdot (Q+R) = P\cdot Q + P\cdot R + \] + \[ + (P+Q)\cdot R = P\cdot R + Q\cdot R + \] + \item Egységelem: + \[ + \varepsilon\cdot P = P\cdot\varepsilon = P + \] + \[ + P^* = \varepsilon + P \cdot P^* + \] + \[ + P^* = (\varepsilon+P)^* + \] + \end{itemize} + + \noindent A fenti axiómák azonban még önmagukban nem elegendőek az összes reguláris kifejezés előállítására (helyettesítés segítségével). Szükség van még az alábbi inferencia szabályra: + \[ + P=R+P\cdot Q \quad \land \quad \varepsilon \notin Q \quad \Longrightarrow \quad P = R\cdot Q^* + \] + + \noindent Vegyük még hozzá az $\emptyset$ szimbólumot a reguláris kifejezések halmazához, amely az üres nyelvet jelöli. (Ebben az esetben nincs szükségünk az $\varepsilon$ szimbólumra, mivel $\emptyset^* = \{\varepsilon\}$). Így, a definícióban helyettesíthetjük az $\varepsilon$ szimbólumot az $\emptyset$ szimbólummal. Ekkor helyettesítjük $\varepsilon$-t a megelőző axióma rendszerben $(\emptyset)^*$-gal és még egy további axiómát tekintünk: + \[ + \emptyset\cdot P = P\cdot\emptyset = \emptyset + \] + + \noindent A fenti szabályok elégségesek ahhoz, hogy levezessünk minden érvényes egyenlőséget reguláris kifejezések között. + + \paragraph*{Reguláris kifejezések és reguláris nyelvek} + + \noindent Minden reguláris kifejezés egy reguláris (3-típusú) nyelvet jelöl, és megfordítva, minden reguláris nyelvhez megadható egy, ezen nyelvet jelölő reguláris kifejezés.\\ + $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Tétel}. (\emph{Kleene-tétel}): $\mathcal{L}_{REG} = \mathcal{L}_{3}$, azaz a reguláris nyelvek osztálya megegyezik a véges determinisztikus automatával előállítható nyelvek osztályával.\\ + + \noindent \textbf{Tétel}. Az $\mathcal{L}_3$ nyelvosztály zárt a komplementer, a metszet, a különbség és aszimmetrikus differencia műveletekre, a zártsági tétel miatt pedig zárt az unió, konkatenáció és a lezárás műveletekre is.\\ + + \subsection*{Reguláris nyelvek felhasználási területei\\} + + Bár a reguláris nyelvtanok az összes nyelvek viszonylag szűk osztályát jelölik ki, könnyű kezelhetőségük miatt gyakorlati alkalmazásuk rendszeres.\\ + + \noindent \textbf{\emph{Lexikális elemző}} (scanner): A fordítóprogramok legalsó szintjén, a lexikális elemek felderítésében nagy szerepet játszanak a 3. típusú nyelvtanok: általában reguláris kifejezésekkel azonosítják a nyelv lexikális elemeit.\\ + + \noindent \textbf{\emph{Mintaillesztés}}: Mintaillesztési feladatokban (pl. adatok között/szövegben történő keresés) reguláris kifejezéssel írható le az illesztendő minta. Ebből általában véges determinisztikus automatát (például Knuth-Morris-Pratt automatát) generálnak.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \subsection*{Lineáris grammatikák és nyelvek} + + \paragraph*{Definíció} + + \noindent Egy $\Big$ környezetfüggetlen grammatikát lineárisnak nevezünk, ha minden szabálya: + \begin{enumerate} + \item $A\rightarrow u, \quad A \in N, u \in T^*$ + \item $A\rightarrow u_1Bu_2, \quad A,B\in N, u_1,u_2 \in T^*$ + \end{enumerate} + + \noindent Továbbá $G$-t bal-lineárisnak, illetve jobb-lineárisnak mondjuk, ha $u_1 = \varepsilon$, illetve $u_2 = \varepsilon$ minden 2. alakú szabályra. + + \noindent Egy $L$ nyelvet lineárisnak, bal-lineárisnak, illetve jobb-lineárisnak mondunk, ha van olyan $G$ lineáris, bal-lineáris, illetve jobb-lineáris grammatika, amelyre $L = L(G)$ teljesül. + + \paragraph*{Lineáris és reguláris grammatikák, nyelvek} + + \noindent A jobb-lineáris grammatikák azonosak a reguláris grammatikákkal (3-típusúak). + + \noindent \textbf{Tétel}. Minden bal-lineáris grammatika reguláris (3-típusú) nyelvet generál.\\ + $\triangleleft$ \faLightbulbO}\\ + + \section*{Környezetfüggetlen nyelvek tulajdonságai és elemzésük} + + \subsection*{Környezetfüggetlen grammatikák normálformái} + + \noindent Környezetfüggetlen grammatikák normálformái olyan grammatikai transzformációval előállított grammatikák, melyek: + \begin{itemize} + \item bizonyos szintaktikai feltételeknek/tulajdonságoknak tesznek eleget + \item (általában) valamilyen szempontból egyszerűbbek, mint az eredeti grammatikák + \item ugyanazt a nyelvet generálják (így ugyanazon típusba tartoznak) + \end{itemize} + + \noindent \textbf{Tétel}. Minden $\Big$ környezetfüggetlen grammatikához meg tudunk konstruálni egy vele ekvivalens $G' = \Big$ környezetfüggetlen grammatikát úgy, hogy: $G'$ minden szabályának jobboldala nemüres szó [kivéve azt az esetet, mikor $\varepsilon \in L(G)$, ekkor $S' \rightarrow \varepsilon$ az egyetlen szabály, melynek jobboldala az üres szó és ekkor $S'$ nem fordul elő $G'$ egyetlen szabályának jobboldalán sem.] + + \paragraph*{$\varepsilon$-mentes grammatika} + + \noindent A $G$ grammatika $\varepsilon$-mentes, ha egyetlen szabályának jobboldala sem az üres szó.\\ + + \noindent \textbf{Tétel}. Minden környezetfüggetlen $G$ grammatikához meg tudunk konstruálni egy $G'$ $\varepsilon$-mentes környezetfüggetlen grammatikát, amelyre $L(G') = L(G) - \{\varepsilon\}$ teljesül.\\ + + \paragraph*{Chomsky normálforma} + + \noindent A $G = \Big$ környezetfüggetlen grammatikát Chomsky-normálformájúnak mondjuk, ha minden egyes szabálya: + \begin{itemize} + \item $X \rightarrow a$, ahol $X \in N, a \in T$ + \item $X \rightarrow YZ$, ahol $X,Y,Z \in N$ + \end{itemize} + + \noindent \textbf{Tétel}. Minden $\varepsilon$-mentes $\Big$ környezetfüggetlen grammatikához meg tudunk konstruálni egy vele ekvivalens $G' = \Big$ Chomsky-normálformájú környezetfüggetlen grammatikát.\\ + + \noindent \textbf{Tétel}. (az előző következménye): Minden $G$ környezetfüggetlen grammatika esetében eldönthető, hogy egy $u$ szó benne van-e $G$ grammatika által generált nyelvben.\\ + + \paragraph*{Redukált grammatika} + + \begin{itemize} + \item A környezetfüggetlen grammatika egy nemterminálisát \textbf{\emph{inaktívnak/nem aktívnak}} nevezzük, ha nem vezethető le belőle terminális szó. + \item A környezetfüggetlen grammatika egy nemterminálisát \textbf{\emph{nem elérhetőnek}} nevezzük, ha nem fordul elő egyetlen olyan szóban sem, amely a kezdőszimbólumból levezethető. +% \item Egy nemterminálist nem hasznosnak mondunk, ha vagy inaktív, és/vagy nem elérhető. + \item Az, hogy egy $A$ nemterminális elérhető-e vagy aktív-e, az eldönthető. + \item \emph{Egy környezetfüggetlen grammatika redukált}, ha minden nemterminálisa \emph{aktív} és \emph{elérhető}. + \end{itemize} + + \paragraph*{Elemzés} + + \noindent A környezetfüggetlen nyelvtanok segítségével szintaxisfát építhetünk. Sikeres szintaxisfafelépítés esetén az elemzés sikerült, különben szintaktikai hibát találunk. Módszerek: legbal levezetés, legjobb levezetés.\\ + + \noindent \textbf{Tétel}. Minden környezetfüggetlen grammatikához meg tudunk konstruálni egy vele ekvivalens redukált környezetfüggetlen grammatikát. + + \subsection*{Levezetési fa} + + \noindent A környezetfüggetlen grammatikák levezetéseit fákkal is jellemezhetjük. A levezetési fa egy szó előállításának lehetőségeiről ad információkat. A levezetési fa egy irányított gráf, amely speciális tulajdonságoknak tesz eleget: + \begin{itemize} + \item A gyökér cimkéje: $S$ + \item A többi csúcs cimkéje ($N\cup T$) valamely eleme + \end{itemize} + + \noindent A levezetési fa nem minden esetben adja meg a levezetés során alkalmazott szabályok sorrendjét. Két levezetés lényegében azonos, ha csak a szabályok alkalmazásának sorrendjében különbözik.\\ + + \noindent Egy környezetfüggetlen grammatika minden levezetési fája egy egyértelmű (egyetlen) legbaloldalibb levezetést határoz meg. A legbaloldalibb levezetés során minden levezetési lépésben a legbaloldalibb nemterminálist kell helyettesítenünk.\\ + + \noindent \textbf{Tétel}. Minden környezetfüggetlen grammatikáról eldönthető, hogy az általa generált nyelv az üres nyelv-e vagy sem. + + \subsection*{Bar-Hillel Lemma} + + \noindent Minden $L \in \mathcal{L}_2$ (környezetfüggetlen nyelvhez) meg tudunk adni két nyelvfüggő $p$ és $q$ egész konstanst ($p=p(L),\ q = q(L)$), amelyekre ha $u \in L$ és $|u| > p$, akkor $u-nak$ létezik a következő felbontása + \[ + u = xyzvw \qquad (u,x,w,y,v \in T^*),\ \text{melyre} + \] + \begin{itemize} + \item $|yzv| \geq q$, + \item $|yv| > 0$, + \item $xy^{i}zv^{i}w \in L \qquad (\forall i \geq 0)$ + \end{itemize} + + \noindent A Bar-Hillel lemma azt mondja ki, hogy egy végtelen környezetfüggetlen nyelvben minden elég hosszú szóhoz végtelen sok "hasonló szerkezetű szó" van.\\ + + \noindent $G$ generált $L$ nyelv esetén, ha $|N| = l$, akkor $L$-beli szavak hossza legfeljebb $2^l$.\\ + + \section*{Kiegészítés} + + \begin{tabular}{l|c} + Minden környezet független nyelv felismerhető veremautomatával & $\checkmark$ \\ \hline \\ + Minden környezet független nyelv felismerhető 1 veremmel & $\checkmark$ \\ \hline \\ + Minden 3. típusú nyelv felismerhető VNDA-val & $\checkmark$ \\ \hline \\ + Minden 0-veremautomata véges determinisztikus automata & $\checkmark$ \\ \hline \\ + Minden rekurzív nyelv rekurzívan felsorolható & $\checkmark$ \\ \hline \\ + Minden (kiterjesztett)3. típusú nyelvtan 1. típusú nyelvtan & \checkmark \\ \hline \\ + Minden nyelvtannal leírt nyelv parciálisan rekurzív & \checkmark \\ \hline \\ + Minden rekurzívan felsorolható nyelv parciálisan rekurzív & \checkmark \\ \hline \\ + Minden Chomsky 1. típusú nyelv rekurzív nyelv & \checkmark \\ \hline \\ + Minden Chomsky 2. típusú nyelv rekurzívan felsorolható nyelv & \checkmark \\ \hline \\ + Minden Chomsky 2. típusú nyelv rekurzív nyelv & \checkmark \\ \hline \\ + Minden parciálisan rekurzív nyelv környezet\-függő & $\bigotimes$ \\ \hline \\ + Minden parciálisan rekurzív nyelv reguláris & $\bigotimes$ \\ \hline \\ + Minden nyelvtannal leírt nyelv rekurzívan felsorolható & $\bigotimes$ \\ \hline \\ + Minden nyelvtannal leírt nyelv reguláris & $\bigotimes$ \\ \hline \\ + Minden nyelvtannal leírt nyelv rekurzív & $\bigotimes$ \\ \hline \\ + Minden nyelvtannal leírt nyelv felismertethető VDA-val & $\bigotimes$ \\ \hline \\ + Minden Chomsky 1. típusú nyelv felismerhető 1 veremmel & $\bigotimes$ \\ \hline \\ + Minden Chomsky 1. típusú nyelv felismerhető VDA-val & $\bigotimes$ \\ \hline \\ + Minden rekurzívan felsorolható nyelv reguláris & $\bigotimes$ \\ \hline + \end{tabular} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/img/turinggep_pelda.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/img/turinggep_pelda.png new file mode 100644 index 0000000..36bf5a4 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/img/turinggep_pelda.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.pdf new file mode 100644 index 0000000..c90d0c6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.tex new file mode 100644 index 0000000..1290338 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/12.Logika és számításelmélet/tetel12.tex @@ -0,0 +1,1498 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[magyar]{babel} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{tikz} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + + \geometry{ + a4paper, + total={170mm,257mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{12. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 12. Logika és számításelmélet} \\ + \end{center} + + \section*{Logika} + + \subsection*{Alapfogalmak} + + A logika tárgya az emberi gondolkodási folyamat vizsgálata és + helyes gondolkodási formák keresése, illetve létrehozása.\\ + + \noindent Fogalmak: + \begin{enumerate} + \item \textbf{Állítás}: Olyan kijelentés, melynek logikai értéke (igaz + volta) eldönthető, tetszőleges kontextusban igaz vagy hamis. Azt mondjuk, + hogy egy állítás igaz, ha információtartalma megfelel a valóságnak (a tényeknek), + és hamis az ellenkező esetben. + + A mindennapi beszédben használt kijelentő mondatok legtöbbször nem állítások, mivel + a mondat tartalmába a kontextus is beleszámít: időpont, környezet állapota, általános műveltség + bizonyos szintje, stb. (pl. nem állítás az, hogy "ma reggel 8-kor sütött a nap", de állítás pl. az, hogy + "minden páros szám osztható 2-vel"). + + \item \textbf{Gondolkodási forma}: Gondolkodási forma alatt egy olyan $(F,A)$ párt értünk, ahol + $A$ állítás, $F=\left\{A_{1},A_{2},\ldots,A_{n}\right\}$ pedig állítások egy halmaza. + + A gondolkodásforma helyes, ha minden esetben, amikor $F$ minden állítása igaz, akkor $A$ is igaz. + + \item \textbf{Igazságérték}: Az igazságértékek halmaza $\mathbb{L}=\left\{igaz,hamis\right\}$. + \end{enumerate} + + \subsection*{Ítéletkalkulus} + + \subsubsection*{Az ítéletlogika szintaxisa} + + \paragraph{Az ítéletlogika ábécéje} + Az ítéletlogika ábécéje $V_{0}=V_{v} \cup \left\{(,)\right\} \cup \left\{\neg, \wedge, \vee, \supset\right\}$.\\ + Tehát $V_{0}$ tartalmazza az + \begin{itemize} + \item ítéletváltozókat $V_{v}$ + \item zárójeleket $\left\{(,)\right\}$ + \item logikai műveletek jeleit $\left\{\neg, \wedge, \vee, \supset\right\}$. + \end{itemize} + + \paragraph{Az ítéletlogika nyelve} + Az ítéletlogika nyelve ($\mathcal{L}_{0}$) ítéletlogikai formulákból áll, amelyek a következőképpen állnak elő: + \begin{enumerate} + \item Minden ítéletváltozó ítéletlogikai formula (jff). Ezek az úgynevezett prímformulák (vagy atomi formulák). + + \item Ha $A$ ítéletlogikai formula, akkor $\neg A$ is az. + + \item Ha $A$ és $B$ ítéletlogikai formulák, akkor $(A \wedge B)$, $(A \vee B)$ és $(A \supset B)$ is + ítéletlogikai formulák. + + \item Minden ítéletlogikai formula az 1-3. szabályok véges sokszori alkalmazásával áll elő\\ + (Jól formált formulák). + \end{enumerate} + + \noindent \textbf{Literál}: Ha $X$ ítéletváltozó, akkor az $X$ és $\neg X$ formulák literálok, amelyek alapja $X$.\\ + + \noindent \textbf{Részformula}: Legyen $A \in \mathcal{L}_{0}$ egy ítéletlogikai formula.\\ + + \noindent Ekkor $A$ részformuláinak halmaza a legszűkebb olyan halmaz, melynek + \begin{enumerate} + \item eleme az $A$ formula, és + \item ha a C formula eleme, akkor C közvetlen részformulái is elemei. + \end{enumerate} + + \noindent \textbf{Közvetlen részformula}: + \begin{itemize} + \item Prímformulának nincs közvetlen részformulája. + \item $\neg A$ közvetlen részformulája $A$. + \item $A \circ B$ ($\circ$ az $\wedge, \vee, \supset$ binér összekötőjelek egyike) közvetlen részformulái: + \begin{itemize} + \item $A$ (bal oldali) és + \item $B$ (jobb oldali) + \end{itemize} + \begin{itemize} + \item Egy formulának részformulája a közvetlen részformulája. + \item Egy formulának részformulái minden részformulájának közvetlen részformulái is. + \end{itemize} + \end{itemize} + + \noindent \textbf{Szerkezeti fa}: Egy C formula szerkezeti fája egy olyan \textbf{\emph{véges rendezett fa}}, melynek csúcsai formulák, + \begin{enumerate} + \item gyökere C, + \item a $\neg A$ csúcsának pontosan egy gyermeke van, az $A$, + \item a $A \circ B$ csúcsának pontosan két gyermeke van, rendre az $A$ és $B$ formulák, + \item levelei prímformulák. + \end{enumerate} + + \begin{figure}[H] + \centering + \begin{tikzpicture} + [ + grow = down, + sibling distance = 7em, + level distance = 2.5em, + edge from parent/.style = {draw, -latex}, + every node/.style = {font=\footnotesize}, + sloped + ] + \node {$ (\lnot(X \supset Y) \vee Z)$} + child { node {$ \lnot(X \supset Y)$} + child { node {$(X \supset Y)$} + child { node {X} } + child { node {Y} } } } + child { node {Z} }; + \end{tikzpicture} + \caption{Példa szerkezeti fára.} + \label{fig:szerkfa} + \end{figure} + + \noindent \textbf{Logikai összetettség l(X)}\\ + \noindent Egy formula logikai összetettsége a benne található logikai összekötőjelek száma. + \begin{itemize} + \item Ha $X$ ítéletlogikai változó, akkor $l(X) = 0$ + \item Ha $l(\neg X) = l(X) + 1$ + \item $l(X \circ Y) = l(X) + l(Y)+1$ + \end{itemize} + \noindent \textbf{Művelet hatásköre}: Egy művelet hatásköre a formula részformulái közül + a legkisebb logikai összetettségű, melyben az adott művelet előfordul.\\ + + \noindent \textbf{Fő logikai összekötőjel}: Egy formula fő logikai összekötőjele az az összekötőjel, amelynek + hatásköre maga a formula.\\ + + \noindent \textbf{Precedencia}: A logikai összekötőjelek precedenciája csökkenő sorrendben a következő: $\neg, \wedge, \vee, \supset$.\\ + + \noindent A definíciók alapján egyértelmű, hogy egy \textit{teljesen zárójelezett formulában} mi a logikai \lword{összekötőjelek} hatásköre és mi a fő logikai összekötőjel.\\ + + \paragraph*{Zárójelek elhagyása} + + \noindent Nézzük, hogy egy formulában milyen esetekben és mely részformulákat határoló zárójelek hagyhatóak el úgy, hogy a logikai összekötőjelek hatásköre ne változzon.\\ + + \noindent A részformulák közül a prímformuláknak és a negációs formuláknak nincs külső zárójelpárja, ezért csak az $(A \circ B)$ alakú részformulákról kell eldöntenünk, hogy írható-e helyettük $A \circ B$.\\ + A zárójelek elhagyását mindig a formula külső zárójelpárjának (ha van) elhagyásával kezdjük.\\ + + \noindent Majd ha egy részformulában már megvizsgáltuk a külső zárójelelhagyás kérdését, utána ezen részformula közvetlen részformuláinak külső zárójeleivel foglalkozunk. Két eset lehetséges: + + \begin{enumerate} + \item A részformula egy negációs formula, melyben az $(A \circ B)$ alakú közvetlen részformula külső zárójelei nem hagyhatók el. + + \item A részformula egy $(A \bullet B)$ vagy $A \bullet B$ alakú formula, melynek $A$ és $B$ közvetlen részformuláiban kell dönteni a külső zárójelek sorsáról. + \begin{itemize} + \item Ha az $A$ formula $A_{1} \circ A_{2}$ alakú, akkor $A$ külső zárójelpárja akkor hagyható el, ha $\circ$ nagyobb precedenciájú, mint $\bullet$. + \item Ha a $B$ formula $B_{1} \circ B_{2}$ alakú, akkor $B$ külső zárójelpárja akkor hagyható el, ha $\circ$ nagyobb vagy egyenlő precedenciájú, mint $\bullet$. + \end{itemize} + + \item Ha egy $(A \wedge B)$ vagy $A \wedge B$ alakú formula valamely közvetlen részformulája szintén konjunkció, illetve egy + $(A \vee B)$ vagy $A \vee B$ alakú formula valamely közvetlen részformulája szintén diszjunkció, akkor az ilyen részformulákból a külső zárójelpár elhagyható. + \end{enumerate} + + \noindent \textbf{Formulaláncok}: A zárójelek elhagyására vonatkozó megállapodásokat figyelembe véve \lword{úgynevezett} konjunkciós, diszjunkciós, illetve implikációs formulaláncokat is nyerhetünk.\\ + + \noindent Ezek alakja $A_{1} \wedge \ldots \wedge A_{n}$, $A_{1} \vee \ldots \vee A_{n}$, illetve + $A_{1} \supset \ldots \supset A_{n}$.\\ + + \noindent Ezeknek a láncformuláknak a fő logikai összekötőjelét a következő zárójelezési megállapodással fogjuk meghatározni: + \[ + \Big(A_{1} \wedge \big(A_{2} \wedge \big( \ldots \wedge (A_{n-1} \wedge A_{n})\big)\ldots\big)\Big),\ \Big(A_{1} \vee \big(A_{2} \vee \big( \ldots \vee (A_{n-1} \vee A_{n})\big)\ldots\big)\Big) + \] + illetve + \[ + \Big(A_{1} \supset \big(A_{2} \supset \big( \ldots \supset (A_{n-1} \supset A_{n})\big)\ldots\big)\Big) + \] + +\newpage + \subsection*{Az ítéletlogika szemantikája\\} + + \noindent \textbf{Bázis}: A formula ítéletváltozóinak egy rögzített sorrendje.\\ + + \noindent \textbf{Interpretáció}: $\mathcal{L}_{0}$ interpretációján egy $\mathcal{I} : V_{v} \to \mathbb{L}$ függvényt értünk, mely minden ítéletváltozóhoz egyértelműen hozzárendel egy igazságértéket. Pl. $\mathcal{I}(X) = igaz$.\\ + + \noindent \textbf{Boole-értékelés}: $\mathcal{L}_{0}$-beli formulák $\mathcal{I}$ \textit{interpretációbeli Boole-értékelése} a következő\\ + $\mathcal{B}_{\mathcal{I}} : \mathcal{L}_{0} \to \mathbb{L}$ függvény: + + \begin{enumerate} + \item ha $A$ prímformula, akkor $\mathcal{B}_{\mathcal{I}}(A) = \mathcal{I}(A)$ + + \item $\mathcal{B}_{\mathcal{I}}(\neg A)$ legyen $\neg \mathcal{B}_{\mathcal{I}}(A) $ + + \item $\mathcal{B}_{\mathcal{I}}(A \wedge B)$ legyen $\mathcal{B}_{\mathcal{I}}(A) \wedge \mathcal{B}_{\mathcal{I}}(B)$ + + \item $\mathcal{B}_{\mathcal{I}}(A \vee B)$ legyen $\mathcal{B}_{\mathcal{I}}(A) \vee \mathcal{B}_{\mathcal{I}}(B)$ + + \item $\mathcal{B}_{\mathcal{I}}(A \supset B)$ legyen $\mathcal{B}_{\mathcal{I}}(A) \supset \mathcal{B}_{\mathcal{I}}(B)$ + \end{enumerate} + + \noindent Egy $B_I$ igazságkiértékelés kielégít egy $F$ formulahalmazt, ha $B_I$ az $F$ elemeihez az igaz értéket rendeli, vagyis a formulahalmaz elemei az $I$ interpretációban igazak.\\ + + \noindent \textbf{Igazhalmaz, hamishalmaz}: Egy $A$ formula igazhalmaza $(A^{i})$ azon interpretációk halmaza, melyen a formula igazságértékelése igaz. Az $A$ formula hamishalmaza $(A^{h})$ pedig azon interpretációk halmaza, melyekre a formula igazságértékelése hamis.\\ + + \noindent \textbf{Szemantikus fa}: Egy formula különböző interpretációit szemantikus fa segítségével \lword{szemléltethetjük}. A szemantikus fa egy olyan bináris fa, amelynek $i$. szintje ($i>=1$) a bázis $i$. ítéletváltozójához tartozik, és minden csúcsából két él indul, az egyik a szinthez rendelt ítéletváltozóval, a másik annak negáltjával címkézve. Az $X$ ítéletváltozó esetén az $X$ címke jelentse azt, hogy az $X$ \textit{igaz} az adott interpretációban, a $\neg X$ címke pedig azt, hogy \textit{hamis} az adott interpretációban.\\ + + \noindent A szemantikus fa minden ága egy-egy lehetséges interpretációt reprezentál. Egy $n$ változós formula esetén minden ág $n$ hosszú, és a fának $2^{n}$ ága van és az összes lehetséges interpretációt tartalmazza.\\ + + \begin{center} + \begin{tikzpicture} + \node[rectangle,draw] (G) {G}; + \node[rectangle,draw] (X1) at (-4,-1) {X1}; + \node[rectangle,draw] (X2) at (4,-1) {X2}; + + \node[rectangle,draw] (Y1) at (-6,-2) {Y1}; + \node[rectangle,draw] (Y2) at (-2,-2) {Y2}; + \node[rectangle,draw] (Y3) at (2, -2) {Y3}; + \node[rectangle,draw] (Y4) at (6, -2) {Y4}; + + \node[rectangle,draw] (Z1) at (-7,-4) {Z1}; + \node[rectangle,draw] (Z2) at (-5,-4) {Z2}; + \node[rectangle,draw] (Z3) at (-3,-4) {Z3}; + \node[rectangle,draw] (Z4) at (-1,-4) {Z4}; + \node[rectangle,draw] (Z5) at (1, -4) {Z5}; + \node[rectangle,draw] (Z6) at (3, -4) {Z6}; + \node[rectangle,draw] (Z7) at (5, -4) {Z7}; + \node[rectangle,draw] (Z8) at (7, -4) {Z8}; + + \path[-] (G) edge node[above left] {$X$} (X1); + \path[-] (G) edge node[above right] {$\neg X$} (X2); + + \path[-] (X1) edge node[above left] {$Y$} (Y1); + \path[-] (X1) edge node[above right] {$\neg Y$} (Y2); + + \path[-] (Y1) edge node[above left] {$Z$} (Z1); + \path[-] (Y1) edge node[above right] {$\neg Z$} (Z2); + + \path[-] (Y2) edge node[above left] {$Z$} (Z3); + \path[-] (Y2) edge node[above right] {$\neg Z$} (Z4); + + \path[-] (X2) edge node[above left] {$Y$} (Y3); + \path[-] (X2) edge node[above right] {$\neg Y$} (Y4); + + \path[-] (Y3) edge node[above left] {$Z$} (Z5); + \path[-] (Y3) edge node[above right] {$\neg Z$} (Z6); + + \path[-] (Y4) edge node[above left] {$Z$} (Z7); + \path[-] (Y4) edge node[above right] {$\neg Z$} (Z8); + + \end{tikzpicture} + \end{center} + + \noindent \textbf{Igazságértékelés függvény}: Olyan függvény, amely minden formulához hozzárendeli az igazhalmazát ($\varphi A^{i}$) vagy + a hamishalmazát ($\varphi A^{h}$).\\ +\newpage + \noindent Legyen $A$ egy tetszőleges ítéletlogikai formula. Határozzuk meg $A$-hoz az interpretációira vonatkozó $\varphi A^{i}$, illetve + $\varphi A^{h}$ feltételeket a következőképpen: + + \begin{enumerate} + \item Ha $A$ prímformula, a $\varphi A^{i}$ feltételt pontosan azok az $\mathcal{I}$ interpretációk elégítik ki, melyekre + $\mathcal{I}(A)=igaz$, a $\varphi A^{h}$ feltételt pedig pontosan azok melyekre $\mathcal{I}(A)=hamis$. + + \item A $\varphi (\neg A)^{i}$ feltételek pontosan akkor teljesülnek, ha teljesülnek a $\varphi A^{h}$ feltételek. + + \item A $\varphi (A \wedge B)^{\textbf{i}}$ feltételek pontosan akkor teljesülnek, ha a $\varphi A^{\textbf{i}}$ \textbf{\emph{és}} a $\varphi B^{\textbf{i}}$ feltételek egyszerre teljesülnek. + + \item A $\varphi (A \vee B)^{\textbf{i}}$ feltételek pontosan akkor teljesülnek, ha a $\varphi A^{\textbf{i}}$ \textbf{\emph{vagy}} a $\varphi B^{\textbf{i}}$ feltételek teljesülnek. + + \item A $\varphi (A \supset B)^{\textbf{i}}$ feltételek pontosan akkor teljesülnek, ha a $\varphi A^{\textbf{h}}$ \textbf{\emph{vagy}} a $\varphi B^{\textbf{i}}$ feltételek teljesülnek. + \end{enumerate} + + \noindent \textbf{Tétel}: Tetszőleges $A$ ítéletlogikai formula esetén a $\varphi A^{i}$ feltételeket pontosan az $A^{i}$-beli + interpretációk teljesítik.\\ + + \noindent \textbf{Igazságértékelés-fa}: Egy $A$ formula $\varphi A^{i}$, illetve $\varphi A^{h}$ feltételeket kielégítő interpretációit + az igazságértékelés-fa segítségével szemléltethetjük. Az igazságértékelés-fát a formula szerkezeti fájának felhasználásával állítjuk elő. + + \noindent A gyökérhez hozzárendeljük, hogy $A$ melyik igazságértékre való igazságértékelés-feltételeit keressük, majd a gyökér alá $A$ közvetlen részformulái kerülnek a megfelelő feltétel-előírással, az alábbiak szerint: + + \begin{center} + $\begin{array}{c|c|c|c} + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node { $\varphi(\neg A)^{i}$ } + child { + node { $\varphi A^{h}$ } + }; + \end{tikzpicture} + & + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \wedge B)^{i}$} + child { + node {$\varphi A^{i}$} + child { + node {$\varphi B^{i}$} + } + }; + \end{tikzpicture} + & + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \vee B)^{i}$} + child { node {$\varphi A^{i}$} } + child { node {$\varphi B^{i}$} }; + \end{tikzpicture} + & + + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \supset B)^{i}$} + child { node {$\varphi A^{h}$} } + child { node {$\varphi B^{i}$} }; + \end{tikzpicture} + + \\ \hline + + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node { $\varphi(\neg A)^{h}$ } + child { + node {$\varphi A^{i}$ } + }; + \end{tikzpicture} + & + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \wedge B)^{h}$} + child { node {$\varphi A^{h}$} } + child { node {$\varphi B^{h}$} }; + \end{tikzpicture} + & + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \vee B)^{h}$} + child { + node {$\varphi A^{h}$} + child { + node {$\varphi B^{h}$} + } + }; + \end{tikzpicture} + & + \begin{tikzpicture}[grow = down, sibling distance = 5em, edge from parent/.style = {draw, -latex}, every node/.style = {font=\footnotesize}, sloped, level distance=12mm, text depth=.1em] + \node {$\varphi(A \supset B)^{h}$} + child { + node {$\varphi A^{i}$} + child { + node {$\varphi B^{h}$} + } + }; + \end{tikzpicture} + \end{array}$ + \end{center} + + \noindent Ezután a gyökérhez a \checkmark (feldolgozott) jelet rendeljük. Az eljárást rekurzívan folytatjuk, amíg egy ágon a fel nem dolgozott formulák + + \begin{itemize} + \item (a) mind ítéletváltozók nem lesznek, vagy + \item (b) ugyanarra a formulára egymásnak ellentmondó előírás nem jelenik meg. + \end{itemize} + + \noindent Az (a) esetben az ágon előforduló ítéletváltozóknak az ágon rögzített igazságértékeit tartalmazó $n$-esek mind elemei $\varphi A^{i}$ gyökér esetén a formula igazhalmazának, $\varphi A^{h}$ gyökér esetén a formula hamishalmazának. + + \noindent A (b) esetben nem áll elő ilyen igazságérték $n$-es. + + \begin{figure}[H] + \centering + \begin{tikzpicture} + [ + grow = down, + sibling distance = 5em, + edge from parent/.style = {draw, -latex}, + every node/.style = {font=\footnotesize}, + sloped, + level distance=12mm, + text depth=.1em, + level 1/.style={sibling distance=5em}, + level 2/.style={sibling distance=30em}, + level 3/.style={sibling distance=15em}, + level 4/.style={sibling distance=8em} + ] + \node {$ \varphi((Y \vee Z) \wedge (Z \supset \neg X))^{i} \quad \checkmark$} + child { node {$ \varphi(Y \vee Z)^{i} \quad \checkmark$} + child { + node {$ \varphi (Z \supset \neg X)^{i} \quad \checkmark$} + child { node {$\varphi Y^{i} $} + child { node {$\varphi Z^{h}$} } + child { node {$\varphi(\neg X^{i}) \quad \checkmark$} + child { node {$\varphi X^{h}$} } + } + } + child { node {$\varphi Z^{i} $} + child { node {$\underset{\times}{\varphi Z^{h}}$} } + child { node {$\varphi(\neg X^{i}) \quad \checkmark$} + child { node {$\varphi X^{h} $} } + } + } + } + }; + \end{tikzpicture} + \caption{Példa igazságértékelés fára.} + \label{fig:szerkfa} + \end{figure} + + \noindent Az elöbbi példában a formula igazhalmaza az igazságértékelés-fa alapján: + \[ + \left\{(i,i,h),(h,i,i),(h,i,h),(h,h,i)\right\} + \] + + \noindent \textbf{Igazságtábla}: Egy $n$ változós formula igazságtáblája egy $n+1$ oszlopból és $2^{n}$ sorból álló táblázat. + A táblázat fejlécében az $i$. oszlophoz ($1<=i<=n$) a formula bázisának $i$. ítéletváltozója, az $n+1$. oszlophoz maga a formula + van hozzárendelve. Az első $n$ oszlopban az egyes sorokhoz megadjuk rendre a formula különböző interpretációit, majd a formula + oszlopába minden sorba beírjuk a formula - a sorhoz tartozó interpretációbeli Boole-értékeléssel kapott - igazságértékét.\\ + + \noindent \textbf{A logikai műveletek igazságtáblája}: + + \begin{center} + \begin{tabular}{|c|c||c|} + \hline + \textbf{X} & \textbf{Y} & $\boldsymbol{\neg X}$ \\ \hline + \textbf{i} & \textbf{i} & h \\ \hline + \textbf{i} & h & h \\ \hline + h & \textbf{i} & \textbf{i} \\ \hline + h & h & \textbf{i} \\ \hline + \end{tabular}\quad + \begin{tabular}{|c|c||c|} + \hline + \textbf{X} & \textbf{Y} & $\boldsymbol{X \wedge Y}$ \\ \hline + \textbf{i} & \textbf{i} & \textbf{i} \\ \hline + \textbf{i} & h & h \\ \hline + h & \textbf{i} & h \\ \hline + h & h & h \\ \hline + \end{tabular}\quad + \begin{tabular}{|c|c||c|} + \hline + \textbf{X} & \textbf{Y} & $\boldsymbol{X \vee Y}$ \\ \hline + \textbf{i} & \textbf{i} & \textbf{i} \\ \hline + \textbf{i} & h & \textbf{i} \\ \hline + h & \textbf{i} & \textbf{i} \\ \hline + h & h & h \\ \hline + \end{tabular}\quad + \begin{tabular}{|c|c||c|} + \hline + \textbf{X} & \textbf{Y} & $\boldsymbol{X \supset Y}$ \\ \hline + \textbf{i} & \textbf{i} & \textbf{i} \\ \hline + \textbf{i} & h & h \\ \hline + h & \textbf{i} & \textbf{i} \\ \hline + h & h & \textbf{i} \\ \hline + \end{tabular} + \end{center} + + \noindent \textbf{Kiterjesztett igazságtábla}: Egy igazságtáblában a formula igazságértéke kiszámításának megkönnyítésére vezették + be a kiterjesztett igazságtáblát. A kiterjesztett igazságtáblában az ítéletváltozókhoz és a formulához rendelt oszlopokon kívül rendre + a formula részformuláihoz tartozó oszlopok is megjelennek. Tulajdonképpen a szerkezeti fában megjelenő részformulák vannak felsorolva. + + \begin{center} + $\begin{array}{|c|c|c|c|c|c|c|} + \hline + \textbf{X} & \textbf{Y} & \textbf{Z} & \boldsymbol{Y \vee Z} & \boldsymbol{\neg X} & \boldsymbol{Z \supset \neg X} & \boldsymbol{(Y \vee Z) \wedge (Z \supset \neg X)} \\ \hline + i & i & i & i & h & h & h \\ \hline + i & i & h & i & h & i & i \\ \hline + i & h & i & i & h & h & h \\ \hline + i & h & h & h & h & i & h \\ \hline + h & i & i & i & i & i & i \\ \hline + h & i & h & i & i & i & i \\ \hline + h & h & i & i & i & i & i \\ \hline + h & h & h & h & i & i & h \\ \hline + + \end{array}$ + \end{center} + + \noindent \textbf{Formula kielégíthetősége, modellje}: Egy $A$ ítéletlogikai formula \textit{kielégíthető}, ha létezik olyan $\mathcal{I}$ interpretáció, melyre $\mathcal{I} \models_{0} A$, azaz a $\mathcal{B}_{\mathcal{I}}$ Boole-értékelés $A$-hoz igaz értéket rendel. Egy ilyen interpretációt $A$ \textit{modelljének} nevezünk. Ha $A$-nak nincs modellje, akkor azt mondjuk, hogy \textit{kielégíthetetlen}.\\ + + \noindent Ha $A$ igazságtáblájában van olyan sor, amelyben a formula oszlopában igaz érték szerepel, akkor a formula kielégíthető, különben kielégíthetetlen. Ugyanígy, ha $\varphi A^{i}$ nem üres, akkor kielégíthető, különben kielégíthetetlen.\\ + + \noindent \textbf{Ítéletlogikai törvény, tautológia}: Egy $A$ ítéletlogikai formula \textit{ítéletlogikai törvény} vagy másképpen \textit{tautológia}, ha $\mathcal{L}_{0}$ minden interpretációja modellje $A$-nak. (jelölés: $\models_{0} A$)\\ + + \subsection*{Eldöntésproblémák\\} + + \noindent \textbf{Eldöntésprobléma}: Eldöntésproblémának nevezzük a következő feladatokat: + \begin{enumerate} + \item Döntsük el tetszőleges formuláról, hogy tautológia-e! + + \item Döntsük el tetszőleges formuláról, hogy kielégíthetetlen-e! + \end{enumerate} + + \noindent \textbf{Tautologikusan ekvivalens formulák}: Az $A$ és $B$ ítéletlogikai formulák \textit{tautologikusan ekvivalensek} (jelölés: $A \sim _{0} B$), ha $\mathcal{L}_{0}$ minden $\mathcal{I}$ interpretációjában $\mathcal{B}_{\mathcal{I}}(A)=\mathcal{B}_{\mathcal{I}}(B)$.\\ + + \noindent \textbf{Formulahalmaz kielégíthetősége, modellje}: $\mathcal{L}_{0}$ formuláinak egy tetszőleges $\Gamma\ (gamma)$ halmaza + kielégíthető, ha van $\mathcal{L}_{0}$-nak olyan $\mathcal{I}$ interpretációja, melyre: $\forall A \in \Gamma: \mathcal{I} \models_{0} A$. + Egy ilyen $\mathcal{I}$ interpretáció modellje $\Gamma$-nak. Ha $\Gamma$-nak nincs modellje, akkor $\Gamma$ kielégíthetetlen.\\ + + \noindent \textbf{Lemma}: Egy $\left\{A_{1},A_{2},\ldots,A_{n}\right\}$ formulahalmaznak pontosan azok az $\mathcal{I}$ interpretációk + a modelljei, amelyek a $A_{1} \wedge A_{2} \wedge \ldots \wedge A_{n}$ formulának. Következésképpen $\left\{A_{1},A_{2},\ldots,A_{n}\right\}$ + pontosan akkor kielégíthetetlen, ha az $A_{1} \wedge A_{2} \wedge \ldots \wedge A_{n}$ formula kielégíthetlen.\\ + + \noindent \textbf{Szemantikus következmény}: Legyen $\Gamma$ ítéletlogikai formulák tetszőleges halmaza, $B$ egy tetszőleges formula. + Azt mondjuk, hogy a $B$ formula \textit{\textbf{tautologikus következménye}} a $\Gamma$ formulahalmaznak (jelölés: $\Gamma \models_{0} B$), ha minden olyan interpretáció, amely modellje $\Gamma$-nak, modellje $B$-nek is. A $\Gamma$-beli formulákat feltételformuláknak, vagy premisszáknak, + a B formulát következményformulának (konklúziónak) hívjuk.\\ + + \noindent \textbf{Tétel}: Legyen $\Gamma$ ítéletlogikai formulák tetszőleges halmaza, $A$,$B$,$C$ tetszőleges ítéletlogikai formulák. + Ha $\Gamma \models_{0} A$, $\Gamma \models_{0} B$ és $\left\{A,B\right\} \models_{0} C$, akkor $\Gamma \models_{0} C$.\\ + + \noindent \textbf{Tétel}: (\textbf{Eldöntésprobléma tétele (1)}) Legyenek $A_{1},A_{2},\ldots,A_{n}, B$ tetszőleges ítéletlogikai formulák. + $\left\{A_{1},A_{2},\ldots,A_{n}\right\} \models_{0} B$ pontosan akkor, ha a $\left\{A_{1},A_{2},\ldots,A_{n}, \neg B\right\}$ + formulahalmaz kielégíthetetlen, azaz a\\ + $A_{1} \wedge A_{2} \wedge \ldots \wedge A_{n} \wedge \neg B$ formula kielégíthetetlen.\\ + + \noindent \textbf{Tétel}: (\textbf{Dedukciós tétel}) Legyenek $A_{1},A_{2},\ldots,A_{n}, B$ tetszőleges ítéletlogikai formulák.\\ + $\left\{A_{1},A_{2},\ldots,A_{n}\right\} \models_{0} B$ pontosan akkor, ha + $\left\{A_{1},A_{2},\ldots,A_{n}\right\} \supset B$.\\ + + \noindent \textbf{Tétel}: (\textbf{Eldöntésprobléma tétele (2)}) Legyenek $A_{1},A_{2},\ldots,A_{n}, B$ tetszőleges ítéletlogikai formulák. + $\left\{A_{1},A_{2},\ldots,A_{n}\right\} \models_{0} B$ pontosan akkor, ha + $\models_{0} A_{1} \supset A_{2} \supset \ldots \supset A_{n} \supset B$. +\newpage + \paragraph{Ekvivalens átalakítások} + Fogalmak: + \begin{itemize} + \item Egy prímformulát (ítéletváltozót), vagy annak a negáltját közös néven \textit{literálnak} nevezünk. A prímformula + a \textit{literál alapja}. Egy literált bizonyos esetekben \textit{egységkonjunkciónak} vagy \textit{egységdiszjunkciónak} + (\textit{egységklóznak}) is hívunk. + + \item \textit{Elemi konjunkció} az egységkonjunkció, illetve a különböző alapú literálok konjunkciója ($\wedge$ kapcsolat + a literálok között). + \item \textit{Elemi diszjunkció} vagy \textit{klóz} az egységdiszjunkció és a különböző alapú literálok + diszjunkciója ($\vee$ kapcsolat a literálok között). + \item Egy elemi konjunkció, illetve elemi diszjunkció \textit{teljes} + egy $n$-változós logikai műveletre nézve, ha mind az $n$ ítéletváltozó alapja valamely literáljának. + \item \textit{Diszjunktív normálformának} (DNF) nevezzük az elemi konjunkciók diszjunkcióját. + \item \textit{Konjunktív normálformának} (KNF) nevezzük az elemi diszjunkciók konjunkcióját. + \item \textit{Kitüntetett} diszjunktív, illetve konjunktív normálformákról (KDNF, ileltve KKNF) beszélünk, ha a bennük szereplő + elemi konjunkciók, illetve elemi diszjunkciók teljesek. + + \end{itemize} + + \noindent \textbf{Tetszőleges logikai műveletet leíró KDNF, KKNF előállítása}: Legyen $b: \mathbb{L}^{n} \to \mathbb{L}$ + egy $n$-változós logikai művelet. Adjuk meg $b$ művelettábláját.\\ + + \noindent Az első $n$ oszlop fejlécébe az $X_{1}$, $X_{2}$, \ldots $X_{n}$ ítéletváltozókat írjuk.\\ + + \noindent A $b$-t leíró KDNF előállítása: + + \begin{enumerate} + \item Válasszuk ki azokat a sorokat a művelettáblában, ahol az adott igazságérték $n$-eshez $b$ \textit{igaz} értéket rendel hozzá. Legyenek ezek a sorok rendre $s_{1}, s_{2}, \ldots, s_{r}$. Minden ilyen sorhoz rendeljünk hozzá egy $X_{1}' \wedge X_{2}' \wedge \ldots \wedge X_{n}'$ teljes elemi konjunkciót úgy, hogy az $X_{j}'$ literál $X_{j}$ vagy $\neg X_{j}$ legyen aszerint, hogy ebben a sorban $X_{j}$ \textit{igaz} vagy \textit{hamis} igazságérték szerepel. Az így nyert teljes elemi konjunkciók legyenek rendre $k_{s_{1}}, k_{s_{2}}, \ldots, k_{s_{r}}$. + + \item Az így kapott teljes elemi konjunkciókból készítsünk egy diszjunkciós láncformulát: + \[ + k_{s_{1}} \vee k_{s_{2}} \vee \ldots \vee k_{s_{r}} + \] + \end{enumerate} + + \noindent Ez a formula lesz a $b$ művelet kitüntetett diszjunktív normálformája (KDNF). + + \begin{center} + $\begin{array}{c|c|c||c|c|c} + \textbf{X} & \textbf{Y} & \textbf{Z} & \textbf{b} & & \text{a teljes elemi konjukciók} \\ \hline + i & i & i & h & & \\ \hline + i & i & h & i & * & X \wedge Y \wedge \neg Z \\ \hline + i & h & i & h & & \\ \hline + i & h & h & i & * & X \wedge \neg Y \wedge \neg Z \\ \hline + h & i & i & i & * & X \neg \wedge Y \wedge Z \\ \hline + h & i & h & h & & \\ \hline + h & h & i & i & * & \neg X \wedge \neg Y \wedge Z \\ \hline + h & h & h & i & * & \neg X \wedge \neg Y \neg \wedge Z + \end{array}$ + \end{center} + + \noindent A fenti példa $b$ műveletének kitüntetett diszjunktív normálformája a következő formula: + \[ + (X \wedge Y \wedge \neg Z) \vee (X \wedge \neg Y \wedge \neg Z) \vee (\neg X \wedge Y \wedge Z) \vee (\neg X \wedge \neg Y \wedge Z) \vee (\neg X \wedge \neg Y \wedge \neg Z) + \] +\newpage + \noindent A $b$-t leíró KKNF előállítása: + + \begin{enumerate} + \item Válasszuk ki azokat a sorokat a művelettáblában, ahol az adott igazságérték $n$-eshez $b$ \textit{hamis} + értéket rendel hozzá. Legyenek ezek a sorok rendre $s_{1}, s_{2}, .. s_{r}$. Minden ilyen sorhoz rendeljünk + hozzá egy $X_{1}' \vee X_{2}' \vee \ldots \vee X_{n}'$ teljes elemi diszjunkciót úgy, hogy az $X_{j}'$ literál + $X_{j}$ vagy $\neg X_{j}$ legyen aszerint, hogy ebben a sorban $X_{j}$ \textit{hamis} vagy \textit{igaz} igazságérték + szerepel. Az így nyert teljes elemi diszjunkciók legyenek rendre $d_{s_{1}}, d_{s_{2}}, .. d_{s_{r}}$. + + \item Az így kapott teljes elemi diszjunkciókból készítsünk egy konjunkciós láncformulát: + \[ + d_{s_{1}} \wedge d_{s_{2}} \wedge \ldots \wedge d_{s_{r}} + \] + Ez a formula lesz a $b$ művelet kitüntetett konjunktív normálformája (KKNF). + \end{enumerate} + + \begin{center} + $\begin{array}{c|c|c||c|c|c} + \textbf{X} & \textbf{Y} & \textbf{Z} & \textbf{b} & & \text{a teljes elemi diszjunkciók} \\ \hline + i & i & i & h & * & \neg X \vee \neg Y \vee \neg Z \\ \hline + i & i & h & i & & \\ \hline + i & h & i & h & * & \neg X \vee Y \vee \neg Z \\ \hline + i & h & h & i & & \\ \hline + h & i & i & i & & \\ \hline + h & i & h & i & & \\ \hline + h & h & i & h & * & X \vee Y \vee \neg Z \\ \hline + h & h & h & i & & + \end{array}$ + \end{center} + + A fenti példa $b$ műveletének kitüntetett konjunktív normálformája a következő formula: + \[ + (\neg X \vee \neg Y \vee \neg Z) \wedge (\neg X \vee Y \vee \neg Z) \wedge (X \vee Y \vee \neg Z) + \] + + \noindent \textbf{KNF, DNF egyszerűsítése}: Egy ítéletlogikai formula logikai összetettségén a formulában szereplő logikai összekötőjelek számát értettük. Ugyanazt a logikai műveletet leíró formulák közül azt tekintjük egyszerűbbnek, amelynek kisebb a logikai összetettsége (azaz kevesebb logikai összekötőjelet tartalmaz).\\ + + \noindent Legyen $X$ egy ítéletváltozó $k$ egy az $X$-et nem tartalmazó elemi konjunkció, $d$ egy $X$-et nem tartalmazó elemi + diszjunkció. Ekkor az + + \begin{itemize} + \item (a) $(X \wedge k) \vee (\neg X \wedge k) \sim_{0} k $ és + + \item (b) $(X \vee d) \wedge (\neg X \vee d) \sim_{0} d $ + \end{itemize} + egyszerűsítési szabályok alkalmazásával konjunktív és diszjunktív normálformákat írhatunk át egyszerűbb alakba.\\ + + \noindent Klasszikus Quine--McCluskey-féle algoritmus KDNF egyszerűsítésére: + + \begin{enumerate} + \item Soroljuk fel a KDNF-ben szereplő összes teljes elemi konjunkciót az $L_{0}$ listában, $j:=0$. + + \item Megvizsgáljuk az $L_{j}$-ben szereplő összes lehetséges elemi konjunkciópárt, hogy alkalmazható-e + rájuk az (a) egyszerűsítési szabály. Ha igen, akkor a két kiválasztott konjunkciót $\checkmark$-val megjelöljük, + és az eredmény konjunkciót beírjuk a $L_{j+1}$ listába. Azok az elemi konjunkciók, amelyek az $L_{j}$ vizsgálata + során nem lesznek megjelölve, nem voltak egyszerűsíthetők, tehát bekerülnek az egyszerűsített diszjunktív + normálformába. + + \item Ha az $L_{j+1}$ konjunkciólista nem üres, akkor $j:=j+1$. Hajtsuk végre újból a 2. lépést. + + \item Az algoritmus során kapott, de meg nem jelölt elemi konjunkciókból készítsünk egy diszjunkciós + láncformulát. Így az eredeti KDNF-el logikailag ekvivalens, egyszerűsített DNF-et kapunk. + \end{enumerate} + + \paragraph{Rezolúció} + + \noindent Legyenek $A_{1}, A_{2}, \ldots , A_{n}, B$ tetszőleges ítéletlogikai formulák. Azt szeretnénk bebizonyítani, hogy $\left\{A_{1}, A_{2}, \ldots , A_{n}\right\} \models_{0} B$, ami ekvivalens azzal, hogy $\left\{A_{1}, A_{2}, \ldots , A_{n}, \neg B\right\}$ kielégíthetetlen.\\ + + \noindent Írjuk át ez utóbbi formulahalmaz formuláit KNF alakba. + + \noindent Ekkor a + \[ + \left\{KNF_{A_{1}}, KNF_{A_{2}}, \ldots , KNF_{A_{n}}, KNF_{\neg B}\right\} + \] + formulahalmazt kapjuk, ami pontosan akkor kielégíthetetlen, ha a halmaz formuláiban szereplő klózok halmaza kielégíthetetlen.\\ + + \noindent A klózokra vonatkozó egyszerűsítési szabály szerint ha $X$ ítéletváltozó, $C$ pedig $X$-et nem tartalmazó klóz, akkor + \[ + (X \vee C) \wedge (\neg X \vee C) \sim_{0} C + \] + + \noindent Az $X$ és a $\neg X$ egységklózok (azt mondjuk, hogy $X$ és $\neg X$ komplemens literálpár) konjunkciójával ekvivalens egyszerűbb.\\ + + \noindent Egyetlen literált sem tartalmazó klóz az \textbf{\emph{üres klóz}}, melyet a $\square$ jellel jelölünk és definíció szerint minden interpretációban hamis igazságértékű.\\ + + \noindent Legyenek most $C_{1}$ és $C_{2}$ olyan klózok, melyek pontosan egy komplemens literálpárt tartalmaznak, azaz $C_{1} = C_{1}' \vee L_{1}$ és $C_{2} = C_{2}' \vee L_{2}$, ahol $L_{1}$ és $L_{2}$ az egyetlen komplemens literálpár ($C_{1}'$ és $C_{2}'$ üres klózok is lehetnek). Világos, hogy ha a két klózban a komplemens literálpáron kívül is vannak literálok, és ezek nem mind azonosak, az egyszerűsítési szabály alkalmazhatósági feltétele nem áll fenn.\\ + + \noindent \textbf{Tétel}: Ha $C_{1} = C_{1}' \vee L_{1}$ és $C_{2} = C_{2}' \vee L_{2}$, ahol $L_{1}$ és $L_{2}$ komplemens literálpár, akkor + \[ + \left\{C_{1},C_{2}\right\} \models_{0} C_{1}' \vee C_{2}' + \] + + \noindent \textbf{Rezolvens}: Legyenek $C_{1}$ és $C_{2}$ olyan klózok, melyek pontosan egy komplemens literálpárt tartalmaznak, azaz $C_{1} = C_{1}' \vee L_{1}$ és $C_{2} = C_{2}' \vee L_{2}$, ahol $L_{1}$ és $L_{2}$ a komplemens literálpár, a $C_{1}' \vee C_{2}'$ klózt a $(C_{1},C_{2})$ klózpár (vagy a $C_{1} \vee C_{2}$ formula) \textit{rezolvensének} nevezzük.\\ + + \noindent Ha $C_{1} = L_{1}$ és $C_{2} = L_{2}$ (azaz $C_{1}'$ és $C_{2}'$ üres klózok), rezolvensük az üres klóz ($\square$).\\ + Az a tevékenység, melynek eredménye a rezolvens, a \textit{rezolválás}. + \begin{center} + $\begin{array}{r|l} + \textbf{klózpár} & \textbf{rezolvens} \\ \hline + (X \vee Y,\neg Y \vee Z) & X \vee Z \\ + (X \vee \neg Y, \neg Y \vee Z) & \text{nincs: mindkét azonos alapú literál negált} \\ + (X \vee \neg Y, Z \vee \neg V) & \text{nincs: nincs azonos alapú literál} \\ + (\neg X \vee \neg Y, X \vee Y \vee Z) & \text{nincs: két komplemens literálpár van} \\ + (X, \neg X) & \Box \\ + \end{array}$ + \end{center} + + \noindent \textbf{Tétel}: Ha a $C$ klóz a $(C_{1},C_{2})$ klózpár rezolvense, akkor azon $\mathcal{I}$ interpretációk + a $\left\{C_{1}, C_{2}\right\}$ klózhalmazt nem elégíthetik ki, amelyekben $C$ igazságértéke hamis, azaz + $\mathcal{B}_{\mathcal{I}}(C) = hamis$.\\ +\newpage + \noindent \textbf{Rezolúciós levezetés}: Egy $S$ klózhalmazból a $C$ klóz rezolúciós levezetése egy olyan véges + $k_{1}, k_{2}, \ldots ,k_{m}\ (m \geq 1)$ klózsorozat, ahol minden $j = 1, 2, \ldots, m$-re + + \begin{enumerate} + \item vagy $k_{j} \in S$, + \item vagy van olyan $1 \leq s,t \le j$, hogy $k_{j}$ a $(k_{s}, k_{t})$ klózpár rezolvense, + \end{enumerate} + \noindent és a klózsorozat utolsó tagja, $k_{m}$, éppen a $C$ klóz.\\ + + \noindent Megállapodásunk szerint a \textbf{\emph{rezolúciós kalkulus eldöntésproblémája}}: + \begin{center} + levezethető-e $S$-ből az $\square$. + \end{center} + + \noindent A rezolúciós levezetés célja tehát $\square$ levezetése $S$-ből. Azt, hogy $\square$ levezethető $S$-ből, úgy is ki lehet fejezni, hogy létezik $S$-nek rezolúciós cáfolata.\\ + + \noindent Példa: Próbáljuk meg levezetni + \[ + \square\text{-t az }S = \left\{\neg X \vee Y\boldsymbol{,}\ \neg Y \vee Z\boldsymbol{,}\ X \vee V\boldsymbol{,}\ \neg V \vee Y \vee Z\boldsymbol{,}\ \neg Z \right\} + \] + klózhalmazból. A levezetés bármelyik $S$-beli klózból indítható. + + \begin{center} + $\begin{array}{rll} + 1. & \neg V \vee Y \vee Z & [\ \in S\ ] \\ + 2. & \neg Z & [\ \in S\ ] \\ + 3. & \neg V \vee Y & [\ 1,2\ rezolvense\ ] \\ + 4. & \neg Y \vee Z & [\ \in S\ ] \\ + 5. & \neg Y & [\ 2,4\ rezolvense\ ] \\ + 6. & \neg V & [\ 3,5\ rezolvense\ ] \\ + 7. & X \vee V & [\ \in S\ ] \\ + 8. & X & [\ 6,7\ rezolvense\ ] \\ + 9. & \neg X \vee Y & [\ \in S\ ] \\ + 10. & Y & [\ 8,9\ rezolvense\ ] \\ + 11. & \Box & [\ 5,10\ rezolvense\ ] \\ + \end{array}$ + \end{center} + + \noindent \textbf{Lemma}: Legyen $S$ tetszőleges klózhalmaz. $S$-ből történő rezolúciós levezetés esetén bármely $S$-ből + levezetett klóz tautologikus következménye $S$-nek.\\ + + \noindent \textbf{A rezolúciós kalkulus helyessége}: A rezolúciós kalkulus \textit{helyes}, azaz tetszőleges + $S$ klózhalmaz esetén amennyiben $S$-ből levezethető $\square$, akkor $S$ \textit{kielégíthetetlen}.\\ + + \noindent \textbf{A rezolúciós kalkulus teljessége}: A rezolúciós kalkulus \textit{teljes}, azaz bármely véges, kielégíthetetlen + $S$ klózhalmaz esetén $S$-ből levezethető $\square$.\\ + + \noindent \textbf{Levezetési fa}: Egy rezolúciós levezetés szerkezetét \textit{levezetési fa} segítségével szemléltethetjük. + A levezetési fa csúcsai klózok. Két csúcsból pontosan akkor vezet él egy harmadik, közös csúcsba, ha az a két klóz rezolvense. + + \begin{figure}[H] + \centering + \begin{tikzpicture} + [ + grow = down, + sibling distance = 5em, + edge from parent/.style = {draw, -latex}, + every node/.style = {font=\footnotesize}, + sloped, + level distance=12mm, + text depth=.1em, + level 1/.style={sibling distance=5em}, + level 2/.style={sibling distance=5em}, + level 3/.style={sibling distance=5em}, + level 4/.style={sibling distance=8em} + ] + \node {$ \underset{11}{\Box} $}[grow'=up] + child { node { $\underset{5}{\neg Y}$ }} + child { node {$\underset{10}{Y}$} + child { node {$\underset{8}{X}$} + child { node { $\underset{6}{\neg V}$ } + child { node { $\underset{3}{\neg V \vee Y}$ } + child { node { $\underset{1}{\neg V \vee Y \vee Z}$ } } + child { node { $\underset{2}{\neg Z}$ } } + } + child { node { $\underset{5}{\neg Y}$ } + child { node { $\neg Z$ } } + child { node { $\underset{4}{\neg Y \vee Z}$ } } + } + } + child { node { $\underset{7}{X \vee V}$ } } + } + child { node { $\underset{9}{\neg X \vee Y}$ } } + }; + \end{tikzpicture} + \caption{Példa szerkezeti fára.} + \label{fig:szerkfa} + \end{figure} + + \noindent \textbf{Rezolúciós stratégiák}: + + \begin{itemize} + \item \textit{Lineáris rezolúció}: Egy $S$ klózhalmazból való \textbf{\emph{lineáris rezolúciós levezetés}} egy olyan $k_{1},l_{1},k_{2},l_{2}, \ldots, k_{m-1},l_{m-1}, k_{m}$ rezolúciós levezetés, amelyben minden $j = 2, 3, \ldots, m$-re $k_{j}$ a $(k_{j-1},l_{j-1})$ klózpár rezolvense. A $k_{j}$ klózokat \emph{\textbf{centrális klóz}}oknak, az $l_{j}$ klózokat \textbf{\emph{mellékklóz}}oknak nevezzük. + + \noindent Tetszőleges rezolúciós levezetés átírható lineárissá, azaz a \emph{lineáris rezolúciós kalkulus teljes}. + + \item \textit{Lineáris inputrezolúció}: Egy $S$ klózhalmazból való \textbf{\emph{lineáris inputrezolúciós levezetés}} egy olyan $k_{1},l_{1},k_{2},l_{2}, \ldots, k_{m-1},l_{m-1}, k_{m}$ lineáris rezolúciós levezetés, amelyben minden $j = 1, 2, \ldots, m-1$-re $l_{j} \in S$, azaz a lineáris inputrezolúciós levezetésben a mellékklózok $S$ elemei. Nem teljes (kivéve Horn-klózok). + + \item \textit{Egységrezolúció:} Egy $S$ klózhalmazból való \textbf{\emph{egységrezolúciós levezetés}} egy olyan $k_{1}, \ldots, k_{m}$ rezolúciós levezetés, ahol minden $j = 1, 2, \ldots, m$-re $k_{j} \in S$, ha $k_j \not \in S$, \\ + akkor $k_j$ két olyan őt a levezetésben megelőző $k_s, k_t$ klóznak a rezolvense, amelyek közül az egyik egségklóz. Nem teljes. + \end{itemize} + + \noindent A lineáris inputrezolúciós stratégia nem teljes, de megadható olyan formulaosztály, melyre az.\\ + A legfeljebb egy negált literált tartalmazó klózokat \textbf{\emph{Horn-klózok}}nak nevezzük, a Horn-formulák pedig azok a formulák, melyek konjunktív normálformája Horn-klózok konjunkciója. \\ + A lineáris inputrezolúciós stratégia Horn-formulák esetén teljes. + + \subsection*{Predikátumkalkulus} + + \subsubsection*{Elsőrendű logikai nyelvek szintaxisa} + + Egy elsőrendű logikai nyelv ábécéje logikai és logikán kívüli szimbólumokat, továbbá elválasztójeleket tartalmaz. + A logikán kívüli szimbólumhalmaz megadható $$ alakban, ahol: + + \begin{enumerate} + \item $Srt$ nemüres halmaz, elemei fajtákat szimbolizálnak, + \item $Pr$ nemüres halmaz, elemei predikátumszimbólumok, + \item $Fn$ halmaz elemei függvényszimbólumok, + \item $Cnst$ pedig a függvényszimbólumok halmaza. + \end{enumerate} + +\newpage + \noindent Az $$ ábécé szignatúrája egy $<\nu_{1}, \nu_{2}, \nu_{3}>$ hármas, ahol + + \begin{enumerate} + \item $\nu_{1}$ a $\forall P \in Pr$ \emph{predikátumszimbólumhoz} annak \emph{alakját},\\ +% azaz a $(\pi_{1}, \pi_{2}, \ldots, \pi_{k})$ fajtasorozatot, + \item $\nu_{2}$ a $\forall f \in Fn$ \emph{függvényszimbólumhoz} annak \emph{alakját}, \\ +% azaz a $(\pi_{1}, \pi_{2}, \ldots, \pi_{k}, \pi)$ fajtasorozatot és + \item $\nu_{3}$ $\forall c \in Cnst$ \emph{konstansszimbólumhoz} annak \emph{fajtáját}, \\ +% azaz $(\pi)$-t $\pi_{1}, \pi_{2}, \ldots, \pi_{k},\ \pi \in Srt\quad (k > 0)$ + \end{enumerate} + \noindent rendeli.\\ + + \noindent Logikai jelek az ítéletlogikában is használt logikai összekötőjelek, valamint az univerzális ($\forall$) és egzisztenciális ($\exists$) kvantorok és a különböző fajtájú individuumváltozók.\\ + + \noindent Egy elsőrendű nyelv ábécéjében minden $\pi \in Srt$ fajtához szimbólumoknak megszámlálhatóan végtelen $v_{1}^{\pi}, v_{2}^{\pi}, \ldots$ rendszere tartozik, ezeket a szimbólumokat nevezzük $\pi$ fajtájú változóknak.\\ + Elválasztójel a nyitó és csukó zárójelek, és a vessző.\\ + + \noindent Az elsőrendű logikai nyelvekben az elválasztójelek és a logikai jelek mindig ugyanazok, viszont a logikán kívüli jelek halmaza, illetve ezek szignatúrája nyelvről nyelvre lényegesen különbözhet. Ezért mindig megadjuk a $$ négyest és ennek $<\nu_{1}, \nu_{2}, \nu_{3}>$ szignatúráját, amikor egy elsőrendű logikai nyelv ábécéjére hivatkozunk.\\ + + \noindent Jelölése $V[V_{\nu}]$, ahol $V_{\nu}$ adja meg a $<\nu_{1}, \nu_{2}, \nu_{3}>$ szignatúrájú $$ négyest.\\ + + \noindent \textbf{Termek}: A $V[V_{\nu}]$ ábécé feletti termek halmaza $\mathcal{L}_{t}[V_{\nu}]$, ami a következő tulajdonságokkal bír: + + \begin{enumerate} + \item Minden $\pi \in Srt$ fajtájú változó és konstans $\pi$ fajtájú term. + \item Ha az $f \in Fn$ függvényszimbólum $(\pi_{1}, \pi_{2}, \ldots, \pi_{k}, \pi)$ alakú és $t_{1}, t_{2}, \ldots, t_{k}$ -- rendre\\ + $\pi_{1}, \pi_{2}, \ldots, \pi_{k}$ fajtájú -- termek, akkor az $f(s_{1}, s_{2}, \ldots, s_{k})$ egy $\pi$ fajtájú term. + \item Minden term az 1-2. szabályok véges sokszori alkalmazásával áll elő. + \end{enumerate} + + \noindent \textbf{Formulák}: A $V[V_{\nu}]$ ábécé feletti elsőrendű formulák halmaza $\mathcal{L}_{f}[V_{\nu}]$, ami a következő tulajdonságokkal bír: + + \begin{enumerate} + \item Ha a $\boldsymbol{P} \in Pr$ \textbf{\emph{predikátumszimbólum}} $(\pi_{1}, \pi_{2}, \ldots, \pi_{k})$ alakú + és az $\boldsymbol{t_{1}, t_{2}, \ldots, t_{k}}$ -- rendre $\pi_{1}, \pi_{2}, \ldots, \pi_{k}$ fajtájú -- + \emph{\textbf{termek}}, akkor a $\boldsymbol{P(t_{1}, t_{2}, \ldots, t_{k})}$ \emph{\textbf{szó egy elsőrendű formula}}. + Az így nyert formulákat atomi formuláknak nevezzük. + + \item Ha $S$ elsőrendű formula, akkor $\neg S$ is az. + + \item Ha $S$ és $T$ elsőrendű formulák és $\circ$ binér logikai összekötőjel, + akkor $(S \circ T)$ is elsőrendű formula. + + \item Ha $S$ eleme elsőrendű formula, $Q$ kvantor ($\forall$ vagy $\exists$) és $x$ + tetszőleges változó, akkor $QxS$ is elsőrendű formula. Az így nyert formulákat kvantált formuláknak nevezzük, + a $\forall xS$ alakú formulák univerzálisan kvantált formulák, a $\exists xS$ alakú formulák + pedig egzisztenciálisan kvantált formulák. A kvantált formulákban $Qx$ a formula prefixe, $S$ + pedig a magja. + + \item Minden elsőrendű formula az 1-4. szabályok véges sokszori alkalmazásával áll elő. + \end{enumerate} + + \noindent A $V[V_{\nu}]$ ábécé feletti elsőrendű logikai nyelv $\mathcal{L}[V_{\nu}] = \mathcal{L}_{t}[V_{\nu}] \cup \mathcal{L}_{f}[V_{\nu}]$, azaz $\mathcal{L}[V_{\nu}]$ minden szava vagy term, vagy formula.\\ + + \noindent A negációs, konjunkciós, diszjunkciós, implikációs (ezek jelentése ua., mint nulladrendben) és kvantált formulák összetett formulák.\\ + + \noindent Az elsőrendű logikai nyelv prímformulái az atomi formulák és a kvantált formulák.\\ + + \noindent \textbf{Változóelőfordulás fajtái}: Egy formula $x$ változójának egy előfordulása: + + \begin{itemize} + \item szabad, ha nem esik $x$-re vonatkozó kvantor hatáskörébe, + + \item kötött, ha $x$-re vonatkozó kvantor hatáskörébe esik. + \end{itemize} + + \noindent \textbf{Változó fajtái}: \emph{Egy formula $x$ változója}: + + \begin{itemize} + \item \emph{szabad}, ha minden előfordulása szabad, + \item \emph{kötött}, ha minden előfordulása kötött, és + \item \emph{vegyes}, ha van szabad és kötött előfordulása is. + \end{itemize} + + \noindent \textbf{Formula zártsága, nyíltsága}: \emph{Egy formula}: + + \begin{itemize} + \item \emph{zárt}, ha minden változója kötött, + \item \emph{nyílt}, ha legalább egy változójának van szabad előfordulása és + \item \emph{kvantormentes}, ha nincs benne kvantor + \end{itemize} + + \noindent \emph{Megjegyzés}: a zárt formulák elsőrendű állításokat szimbolizálnak (egy elsőrendű állítás nem más, mint elemek egy halmazára megfogalmazott kijelentő mondat). + + \subsubsection*{Az elsőrendű logika szemantikája} + + \noindent \textbf{Matematikai struktúra}: Matematikai struktúrán egy $\Big$ négyest értünk, ahol: + + \begin{enumerate} + \item $U = \bigcup\limits_{\pi} U_{\pi}$ nem üres alaphalmaz (univerzum), + + \item $R$ az $U$-n értelmezett logikai függvények (relációk) halmaza, + + \item $M$ az $U$-n értelmezett matematikai függvények (alapműveletek) halmaza, + + \item $K$ az $U$ kijelölt elemeinek (konstansainak) halmaza (lehet üres). + \end{enumerate} + + \noindent \textbf{Interpretáció}: Az interpretáció egy $\Big$ matematikai struktúra és\\ + $\mathcal{I} = \Big<\mathcal{I}_{Srt}, \mathcal{I}_{Pr}, \mathcal{I}_{Fn}, \mathcal{I}_{Cnst}\Big>$ + függvénynégyes, ahol: + + \begin{itemize} + \item az $\mathcal{I}_{Srt} : \pi \mapsto U_{\pi}$ függvény megad minden egyes $\pi \in Srt$ fajtához egy $U_{\pi}$ nemüres halmazt, a $\pi$ fajtájú individuumok halmazát, + \item az $\mathcal{I}_{Pr} : P \mapsto P^{\mathcal{I}}$ függvény megad minden $(\pi_{1}, \pi_{2}, \ldots, \pi_{k})$ alakú $P \in Pr$ \lword{predikátumszimbólumhoz} egy $P^{\mathcal{I}} : U_{\pi_{1}} \times U_{\pi_{2}} \times \ldots \times U_{\pi_{k}} \to \mathbb{L}$ logikai függvényt (relációt), + \item az $\mathcal{I}_{Fn} : f \mapsto f^{\mathcal{I}}$ függvény hozzárendel minden $(\pi_{1}, \pi_{2}, \ldots, \pi_{k}, \pi)$ alakú $f \in Fn$ \lword{függvényszimbólumhoz} egy $P^{\mathcal{I}} : U_{\pi_{1}} \times U_{\pi_{2}} \times \ldots \times U_{\pi_{k}} \to U_{\pi}$ matematikai függvényt (műveletet), + \item az $\mathcal{I}_{Cnst} : c \mapsto ct^{\mathcal{I}}$ pedig minden $\pi$ fajtájú $c \in Cnst$ konstansszimbólumhoz az $U_{\pi}$ individuumtartománynak egy individuumát + rendeli, azaz $c^{\mathcal{I}} \in U_{\pi}$. + \end{itemize} + + \noindent \textbf{Változókiértékelés}: Legyen az $\mathcal{L}[V_{\nu}]$ nyelvnek $\mathcal{I}$ egy interpretációja, az interpretáció univerzuma legyen U és jelölje V a nyelv változóinak halmazát. Egy olyan $\kappa : V \to U$ leképezést, ahol ha $x$ $\pi$ fajtájú változó, akkor $\kappa(x) \in U_{\pi}$, $\mathcal{I}$-beli \emph{\textbf{változókiértékelésnek}} nevezünk.\\ + + \noindent \textbf{$\mathcal{L}_{t}[V_{\nu}]$ szemantikája}: + Legyen az $\mathcal{L}[V_{\nu}]$ nyelvnek $\mathcal{I}$ egy interpretációja és $\kappa$ egy $\mathcal{I}$-beli változókiértékelés. Az $\mathcal{L}[V_{\nu}]$ nyelv egy $\pi$ fajtájú $t$ termjének értéke $\mathcal{I}$-ben a $\kappa$ változókiértékelés mellett az alábbi -- $|t|^{\mathcal{I},\kappa}$-val jelölt -- $U_{\pi}$-beli individuum: + + \begin{enumerate} + \item ha $c \in Cnst$ $\pi$ fajtájú konstansszimbólum, akkor $|c|^{\mathcal{I},\kappa}$ az $U_{\pi}$-beli $c^{\mathcal{I}}$ individuum, + + \item ha $x$ $\pi$ fajtájú változó, akkor $|x|^{\mathcal{I},\kappa}$ az $U_{\pi}$-beli $\kappa(x)$ individuum, + \item ha $t_{1}, t_{2}, \ldots, t_{k}$ rendre $\pi_{1}, \pi_{2}, \ldots, \pi_{k}$ fajtájú termek és ezek értékei a $\kappa$ változókiértékelés mellett rendre az $U_{\pi_{1}}$-beli $|t_{1}|^{\mathcal{I},\kappa}$, az $U_{\pi_{2}}$-beli $|t_{2}|^{\mathcal{I},\kappa}$ \ldots és az $U_{\pi_{k}}$-beli $|t_{k}|^{\mathcal{I},\kappa}$ individuumok, akkor egy $(\pi_{1}, \pi_{2}, \ldots, \pi_{k}, \pi)$ alakú $f \in Fn$ függvényszimbólum esetén $|f(t_{1}, t_{2}, \ldots, t_{k})|^{\mathcal{I},\kappa}$ az $U_{\pi}$-beli + $f^{\mathcal{I}}(|t_{1}|^{\mathcal{I},\kappa}, |t_{2}|^{\mathcal{I},\kappa}, \ldots, |t_{k}|^{\mathcal{I},\kappa})$ individuum. + \end{enumerate} + + \noindent \textbf{Változókiértékelés $x$-variánsa}: Legyen $x$ egy változó. A $\kappa^{*}$ változókiértékelés a $\kappa$ változókiértékelés $x$-variánsa, ha $\kappa^{*}(y) = y$ minden $x$-től különböző $y$ változó esetén.\\ + + \noindent \textbf{Elsőrendű logikai formula logikai értéke}: + Legyen az $\mathcal{L}[V_{\nu}]$ nyelvnek $\mathcal{I}$ egy interpretációja és $\kappa$ egy $\mathcal{I}$-beli változókiértékelés. Az $\mathcal{L}[V_{\nu}]$ nyelv egy $C$ formulájához $\mathcal{I}$-ben a $\kappa$ változókiértékelés mellett az alábbi -- $|C|^{\mathcal{I},\kappa}$-val jelölt -- igazságértéket rendeljük: + + \begin{enumerate} + \item $|P(t_{1}, t_{2}, \ldots, t_{k})|^{\mathcal{I},\kappa} = \left\{ + \begin{array}{lr} + igaz & : P^{\mathcal{I}}(|t_{1}|^{\mathcal{I},\kappa}, |t_{2}|^{\mathcal{I},\kappa}, \ldots, |t_{k}|^{\mathcal{I},\kappa}) = igaz\\ + hamis & : \text{különben} + \end{array} + \right\}$ + + \item $|\neg A|^{\mathcal{I},\kappa}$ legyen $\neg |A|^{\mathcal{I},\kappa}$ + + \item $|A \wedge B|^{\mathcal{I},\kappa}$ legyen $|A|^{\mathcal{I},\kappa} \wedge |B|^{\mathcal{I},\kappa}$ + + \item $|A \vee B|^{\mathcal{I},\kappa}$ legyen $|A|^{\mathcal{I},\kappa} \vee |B|^{\mathcal{I},\kappa}$ + + \item $|A \supset B|^{\mathcal{I},\kappa}$ legyen $|A|^{\mathcal{I},\kappa} \supset |B|^{\mathcal{I},\kappa}$ + + \item $|\forall x A|^{\mathcal{I},\kappa} = \left\{ + \begin{array}{lr} + igaz & : |A|^{\mathcal{I},\kappa^{*}} = igaz \ \kappa \ minden \ \kappa^{*} \ \text{x-variansára} \\ + hamis & : \text{különben} + \end{array} + \right\}$ + + \item $|\exists x A|^{\mathcal{I},\kappa} = \left\{ + \begin{array}{lr} + igaz & : |A|^{\mathcal{I},\kappa^{*}} = igaz \ \kappa \ valamely \ \kappa^{*} \ \text{x-variansára} \\ + hamis & : \text{különben} + \end{array} + \right\}$ + + \end{enumerate} + + \noindent \textbf{Elsőrendű formula kielégíthetősége}: Egy $A$ elsőrendű formula kielégíthető, ha van olyan $\mathcal{I}$ interpretáció és $\kappa$ változókiértékelés, amelyre $|A|^{\mathcal{I},\kappa} = igaz$ (ekkor azt mondjuk, hogy az $\mathcal{I}$ interpretáció és $\kappa$ változókiértékelés kielégíti $A$-t), + különben kielégíthetetlen.\\ + + \noindent Amennyiben az $A$ formula zárt, igazságértékét egyedül az interpretáció határozza meg. Ha $|A|^{\mathcal{I}} = igaz$, azt mondjuk, hogy az $\mathcal{I}$ kielégíti $A$-t vagy másképpen: $\mathcal{I}$ modellje $A$-nak ($\mathcal{I} \models A$).\\ + + \noindent \textbf{Logikailag igaz elsőrendű formula}: Egy $A$ elsőrendű logikai formula logikailag igaz, ha minden $\mathcal{I}$ interpretációban és $\mathcal{I}$ minden $\kappa$ változókiértékelése mellett $|A|^{\mathcal{I},\kappa} = igaz$.\\ + Jelölése: $\models A$.\\ + + \noindent \textbf{Szemantikus következmény}: Azt mondjuk, hogy a $G$ formula \textit{szemantikus következménye} az + $\mathcal{F}$ formulahalmaznak, ha minden olyan $\mathcal{I}$ interpretációra, amelyre $\mathcal{I} \models \mathcal{F}$ + fennáll, $\mathcal{I} \models G$ is igaz (jelölés: $\mathcal{F} \models G$).\\ + + \noindent \textbf{Tétel}: Legyenek $A_{1}, A_{2}, \ldots, A_{n}, B$ ($n \geq 1$) tetszőleges, ugyanabból az elsőrendű logikai nyelvből való formulák. Ekkor + \[ + \left\{A_{1}, A_{2}, \ldots, A_{n}\right\} \models B \Leftrightarrow A_{1} \wedge A_{2} \wedge \ldots \wedge A_{n} \wedge \neg B\ \text{kielégíthetetlen} + \] + + \noindent \textbf{Rezolúció}: Elsőrendű predikátumkalkulusban is végezhető rezolúció, ráadásul a módszer helyes és teljes is. Nehézséget a klózok kialakítása okozhat, amelyek zárt, + univerzálisan kvantált literálok konjunkciójából állnak. Ehhez eszközeink a prenex-, illetve skolem-formák. + + \section*{Számításelmélet} + + \subsection*{Kiszámíthatóság} + + \subsubsection*{Problémák mint formális nyelvek} + + \noindent \emph{\textbf{Kiszámítási problémának}} nevezünk egy olyan, a matematika nyelvén megfogalmazott kérdést, amire egy algoritmussal szeretnénk megadni a választ. A gyakorlati élet szinte minden \lword{problémájához} rendelhető, megfelelő absztrakciót használva, egy kiszámítási probléma.\\ + + \noindent Egy problémát a hozzá tartozó konkrét bementettel együtt \emph{\textbf{a probléma egy példányának}} nevezzük.\\ + + \noindent Speciális kiszámítási probléma az eldöntési probléma. Ilyenkor a problémával kapcsolatos kérdés egy eldöntendő kérdés, tehát a probléma egy példányára a válasz "igen" vagy "nem" lesz.\\ + + \noindent Egy kiszámítási probléma reprezentálható egy $f : A \to B$ függvénnyel. Az $A$ halmaz tartalmazza a probléma egyes bemeneteit, jellemzően egy megfelelő ábécé feletti szóban elkódolva, míg a $B$ halmaz tartalmazza a bemenetekre adott válaszokat, szintén valamely alkalmas ábécé feletti szóban elkódolva. Értelemszerűen, ha eldöntési problémáról van szó, akkor az $f$ értékkészlete, vagyis a $B$ egy két elemű halmaz: $\left\{igen, nem\right\}$, $\left\{1, 0\right\}$, stb.\\ + + \noindent \textbf{Kiszámítható függvény}: Egy $f : A \to B$ függvényt \textit{kiszámíthatónak} nevezünk, ha minden $x \in A$ elemre az $f(x) \in B$ függvényérték kiszámítható valamilyen algoritmikus modellel.\\ + + \noindent \textbf{Megoldható, eldönthető probléma}: Egy kiszámítási probléma \textit{megoldható} (eldöntési probléma esetén azt mondjuk, hogy \textit{eldönthető}), ha az általa meghatározott függvény kiszámítható.\\ + + \noindent \textbf{Algoritmusok időigénye}: Legyenek $f,g: \mathbb{N} \to \mathbb{N}$ függvények.\\ + + \noindent Azt mondjuk, hogy $f$ legfeljebb olyan gyorsan nő, mint $g$ (jelölése: $f(n) = \mathcal{O}(g(n))$), ha + \[ + \exists c>0,\ n_{0} \in \mathbb{N} : f(n) \leq c * g(n)\ \ \forall n \geq n_{0}. + \] + + \noindent Az $f(n) = \Omega(g(n))$ jelöli azt, hogy $g(n) = \mathcal{O}(f(n))$ teljesül. \\ + \noindent Az $f(n) = \Theta(g(n))$ jelöli azt, hogy $f(n) = \mathcal{O}(g(n))$ és $f(n) = \Omega(g(n))$ is teljesül.\\ + + \noindent \textbf{Példa}: $3n^{3} + 5n^{2} + 6 = \mathcal{O}(n^{3})$, $n^{k} = \mathcal{O}(2^{n}) \ \forall k \geq 0$, stb.\\ + + \noindent \textbf{Tétel}: Minden polinomiális függvény lassabban nő, mint bármely exponenciális függvény, azaz minden $p(n)$ polinomhoz és $c>0$-hoz $\exists n_{0}$ egész szám, hogy $\forall n \geq n_{0}$ esetén $p(n) \leq 2^{cn}$\\ + + \noindent \textbf{Kiszámítási probléma megfeleltetése eldöntési problémának}: Tekintsünk egy $P$ kiszámítási problémát és legyen $f: A \to B$ a $P$ által meghatározott függvény.\\ + + \noindent Ekkor megadható $P$-hez egy $P'$ eldöntési probléma úgy, hogy $P'$ pontosan akkor eldönthető, ha $P$ kiszámítható. Állítsuk párba ugyanis minden $a \in A$ elemre az $a$ és $f(a)$ elemeket, és kódoljuk el az így kapott párokat egy-egy szóban.\\ + + \noindent Ezek után legyen $P'$ az így kapott szavakból képzett formális nyelv.\\ + + \noindent Nyilvánvaló, hogy ha minden $a \in A$ és $b \in B$ elemre az $(a,b) \in P'$ tartalmazás eldönthető (azaz $P'$ eldönthető), akkor $P$ kiszámítható és fordítva. E megfeleltetés miatt a továbbiakban jellemzően eldöntési problémákkal foglalkozunk.\\ + + \noindent Az algoritmus fogalmának pontos megfogalmazásával a múlt század első felében többen is próbálkoztak. Ennek eredményeképpen több, egymástól különböző fogalom is megszületett, mint például a lambda-függvények, rekurzív függvények, Markov-gép és a Turing-gép. Ezek a fogalmak egyenrangúak egymással, egymásból kifejezhetők. A gyakorlatban leginkább a Turing-gép fogalma terjedt el. + + \subsection*{Turing gépek} + + \noindent Hasonlóan a véges automatához vagy a veremautomatához, a Turing-gép is egy véges sok állapottal rendelkező eszköz. \\ + + \noindent A Turing-gép egy két irányban végtelen szalagon dolgozik. \\ + + \noindent A szalag cellákra van osztva, tulajdonképpen ez a gép (korlátlan) memóriája. Kezdetben a szalagon csak a bemenő szó van, minden cellán egy betű. A szalag többi cellája egy úgynevezett blank vagy szóköz ($\sqcup$) szimbólumokkal van feltöltve. Kezdetben a gép úgynevezett író-olvasó feje a bemenő szó első betűjén áll és a gép a kezdőállapotában van. \\ + + \noindent A gép az író-olvasó fejet tetszőlegesen képes mozgatni a szalagon. Képes továbbá a fej pozíciójában a szalag tartalmát kiolvasni és átírni. \\ + + \noindent A gépnek van két kitüntetett állapota, a $q_{i}$ és a $q_{n}$ állapotok. Ha ezekbe az állapotokba kerül, akkor rendre elfogadja illetve elutasítja a bemenő szót. \\ + + \noindent A vezérlő (legalább az) egyik állapota végállapot, s ha a gép ebbe kerül, akkor megáll. Az egyik kijelölt szalag üres jelektől különböző részét tekintjük a gép kimenetének (output). A vezérlő egy kijelölt állapotát kezdőállapotnak nevezzük, s a Turing-gép indulásakor a gép ebben az állapotban van.\\ + + + \noindent Szokás ilyenkor azt mondani, hogy az adott Turing-gép elfogadta ezt az inputot. A Turing-gépeket felhasználhatjuk függvények kiszámolására, azaz az argumentumokat a bemeneti szalagra írva, a gépet elindítva a Turing-gép a kimeneti szalagra a függvény végeredményét írva megáll.\\ + + \noindent Felhasználhatjuk a Turing-gépeket nyelvek felismerésére is. Szavaknak nevezzük az A ábécé betűiből alkotott véges sorozatokat. Nyelvnek nevezzük szavak egy halmazát. A T Turing-gép által felismert LT nyelv pontosan azokból a szavakból áll, melyekkel mint bemenettel indítva a Turing-gép megáll.\\ + + \noindent Egy L nyelvet rekurzívan felsorolhatónak nevezünk, ha van olyan Turing-gép amely által felismert nyelv éppen az L. Egy L nyelv rekurzív, ha létezik olyan Turing-gép, mely tetszőleges inputra megáll, és a szóhoz tartozó végállapot pontosan akkor egyezik meg az egyik előre kijelölt állapottal, ha a szó L-beli. Az f függvény parciálisan rekurzív, ha létezik olyan Turing-gép, amely kiszámolja. Az f függvény rekurzív, ha létezik olyan Turing-gép, amely kiszámolja; és az output minden bemenetre definiálva van. + + \subsubsection*{Algoritmusmodellek} + + \begin{itemize} + \item \textbf{Gödel}: rekurzív függvények (primitív rekurzív függvények 1931-ben, majd általánosabb 1934-ben) + \item \textbf{Church}: $\lambda$-kalkulus, $\lambda$-definiálható függvények: ekvivalensek a rekurzív függvényekkel (bizonyított) + \item \textbf{Turing}: Turing-gép (1936), a $\lambda$-definiálható és a Turing-géppel kiszámítható függvények megegyeznek (bizonyított) + \end{itemize} + + \noindent \textbf{Church-Turing tézis}: A kiszámíthatóság ismert matematikai modelljei ekvivalensek az effektíven kiszámítható függvények osztályával(, azaz nem ismerünk a Turing gép által reprezentált algoritmus modellnél erősebb eszközt). A tézis nem tétel, mert elemeit nem tudjuk formálisan definiálni.\\ + + \noindent Azaz, ami algoritmussal kiszámítható, az Turing-értelemben kiszámítható: + \begin{itemize} + \item Az f parciális függvény akkor és csak akkor kiszámítható, ha f parciálisan rekurzív. + \item Az f függvény akkor és csak akkor kiszámítható, ha f rekurzív. + \item Az L nyelvhez tartozás problémája algoritmussal csak akkor és akkor eldönthető, ha L rekurzív. + \end{itemize} + + \noindent Ezekben az állításokban két fajta kiszámíthatóságról esik szó. A Turing-értelemben kiszámíthatóság jól definiált fogalom, míg az algoritmussal kiszámíthatóság nem az. Ennek megfelelően ez a tétel nem bizonyítható, viszont a gyakorlati tapasztalatokkal egybevág.\\ + + \noindent \textbf{Állítás}. Van olyan nyelv, mely nem rekurzív felsorolható.\\ +\newpage + \noindent Formálisan a Turing-gépet a következő módon definiáljuk. \\ + + \noindent \textbf{A Turing-gép formális definíciója}: A Turing-gép egy olyan + $M = (Q, \Sigma, \Gamma, \delta, q_{0}, q_{i}, q_{n})$ rendszer, ahol: + + \begin{itemize} + + \item $Q$ az állapotok véges, nem üres halmaza, + + \item $q_{0}, q_{i}, q_{n} \in Q$, + \begin{itemize} + \item $q_{0}$ a kezdőállapot, + \item $q_{i}$ az elfogadó állapot, + \item $q_{n}$ pedig az elutasító állapot, + \end{itemize} + + \item $\Sigma$ és $\Gamma$ ábécék, a bemenő jelek és a szalagszimbólumok ábécéje úgy, hogy + $\Sigma \subseteq \Gamma$ és $\Gamma - \Sigma$ tartalmaz egy speciális $\boldsymbol{\sqcup}$ szimbólumot, + + \item $\delta : (Q - \left\{q_{i},q_{n}\right\}) \times \Gamma \to Q \times \Gamma \times \left\{L, R, S\right\}$ + az átmenetfüggvény. + + \end{itemize} + + \noindent Úgy mint a veremautomaták esetében, egy $M$ Turing-gép működésének fázisait is konfigurációkkal írhatjuk le.\\ + + \noindent \textbf{Turing-gép konfigurációja}: Az $M$ Turing-gép konfigurációja egy olyan $uqv$ szó, ahol + $q \in Q$ és $u, v \in \Gamma^{*}$, $v \not = \varepsilon$. Ez a konfiguráció az $M$ azon állapotát tükrözi + amikor a szalag tartalma $uv$ ($uv$ előtt és után a szalagon már csak $\sqcup$ van), a gép a $q$ állapotban van, + és az író-olvasó fej a $v$ első betűjére mutat. $M$ összes konfigurációjának halmazát $\mathcal{C}_{M}$-el jelöljük.\\ + + \noindent \textbf{Turing-gép kezdőkonfigurációja}: $M$ kezdőkonfigurációja egy olyan $q_{0}u\sqcup$ szó, ahol + $u$ csak $\Sigma$-beli betűket tartalmaz.\\ + + \noindent \textbf{Turing-gép konfigurációátmenete}: $M$ konfigurációátmenete egy olyan $\vdash\ \subseteq \mathcal{C}_{M} \times \mathcal{C}_{M}$ reláció, amit a következőképpen definiálunk.\\ + + \noindent Legyen $uqav$ egy konfiguráció, ahol $a \in \Gamma$ és $u, v \in \Gamma^{*}$. A következő három esetet különböztetjük meg: + + \begin{enumerate} + \item Ha $\delta(q,a) = (r, b, S)$, akkor $uqav \vdash urbv$. + \item Ha $\delta(q,a) = (r, b, R)$, akkor $uqav \vdash ubrv'$, ahol $v' = v$, ha $v \not = \varepsilon$, különben $v' = \sqcup$. + \item Ha $\delta(q,a) = (r, b, L)$, akkor $uqav \vdash u'rcbv$, ahol $u'c = u$ valamely $u' \in \Gamma^{*}$-ra és $c \in \Gamma$-ra, ha $u \not = \varepsilon$, egyébként pedig $u' = \varepsilon$, $c = \sqcup$. + \end{enumerate} + + \noindent Azt mondjuk, hogy $M$ \emph{véges sok lépésben eljut a} $C$ \emph{konfigurációból a} $C'$ konfigurációba (jele $C \boldsymbol{\vdash^{*}} C'$), ha létezik olyan $n \geq 0$ és $C_{1}, \ldots C_{n}$ konfigurációsorozat, hogy $C_{1} = C$, $C_{n} = C'$ és minden $1 \leq i < n$-re $C_{i} \vdash C_{i+1}$.\\ + + \noindent Ha $q \in \left\{q_{i}, q_{n}\right\}$, akkor azt mondjuk, hogy az $uqv$ konfiguráció egy \textbf{\emph{megállási konfiguráció}}. Továbbá, $q = q_{i}$ esetében elfogadó, míg $q = q_{n}$ esetében \textbf{\emph{elutasító konfiguráció}}ról beszélünk.\\ + + \noindent \textbf{Turing-gép által felismert nyelv}: Az $M$ Turing-gép által felismert nyelv (jelölése $L(M)$) azoknak az $u \in \Sigma^{*}$ szavaknak a halmaza, melyekre igaz, hogy $q_{0}u\sqcup \vdash^{*} xq_{i}y$ valamely $x,y \in \Gamma^{*}$, $y \not = \varepsilon$ szavakra. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/turinggep_pelda} + \caption{Egy, az $L = \left\{u\#u \ | \ u \in \left\{0,1\right\}^{+}\right\}$ felismerő Turing-gép.} + \label{fig:turinggep_pelda} + \end{figure} + + \noindent \textbf{Turing-gépek ekvivalenciája}: Két Turing-gépet ekvivalensnek nevezünk, ha ugyanazt a nyelvet ismerik fel.\\ + + \noindent \textbf{Turing-felismerhető nyelv, rekurzívan felismerhető nyelvek osztálya}: + Egy $L \subseteq \Sigma^{*}$ nyelv Turing-felismerhető, ha $L = L(M)$ valamely $M$ Turing-gépre. A Turing-felismerhető nyelveket szokás \textit{rekurzívan felsorolhatónak} is nevezni. A rekurzívan felsorolható nyelvek osztályát \textbf{RE}-vel jelöljük.\\ + + \noindent \textbf{Turing-eldönthető nyelv, rekurzív nyelvek osztálya}: + Egy $L \subseteq \Sigma^{*}$ nyelv Turing-eldönthető, ha létezik olyan Turing-gép, amely minden bemeneten megállási konfigurációba jut és felismeri $L$-et. A Turing-felismerhető nyelveket szokás \textit{rekurzívnak} is nevezni. A rekurzív nyelvek osztályát $R$-rel jelöljük.\\ + + \noindent \textbf{Turing-gép futási ideje, időigénye}: + Tekintsünk egy $M = (Q, \Sigma, \Gamma, \delta, q_{0}, q_{i}, q_{n})$ Turing-gépet és annak egy s$u \in \Sigma^{*}$ bemenő szavát. Azt mondjuk, hogy $M$ futási ideje (időigénye) az $u$ szón $n$ ($n \geq 0$), ha $M$ a $q_{0}u\sqcup$ kezdőkonfigurációból $n$ lépésben el tud jutni egy megállási konfigurációba. Ha nincs ilyen szám, akkor $M$ futási ideje az $u$ szón végtelen.\\ + + \noindent Legyen $f : \mathbb{N} \to \mathbb{N}$ egy függvény. Azt mondjuk, hogy $M$ időigénye $f(n)$ (vagy azt, hogy $M$ egy $f(n)$ időkorlátos gép), ha minden $u \in \Sigma^{*}$ input szóra $M$ időigénye az $u$ szón legfeljebb $f(l(u))$. + + \subsection*{Többszalagos Turing-gépek} + + A többszalagos Turing-gépek, értelemszerűen, egynél több szalaggal rendelkeznek. + Mindegyik szalaghoz tartozik egy-egy író-olvasó fej, melyek egymástól + függetlenül képesek mozogni a szalagon.\\ + + \noindent \textbf{Többszalagos Turing-gép definíciója}: Legyen $k > 1$. Egy $k$-szalagos Turing-gép egy olyan $M = (Q, \Sigma, \Gamma, \delta, q_{0}, q_{i}, q_{n})$ rendszer, ahol a komponensek a $\delta$ kivételével megegyeznek az egyszalagos Turing-gép komponenseivel, $\delta$ pedig a következőképpen adódik. + \[ + \delta : (Q - \left\{q_{i},q_{n}\right\}) \times \Gamma^{k} \to Q \times \Gamma^{k} \times \left\{L, R, S\right\}^{k} + \] + + \noindent Legyenek $q, p \in Q$, $a_{1}, a_{2}, \ldots , a_{k}, b_{1}, b_{2}, \ldots, b_{k} \in \Gamma$ és $D_{1}, D_{2}, \ldots, D_{k} \in \left\{L, R, S\right\}$.\\ + + \noindent Ha $\delta(q,a_{1}, a_{2}, \ldots , a_{k}) = (p,b_{1}, b_{2}, \ldots, b_{k}, D_{1}, D_{2}, \ldots, D_{k})$, akkor a gép akkor a gép a $q$ állapotból, ha a szalagjain rendre az + \begin{itemize} + \item $a_{1}, a_{2}, \ldots , a_{k}$ betűket olvassa, át tud menni a $p$ állapotba, miközben az + \item $a_{1}, a_{2}, \ldots , a_{k}$ betűket átírja a $b_{1}, b_{2}, \ldots , b_{k}$ betűkre és a szalagokon a fejeket + \item $D_{1}, D_{2}, \ldots , D_{k}$ irányokba mozgatja. + \end{itemize} + + \noindent A többszalagos Turing-gép konfigurációja, a konfigurációátmenet valamint a felismert illetve eldöntött nyelv definíciója az egyszalagos eset értelemszerű általánosítása. A többszalagos Turing-gép időigényét is az egyszalagoshoz hasonlóan definiáljuk.\\ + + \noindent \textbf{Többszalagos és egyszalagos gépek ekvivalenciája}: Minden $k$-szalagos, $f(n)$ időkorlátos Turing-géphez + van vele ekvivalens $\mathcal{O}(n*f(n))$ időkorlátos egyszalagos Turing-gép. + + \subsection*{Nemdeterminisztikus Turing-gépek} + + Egy $M$ nemdeterminisztikus Turing-gép állapotfüggvénye a következő alakú + \[ + \delta : (Q - \left\{q_{i},q_{n}\right\}) \times \mathcal{P}(\Gamma \to Q \times \Gamma \times \left\{L, R\right\}) + \] + + \noindent Tehát $M$ minden konfigurációjából néhány (esetleg nulla) különböző konfigurációba mehet át. Ily módon $M$ számítási sorozatai egy $u$ szón egy fával reprezentálhatók.\\ + + \noindent A fa csúcsa $M$ kezdőkonfigurációja, a szögpontjai pedig $M$ konfigurációi. A fa minden levele megfelel $M$ egy számítási sorozatának az $u$-n. $M$ akkor fogadja el $u$-t, ha a fa valamelyik levele elfogadó konfiguráció.\\ + + \noindent Nevezzük ezt a most leírt fát az $M$ nemdeterminisztikus számítási fájának az $u$-n. Az $M$ által felismert nyelv a determinisztikus esethez hasonlóan definiálható, a gép által eldöntött nyelv pedig a következőképpen.\\ + + \noindent \textbf{Nemdeterminisztikus Turing-gép által eldöntött nyelv}: Azt mondjuk, hogy egy nemdeterminisztikus $M$ Turing-gép eldönt egy $L \subseteq \Gamma^{*}$ nyelvet, ha felismeri, és minden $u \in \Sigma^{*}$ szóra $M$ számítási sorozatai végesek és elfogadási vagy elutasítási konfigurációba vezetnek.\\ + + \noindent \textbf{Nemdeterminisztikus Turing-gép időigénye}: Legyen $f : \mathbb{N} \to \mathbb{N}$ függvény, $M$ egy nemdeterminisztikus Turing-gép. Az $M$ időigénye $f(n)$, ha egy $n$ hosszú $u$ bemeneten nincsenek $M$-nek $f(n)$-nél hosszabb számítási sorozatai, azaz az $M$ számítási fája az $u$-n legfeljebb $f(n)$ magas.\\ + + \noindent \textbf{Determinisztikus és nemdeterminisztikus Turing-gépek ekvivalenciája}: + Minden $M$ nemdeterminisztikus Turing-géphez megadható egy ekvivalens $M'$ determinisztikus Turing-gép. Továbbá, ha $M$ $f(n)$ időigényű valamely $f : \mathbb{N} \to \mathbb{N}$ függvényre, akkor $M'$ $2^{\mathcal{O}(f(n))}$ időigényű. + + \subsection*{Eldönthetetlen problémák} + + \noindent A Turing-gép a lehető legáltalánosabb algoritmus modell, mégis vannak olyan problémák, melyek nem számíthatók ki Turing-géppel.\\ + + \noindent \textbf{Emlékeztető}: A rekurzívan felsorolható (Turing-felismerhető) nyelvek osztályát $RE$-vel, a rekurzív (Turing-eldönthető) nyelvek osztályát $R$-rel jelöljük.\\ + + \noindent Világos, hogy $R \subseteq RE $. A célunk az, hogy megmutassuk: az $R$ valódi részhalmaza az $RE$-nek, azaz van olyan nyelv (probléma) ami Turing-felismerhető, de nem eldönthető.\\ + + \noindent Csak olyan Turing-gépeket fogunk vizsgálni, melyek bemenő ábécéje a $\left\{0, 1\right\}$ halmaz. Ez nem jelenti az általánosság megszorítását, hiszen ha találunk egy olyan $\left\{0, 1\right\}$ feletti nyelvet, melyet nem lehet eldönteni ilyen Turing-géppel, akkor ezt a nyelvet egyáltalán nem lehet eldönteni.\\ + + \subsubsection*{Turing-gépek kódolása} + + A $\left\{0, 1\right\}$ feletti szavak felsorolhatóak (vagyis megszámlálhatóak). Valóban, tekintsük azt a felsorolást, amelyben a szavak a hosszuk szerint követik egymást, és két egyforma hosszú szó közül pedig az van előbb, amelyik az alfabetikus rendezés szerint megelőzi a másikat. Ily módon a $\left\{0, 1\right\}^{*}$ halmaz elemeinek egy felsorolása a következőképpen alakul: $w_{1} = \varepsilon$, $w_{2} = 0$, $w_{3} = 1$, $w_{4} = 00$, $w_{5} = 01$ és így tovább. Ebben a fejezetben tehát a $w_{i}$ szóval a $\left\{0, 1\right\}^{*}$ $i$. elemét jelöljük.\\ + + \noindent Legyen továbbá $M$ egy $\left\{0, 1\right\}$ inputábécé feletti Turing-gép. Van olyan $k > 0$ szám, hogy $Q$-t felírhatjuk $Q = \left\{p_{1}, \ldots p_{k}\right\}$ alakban, ahol $p_{1} = q_{0}$, $p_{k-1} = q_{i}$, $p_{k} = q_{n}$.\\ + + \noindent Továbbá, van olyan $m > 0$ szám, hogy $\Gamma$-t felírhatjuk $\Gamma = \left\{X_{1}, \ldots X_{m}\right\}$ alakban, ahol $X_{1} = 0$, $X_{2} = 1$, $X_{3} = \sqcup$, és $X_{4}, \ldots X_{m}$ az $M$ további szalagszimbólumai. Nevezzük végül az $L, R, S$ szimbólumokat (amelyek irányokat jelölnek) rendre $D_{1}$, $D_{2}$ és $D_{3}$-nak.\\ + + \noindent Ezek után $M$ egy $\delta(p_{i},X_{j}) = (p_{r}, X_{s}, D_{t})$ ($0 \leq i,r \leq k$, $1 \leq j,s \leq m$ és $1 \leq t \leq 3$) átmenete elkódolható a $0^{i}10^{j}10^{r}10^{s}10^{t}$ szóval. Mivel minden $0$-s blokk hossza legalább $1$, az átmenetet kódoló szóban nem szerepel az $11$ részszó. Tehát az M összes átmenetét kódoló szavakat összefűzhetjük egy olyan szóvá, melyben az átmeneteket az $11$ részszó választja el egymástól. Az így kapott szó pedig magát $M$-et kódolja.\\ + + \noindent A továbbiakban $M_{i}$-vel jelöljük azt a Turing-gépet, amelyet a $w_{i}$ szó kódol ($i \geq 1$). Amennyiben $w_{i}$ nem a fent leírt kódolása egy Turing-gépnek, akkor tekintsük $M_{i}$-t olyannak, ami minden input esetén azonnal a $q_{n}$ állapotba megy, azaz $L(M_{i}) = \emptyset$.\\ + + \noindent A későbbiekben szükségünk lesz arra, hogy elkódoljunk egy $(M, w)$ Turing-gép és bemenet párost egy $\left\{0, 1\right\}$ feletti szóban. Mivel a Turing-gépek kódolása nem tartalmazhat $111$-et, ezért $(M, w)$ kódja a következő: $M$ kódja után írunk $111$-et, majd utána $w$-t. + + \subsubsection*{Egy nem rekurzívan felsorolható nyelv} + + \noindent \textbf{Az $L_{\acute{a}tl\acute{o}}$ nyelv}: Az $L_{\acute{a}tl\acute{o}}$ nyelv azon $\left\{0, 1\right\}$ feletti Turing-gépek bináris kódjait tartalmazza, melyek nem fogadják el önmaguk kódját, mint bemenő szót, azaz + \[ + L_{\text{átló}} = \Big\{w_{i} \ \Big| \ i \geq 1, w_{i} \notin L(M_{i}) \Big\} + \] + + \noindent \textbf{Tétel}: $L_{\acute{a}tl\acute{o}} \notin RE$. + + \subsubsection*{Egy rekurzívan felsorolható, de nem eldönthető nyelv} + + \noindent \textbf{Az $L_{u}$ nyelv}: Tekintsük azon $(M, w)$ párok halmazát (egy megfelelő bináris szóban elkódolva), ahol $M$ egy $\left\{0, 1\right\}$ bemenő ábécé feletti Turing-gép, $w$ pedig egy $\left\{0, 1\right\}$ feletti szó úgy, hogy $w \in L(M)$, azaz $M$ elfogadja $w$-t.\\ + + \noindent Ezt a nyelvet jelöljük $L_{u}$-val. + \[ + L_{u} = \Big\{\langle w_{i},w_{j} \rangle \ \Big| \ i, j \geq 1, w_{j} \in L(M_{i}) \Big\} + \] + + \noindent \textbf{Tétel}: $L_{u} \in RE$.\\ + + \noindent \textbf{Tétel}: $L_{u} \notin R$. + + \subsubsection*{További tételek} + + \begin{enumerate} + \item Legyen $L$ egy nyelv. Ha $L, \bar{L} \in RE$, akkor $L \in R$. \\ + \emph{Következmény}: a rekurzívan felsorolható nyelvek nem zártak a komplementerképzésre. + \item Ha $L \in R$, akkor $\bar{L} \in R$, azaz a rekurzív nyelvek zártak a komplementerképzésre. + \end{enumerate} + + \subsubsection*{További eldönthetetlen problémák} + + \noindent \textbf{Kiszámítható függvény}: Legyen $\Sigma$ és $\Delta$ két ábécé és $f$ $\Sigma^{*}$ból $\Delta^{*}$-ba képző függvény. Azt mondjuk, hogy $f$ \emph{kiszámítható}, ha van olyan $M$ Turing-gép, hogy $M$-et egy $w \in \Sigma^{*}$ szóval a bemenetén elindítva, $M$ úgy áll meg, hogy a szalagján a $f(w) \in \Delta^{*}$ szó van.\\ + + \noindent \textbf{Eldöntési problémák visszavezetése}: Legyen $L_{1} \subseteq \Sigma^{*}$ és $L_{2} \subseteq \Delta^{*}$ két eldöntési probléma. $L_{1}$ visszavezethető $L_{2}$-re ($L_{1} \leq L_{2}$), ha van olyan $f : \Sigma^{*} \to \Delta^{*}$ kiszámítható függvény, hogy minden $w \in \Sigma^{*}$ szóra $w \in L_{1}$ pontosan akkor teljesül, ha $f(w) \in L_{2}$ is teljesül.\\ + + \noindent \textbf{Tétel}: Legyen $L_{1} \subseteq \Sigma^{*}$ és $L_{2} \subseteq \Delta^{*}$ két eldöntési probléma és tegyük fel, hogy $L_{1}$ visszavezethető $L_{2}$-re. Ekkor igazak a következő állítások: + + \begin{enumerate} + \item Ha $L_{1}$ eldönthetetlen, akkor $L_{2}$ is. + \item Ha $L_{1} \notin RE$ , akkor $L_{2} \notin RE$. + \end{enumerate} + + \noindent \textbf{A megállási probléma}: Legyen $L_{h} = \left\{\langle M, w \rangle \ |\ M \ meg\acute{a}ll \ a \ w \ bemeneten \right\}$, azaz $L_{h}$ azon $\langle M, w \rangle$ Turing-gép és bemenet párosokat tartalmazza elkódolva, melyekre $M$ megáll a $w$ bemeneten. $L_{h}$ eldönthetetlen ($L_{u}$ visszavezethető $L_{h}$-ra), viszont $L_{h} \in RE$.\\ + + \noindent \textbf{Az $L_{\ddot{u}res}$ probléma}: Legyen $L_{\ddot{u}res} = \Big\{\langle M \rangle \ |\ L(M) = \emptyset \Big\}$.\\ + $L_{\ddot{u}res}$ eldönthetetlen ($L_{u}$ visszavezethető $L_{\ddot{u}res}$-re), valamint $L_{\ddot{u}res} \notin RE$.\\ + + \noindent \textbf{Rekurzívan felsorolható nyelvek (nem triviális) tulajdonsága}: Ha $\mathcal{P}$ a rekurzívan felsorolható + nyelvek egy halmaza, akkor $\mathcal{P}$ a rekurzívan felsorolható nyelvek egy tulajdonsága. Ha $\mathcal{P} \not = \emptyset$ és + $\mathcal{P} \not = RE$, akkor $\mathcal{P}$ nem triviális tulajdonsága a rekurzívan felsorolható nyelveknek.\\ + + \noindent \textbf{Rice tétele}: + Adott $\mathcal{P}$ tulajdonságra jelöljük $L_{\mathcal{P}}$-vel azon Turing-gépek kódjainak halmazát, amelyek + $\mathcal{P}$-beli nyelvet ismernek fel. Ha $\mathcal{P}$ a rekurzívan felsorolható nyelvek egy nem triviális tulajdonsága, akkor + $L_{\mathcal{P}}$ eldönthetetlen.\\ + + \noindent \textbf{Post Megfelelkezési Probléma (röviden PMP)}: A PMP problémát a következőképpen definiáljuk. Legyen + $\Sigma$ egy legalább két betűt tartalmazó ábécé és legyen $D = \left\{\Big[\ddfrac{u_{1}}{v_{1}}\Big], \ldots, \Big[\ddfrac{u_{n}}{v_{n}}\Big]\right\}$ + egy dominóhalmaz, melyben $n \geq 1$ és $u_{1}, \ldots, u_{n}, v_{1}, \ldots, v_{n} \in \Sigma^{+}$.\\ + + \noindent A kérdés az, hogy van-e egy olyan $1 \leq i_{1}, \ldots, i_{m} \leq m$ ($m \geq 1$) indexsorozat, melyre teljesül, hogy a $\Big[\ddfrac{u_{i_{1}}}{v_{i_{1}}}\Big], \ldots, \Big[\ddfrac{u_{i_{m}}}{v_{i_{m}}}\Big]$ dominókat egymás mellé írva alul és felül ugyanaz a szó adódik, azaz $u_{i_{1}} \ldots u_{i_{m}} = v_{i_{1}} \ldots v_{i_{m}}$. Ebben az esetben a fenti dominósorozatot a D egy megoldásának nevezzük.\\ + + \noindent Formális nyelvként a következőképpen definiálhatjuk a PMP-t:\\ + PMP $= \Big\{ \langle D \rangle \ |\ \text{D-nek van megoldása} \Big\}$. PMP eldönthetetlen. + + \subsection*{Bonyolultságelmélet} + + A bonyolultságelmélet célja a megoldható (és ezen belül az eldönthető) problémák osztályozása a megoldáshoz szükséges + erőforrások (jellemzően az idő és a tár) mennyisége szerint. + + \subsubsection*{Időbonyolultsági fogalmak} + + \noindent \textbf{TIME}: Legyen $f : \mathbb{N} \to \mathbb{N}$ függvény. + \[ + \textbf{TIME}(f(n)) = \Big\{L \ \Big| \ L \ \text{eldönthető}\ \ \mathcal{O}(f(n)) \ \text{időigényű} \ \text{Turing-géppel} \Big\} + \] + Továbbá + \[ + \textbf{P} =\bigcup\limits_{k \geq 1} \textbf{TIME}(n^{k}) + \] + + \noindent Tehát \textbf{P} azon nyelveket tartalmazza, melyek eldönthetőek polinom időkorlátosdeterminisztikus Turing-géppel. Ilyen például az \textsc{Elérhetőség} probléma, melynek bemenete egy $G$ gráf és annak két kitüntetett csúcsa ($s$ és $t$). A kérdés az, hogy van-e a $G$-ben út $s$-ből $t$-be. Ha az \textsc{Elérhetőség} problémára nyelvként tekintünk, akkor írhatjuk azt, hogy\\ + + \noindent \textsc{\textbf{Elérhetőség}}: + \[ + \Big\{\langle G, s, t \rangle \ \Big| \ \text{\emph{G} irányított gráf ás \emph{G}-ben van út \emph{s}-ből \emph{t}-be} \Big\} + \] + + \noindent Könnyen megadható az \textsc{Elérhetőség} problémáját polinom időben eldöntő determinisztikus Turing-gép, tehát \textsc{Elérhetőség} $\in$ \textbf{P}.\\ + + \noindent \textbf{NTIME}: Legyen $f : \mathbb{N} \to \mathbb{N}$ függvény. + \[ + \textbf{NTIME}(f(n)) = \Big\{L \ | \ L \ \text{eldönthető}\ \ \mathcal{O}(f(n)) \ \text{időigényű nem determinisztikus} \ \text{Turing-géppel} \Big\} + \] + + \noindent Továbbá + \[ + \textbf{P} =\bigcup\limits_{k \geq 1} \textbf{NTIME}(n^{k}) + \] + + \noindent Az \textbf{NP}-beli problémák rendelkeznek egy közös tulajdonsággal az alábbi értelemben. Ha tekintjük egy \textbf{NP}-beli probléma egy példányát és egy lehetséges "bizonyítékot" arra nézve, hogy ez a példány "igen" példánya az adott problémának, akkor ezen bizonyíték helyességének leellenőrzése polinom időben elvégezhető. Ennek megfelelően egy \textbf{NP}-beli problémát eldöntő nemdeterminisztikus Turing-gép általában úgy működik, hogy "megsejti" a probléma bemenetének egy lehetséges megoldását, és polinom időben leellenőrzi, hogy a megoldás helyes-e.\\ + + \noindent Tekintsük a \textsc{Sat} problémát, amit a következőképpen definiálunk. Adott egy $\phi$ ítéletlogikai KNF. A kérdés az, hogy kielégíthető-e. Annak a bizonyítéka, hogy a $\phi$ kielégíthető, egy olyan változó-hozzárendelés, ami mellett kiértékelve a $\phi$-t igaz értéket kapunk. Egy tetszőleges változó-hozzárendelés tehát a $\phi$ kielégíthetőségének egy lehetséges bizonyítéka .Annak leellenőrzése pedig, hogy ez a hozzárendelés tényleg igazzá teszi-e $\phi$-t, polinom időben elvégezhető. A \textsc{Sat} + \textbf{NP}-beli probléma.\\ + + \noindent Az a definíciókból következik, hogy fennáll a \textbf{P} $\subseteq$ \textbf{NP} tartalmazás. + + \subsection*{Polinomiális idejű visszavezetések\\} + + \noindent \textbf{\emph{Polinom időben kiszámítható függvény}}: Legyen $\Sigma$ és $\Delta$ két ábécé és $f$ $\Sigma^{*}$ból + $\Delta^{*}$-ba képező függvény. Azt mondjuk, hogy $f$ polinom időben kiszámítható, ha kiszámítható egy polinom + időigényű Turing-géppel.\\ + + \noindent \textbf{\emph{Eldöntési problémák polinom idejű visszavezetése}}: + Legyen $L_{1} \subseteq \Sigma^{*}$ és $L_{2} \subseteq \Delta^{*}$ két eldöntési probléma. + $L_{1}$ polinom időben visszavezethető $L_{2}$-re ($L_{1} \leq_{p} L_{2}$), ha $L_{1} \leq L_{2}$ és + a visszavezetésben használt $f$ függvény polinom időben kiszámítható.\\ + + \noindent \textbf{Tétel}: Legyen $L_{1}$ és $L_{2}$ két probléma úgy, hogy $L_{1} \leq_{p} L_{2}$. Ha $L_{2}$ + + \begin{enumerate} + \item \textbf{P}-beli, akkor $L_{1}$ is \textbf{P}-beli. + + \item \textbf{NP}-beli, akkor $L_{1}$ is \textbf{NP}-beli. + \end{enumerate} + + \noindent \textbf{P} és \textbf{NP} zártak a polinom idejű visszavezetésekre.\\ +\newpage + \subsection*{NP-teljes problémák\\} + + \noindent \textbf{NP-teljes probléma}: Legyen $L$ egy probléma. Azt mondjuk, hogy $L$ \textbf{NP}-teljes, ha + + \begin{enumerate} + \item \textbf{NP}-beli, és + \item minden további \textbf{NP}-beli probléma polinom időben visszavezethető $L$-re. + \end{enumerate} + + \noindent Ha csak a második pont teljesül, akkor azt mondjuk, hogy L \textbf{NP}-nehéz.\\ + + \noindent \textbf{Tétel}: Legyen $L$ egy \textbf{NP}-teljes probléma. Ha $L \in$ \textbf{P}, akkor \textbf{P} $=$ \textbf{NP}.\\ + + \noindent \emph{Megjegyzés}: Jelenleg \textbf{NEM} tudunk \textbf{P}-beli \textbf{NP}-teljes problémáról!\\ + + \noindent \textbf{Tétel}: Legyen $L_{1}$ egy \textbf{NP}-teljes, $L_{2}$ pedig \textbf{NP}-beli probléma. + Ha $L_{1} \leq_{p} L_{2}$, akkor $L_{2}$ is \textbf{NP}-teljes. + + \subsubsection*{NP-teljes problémák\\} + + \noindent \textsc{Sat} azon konjunktív normálformákat tartalmazza, egy megfelelő ábécé felett kódolva, melyek kielégíthetőek. + \[ + SAT = \Big\{(\phi)\ \Big|\ \phi\ \text{kielégíthető konjuknktív normálformában adott formula} \Big\} + \] + + \noindent \textbf{Cook-Levin tétele}: \textsc{Sat} \textbf{NP}-teljes.\\ + + \noindent Legyen $k \geq 1$. Ekkor k\textsc{Sat} a következő probléma: + \[ + k\textsc{Sat} = \Big\{\langle \phi \rangle \ \Big| \ \phi \ \text{minden tagjában \emph{k} literál van} \Big\} + \] + + \noindent \textbf{Tétel}: 3\textsc{Sat} \textbf{NP}-teljes, ugyanis \textsc{Sat} $\leq_{p}$ 3\textsc{Sat}.\\ + + \noindent \textsc{\textbf{Teljes részgráf}}:\\ + + \noindent \textsc{Teljes részgráf}: + \[ + \Big\{\langle G, k \rangle \ \Big| \ G \ \text{véges gráf},\ k \geq 1, \ \text{G-nek} \ \exists \ k\ \text{csúcsú teljes részgráfja} \Big\} + \] + + \noindent Tehát a \textsc{Teljes részgráf} azon $G$ és $k$ párokat tartalmazza, megfelelő ábécé feletti + szavakban elkódolva, melyekre igaz, hogy $G$-ben van $k$ csúcsú teljes részgráf, azaz olyan részgráf, melyben bármely két csúcs között van él.\\ + + \noindent \textsc{\textbf{Független csúcshalmaz}}:\\ + \[ + \Big\{\langle G, k \rangle \ \Big| \ G \ \text{véges gráf}, k \geq 1, \ G-nek \ \exists \ k \ \text{elemű független csúcshalmaza} \Big\} + \] + Vagyis a \textsc{Független csúcshalmaz} azon $G$ és $k$ párokat tartalmazza, melyekre + igaz, hogy $G$-ben van $k$ olyan csúcs, melyek közül egyik sincs összekötve a + másikkal.\\ + + \noindent \textsc{\textbf{Csúcslefedés}}:\\ + \[ + \left\{\langle G, k \rangle \ \Big| \begin{array}{lr} + \ G \ \text{véges gráf}, k \geq 1, \ \text{G-nek van olyan \emph{k} elemű csúcshalmaza}, \\ \text{mely tartalmazza \emph{G} minden élének legalább egy végpontját} + \end{array} + \right\} + \] + + + \noindent \textsc{Teljes részgráf}, \textsc{Független csúcshalmaz} és \textsc{Csúcslefedés} \textbf{NP}-teljesek\\ + (\textsc{Teljes részgráf} $\leq_{p}$ \textsc{Független csúcshalmaz} $\leq_{p}$ \textsc{Csúcslefedés}).\\ + + \noindent \textsc{\textbf{Utazóügynök}}:\\ + \[\left\{\langle G, k \rangle \ \Big| + \begin{array}{lr} + \text{\emph{G} véges irányítatlan gráf, az éleken egy-egy pozitív egész súllyal és van} \\ \text{\emph{G}-ben legfeljebb \emph{k} összsúlyú Hamilton kör} + \end{array} + \right\} + \] + + \subsection*{Tárbonyolultság} + + A tárbonyolultságot egy speciális, úgynevezett offline Turing-gépen vizsgáljuk.\\ + + \noindent \textbf{Off-line Turing-gép}: Offline Turing-gépnek nevezünk egy olyan többszalagos Turing-gépet, mely a bemenetet tartalmazó szalagot csak olvashatja, a többi, ún. munkaszalagokra pedig írhat is. Az offline Turing-gép tárigényébe csak a munkaszalagokon felhasznált terület számít be.\\ + + \noindent A továbbiakban Turing-gép alatt offline Turing-gépet értünk. \\ + + \paragraph*{Tárbonyolultsággal kapcsolatos nyelvosztályok\\} + + \noindent \textbf{SPACE}(f(n)): + \[ + \Big\{L\ \Big|\ L \ \text{eldönthető}\ \mathcal{O}(f(n))\ \text{tárigényű determinisztikus Turing-géppel} \Big\} + \] + + + \noindent \textbf{NSPACE}(f(n)): + \[ + \Big\{L\ \Big|\ L\ \ \text{eldönthető}\ \mathcal{O}(f(n))\ \text{tárigényű nemdeterminisztikus Turing-géppel} \Big\} + \] + + \noindent Ezek után a \textbf{P} és az \textbf{NP} osztályok tárbonyolultsági megfelelőit az alábbi módon definiálhatjuk. + + \noindent \textbf{Definíció.} \textbf{PSPACE} $=\bigcup\limits_{k > 0}$ \textbf{SPACE}($n^{k}$) és \noindent \textbf{NPSPACE} $=\bigcup\limits_{k > 0}$ \textbf{NSPACE}($n^{k}$)\\ + + \noindent A szublineáris tárbonyolultságnak is van értelme, ezért valójában az alábbi tárbonyolultsági osztályokra lesz szükségünk.\\ + + \noindent \textbf{Definíció.} \textbf{L} $=$ \textbf{SPACE}($\log_{2} n$) és \textbf{NL} $=$ \textbf{NSPACE}($\log_{2} n$) \\ + + \noindent Egy nemdeterminisztikus Turing-gép determinisztikussal való szimulációja (jelenlegi tudásunk szerint) exponenciális idő-igény romlást eredményez. A tárbonyolultság esetében viszont bizonyított, hogy a determinisztikus Turing-gépek a tárbonyolultság négyzetes romlása árán képesek szimulálni a legalább logaritmikus tárbonyolultságú nemdeterminisztikus Turing-gépeket.\\ + + \noindent \textbf{Savitch tétele}: Ha $f(n) \geq \log n$, akkor + \[ + \textbf{NSPACE}(f(n)) \subseteq \textbf{SPACE}(f^{2}(n)) + \] + + \noindent \textbf{Következmény}. \textbf{PSPACE} = \textbf{NPSPACE}. +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszur.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszur.jpg new file mode 100644 index 0000000..92d9276 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszur.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszurorend.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszurorend.jpg new file mode 100644 index 0000000..d94c7ce Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Beszurorend.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Buborekrendezes.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Buborekrendezes.png new file mode 100644 index 0000000..fee394f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Buborekrendezes.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/GyorsRend.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/GyorsRend.jpg new file mode 100644 index 0000000..aa8502d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/GyorsRend.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Helyrevisz.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Helyrevisz.jpg new file mode 100644 index 0000000..dc2501b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Helyrevisz.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kezdokupac.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kezdokupac.jpg new file mode 100644 index 0000000..d6641ef Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kezdokupac.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kovetkezo.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kovetkezo.jpg new file mode 100644 index 0000000..a3695be Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kovetkezo.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/KupacbaBeszur.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/KupacbaBeszur.jpg new file mode 100644 index 0000000..52bf28f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/KupacbaBeszur.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kupacrend.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kupacrend.jpg new file mode 100644 index 0000000..17bc068 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Kupacrend.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Listaba.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Listaba.jpg new file mode 100644 index 0000000..928871b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Listaba.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/MergeSort_alg_1.nsd b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/MergeSort_alg_1.nsd new file mode 100644 index 0000000..4ad4d0c --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/MergeSort_alg_1.nsd @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/OfRend.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/OfRend.jpg new file mode 100644 index 0000000..b1fd125 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/OfRend.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorba.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorba.jpg new file mode 100644 index 0000000..fc7f50a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorba.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorbol.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorbol.jpg new file mode 100644 index 0000000..8c4d031 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sorbol.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sully.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sully.jpg new file mode 100644 index 0000000..e3a8f17 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Sully.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Torol.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Torol.jpg new file mode 100644 index 0000000..1772c31 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Torol.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaKitolt.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaKitolt.jpg new file mode 100644 index 0000000..1177576 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaKitolt.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaMax.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaMax.jpg new file mode 100644 index 0000000..4372ff6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/VFaMax.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembe.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembe.jpg new file mode 100644 index 0000000..224620c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembe.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembol.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembol.jpg new file mode 100644 index 0000000..633083c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Verembol.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Versenyrend.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Versenyrend.jpg new file mode 100644 index 0000000..aa4f41c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/Versenyrend.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/ads.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/ads.png new file mode 100644 index 0000000..dafa6e9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/ads.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_adt.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_adt.png new file mode 100644 index 0000000..3dc02a8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_adt.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_linked_list.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_linked_list.png new file mode 100644 index 0000000..8f7e7ce Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_linked_list.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_ads.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_ads.png new file mode 100644 index 0000000..b43a8fb Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_ads.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_linked_ads.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_linked_ads.png new file mode 100644 index 0000000..d85f491 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_matrix_linked_ads.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_storage1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_storage1.png new file mode 100644 index 0000000..97ee499 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/array_storage1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_iterative.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_iterative.png new file mode 100644 index 0000000..2a8d3a9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_iterative.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample1.png new file mode 100644 index 0000000..6ed1db3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample2.png new file mode 100644 index 0000000..f125426 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bin_tree_sample2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bintree_ads.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bintree_ads.png new file mode 100644 index 0000000..4f71b92 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bintree_ads.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_insert.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_insert.png new file mode 100644 index 0000000..73f6d0a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_insert.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_min.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_min.png new file mode 100644 index 0000000..020e4f6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_min.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_next.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_next.png new file mode 100644 index 0000000..a1627f9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/btree_next.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort.png new file mode 100644 index 0000000..8e5b854 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort_sample.png new file mode 100644 index 0000000..402194c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/bubblesort_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/decisiontree_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/decisiontree_sample.png new file mode 100644 index 0000000..4dad36a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/decisiontree_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/diagram b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/diagram new file mode 100644 index 0000000..9c48095 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/diagram @@ -0,0 +1 @@ +7VlZc9owEP41nkkfwkg2pvAI5GinZJoZOtPmUcXCqDUWFXKA/PqubPmUOcKVdOgLeFeHpf32213JltOfLu8FmU0euEcDy0be0nJuLNvGTdSGP6VZJZo21gpfME93yhVD9kK1EmltxDw6L3WUnAeSzcrKEQ9DOpIlHRGCL8rdxjwov3VGfGoohiMSmNrvzJMTvQsX5fpPlPmT9M0Y6ZYpSTtrxXxCPL4oqJxby+kLzmXyNF32aaCMl9olGXe3pjVbmKCh3GWA/WLjQSvqvAzd3uDl/usUs8W1q9cmV+mGqQf71yIXcsJ9HpLgNtf2BI9Cj6pZEUh5nwHnM1BiUP6iUq40mCSSHFQTOQ10K10y+UMNb7haeiq03Cz1zLGwSoVQilVhkBKfim35sFhKx82l4L8z6MDovWTHaptrDalVcx6JEd1gvdQhifCp3NCvmcENPKF8SmGFME7QgEj2XF4H0Q7rZ/1yTOFBw/oKiPW8zySI9JseKKx3CMBddS23hxuN0HJB348dgQiZPNLQ+2B4R469gmsxYZIOZyQ20gICQBln0/ZjHkrtFtjJsHimQtLlZjRM6+kBbU0vHV9Sti1ysuK0y6RA1BY6kbmbhrk3GBHtY8QjGM0uGw1j02oOqrFaNvDoZmttNxs4ZFdFdJBCHtLdzLSd56aRClZwa4yQ6namr37DI2fw4rUYNCumTaKPHlSM65V5nG0TJeHJmCiGKdv1/sh9vHjk8J7INd8WuPaBwKVpHBeSOGog5GxO5CA8UsFg9VScI0mvSb7ncRWnAnE1fu5McvS2vtIxfEVXCrCMFpmqnBXIGDdVNxh+BJlK1rG+zwMucucasyCoqEjA/BDEEeCu/KWn8h6D+ryrG6bM8+KytC6PljPtWeoRbEQH18itnbrUeqrMmkang3mOGthxrJ0L9ovieasMeobwa3neeluaY/OwMASCx9T+KUo+0/oTqZNrTKHrecyhLnTAzmwZ45q2w5Ov/r8caZ7PR5rn8Z0GKY8JOpKMq2ELOlcrmkN/Fvrf4uM1yhUDOpZlTTGs6Y2d7SBWiXt2zZmieda4Zx8Y9/69wrQaPdruntVGNYdVJzp1GHIuHbqscDwUOmOiU0PnGtBB8FN1onpGUkTh6CqvHXXB+CEW7uDXBPp9hOXz1I64wjvXrB1x66xB9PLuZapMbB+LidWJTs1E82Jmt4tfYIV58XtJLKyctW1kVjK1d8qnY6F5VbMBSh1v49iKN9zlXxCkHbeMaLMmrp73UG5eqMSIbiPmfzjr4OycDk4Q80+0SWjOP3Q7t38BtZRdT8IwFIZ/zRK9gKwbH7uVD10MxCgYxRtS18M2WVcshQ1/vR0725gQDSRe7fQ57en6nrc17D5P7yRdBWPBIDIsk6WGPTAsyzJbjv5kZJcTQrpIfBkyZBWYhF+A0ES6CRmsaxOVEJEKV3XoiTgGT9UYlVIk9WkLEdV3XVEfjsDEo9ExfQmZCnLqtM2KuxD6QbEzMTHDaTEZwTqgTCQHyB4adl8KofKIp32IMvUKXfzWq7x/fN7wD2sogsGMT+fzRl7s9pwl5REkxOri0uH0qbPlg65czpIRcZj8THe4xNzSaIN6jUH6cHVjtHuk2YyNtmb97PCKSpWHXFfcBxCza5RG7Qq9pdjEDLI9iWH3kiBUMFlRL8sm2mKaBYpHmF4rKZZlX7SivYWIFZqI2HqM/wdSQfqjoX+oQcoWaXOD4KDkTq8rnN3Co6Ovi2FSeYQ4yIIDf3SQUbSlX1aupNcBqn+6Ew/OW9qQ787WHbnc8Xmj53ZPdOIXac1LpP0vKUudiieic6ylbZ7QsrxZZ4iph9WN2+cOHi57+A0= \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/functionsrelations.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/functionsrelations.png new file mode 100644 index 0000000..677606a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/functionsrelations.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_doubletest.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_doubletest.png new file mode 100644 index 0000000..c144520 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_doubletest.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_opentest.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_opentest.png new file mode 100644 index 0000000..62bacef Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_opentest.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_squaretest.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_squaretest.png new file mode 100644 index 0000000..9e9c00d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/hash_squaretest.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort1.png new file mode 100644 index 0000000..0445c16 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort2.png new file mode 100644 index 0000000..4661147 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort3.png new file mode 100644 index 0000000..f613eef Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort4.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort4.png new file mode 100644 index 0000000..f07e899 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort4.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap1.png new file mode 100644 index 0000000..1360bd9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap2.png new file mode 100644 index 0000000..a14e6f0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap3.png new file mode 100644 index 0000000..c25b776 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap4.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap4.png new file mode 100644 index 0000000..8426fe0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_createheap4.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_max.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_max.png new file mode 100644 index 0000000..b87a702 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heap_sort_max.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort.png new file mode 100644 index 0000000..d447a44 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_pulldown.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_pulldown.png new file mode 100644 index 0000000..71f419a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_pulldown.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_start.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_start.png new file mode 100644 index 0000000..402835c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/heapsort_start.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertionsort.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertionsort.png new file mode 100644 index 0000000..3502c46 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertionsort.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertsort_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertsort_sample.png new file mode 100644 index 0000000..9dd1368 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/insertsort_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations1.png new file mode 100644 index 0000000..1abfeca Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations2.png new file mode 100644 index 0000000..b5933ab Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/list_operations2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/liststack_ads.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/liststack_ads.png new file mode 100644 index 0000000..50aa2f8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/liststack_ads.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/merge_sort_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/merge_sort_sample.png new file mode 100644 index 0000000..3ccb49a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/merge_sort_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/mergesort_alg1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/mergesort_alg1.png new file mode 100644 index 0000000..980a4b0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/mergesort_alg1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_abs.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_abs.png new file mode 100644 index 0000000..0a565c5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_abs.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_operations.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_operations.png new file mode 100644 index 0000000..a7f574e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/queue_operations.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort.png new file mode 100644 index 0000000..b550589 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_move.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_move.png new file mode 100644 index 0000000..f1620c3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_move.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_sample.png new file mode 100644 index 0000000..c5acc52 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/quicksort_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/stack_operations.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/stack_operations.png new file mode 100644 index 0000000..880a900 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/stack_operations.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_fill1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_fill1.png new file mode 100644 index 0000000..b41ffb4 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_fill1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max.png new file mode 100644 index 0000000..1a14e6a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max2.png new file mode 100644 index 0000000..e65b43e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_max2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_start.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_start.png new file mode 100644 index 0000000..fbbf589 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournament_start.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournamentsort.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournamentsort.png new file mode 100644 index 0000000..2160fbc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/tournamentsort.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_fill.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_fill.png new file mode 100644 index 0000000..625858c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_fill.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_max.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_max.png new file mode 100644 index 0000000..2bd4676 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/img/vtree_max.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.pdf new file mode 100644 index 0000000..30f3be8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.tex new file mode 100644 index 0000000..5b3c444 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/13.Alapvető algoritmusok és adatszerkezetek/tetel13.tex @@ -0,0 +1,910 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage[a4paper, margin=1in]{geometry} +\usepackage[export]{adjustbox} +\usepackage[magyar]{babel} +\usepackage[normalem]{ulem} +\usepackage[table,xcdraw]{xcolor} +\usepackage[thinlines]{easytable} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsthm} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{geometry} +\usepackage{graphicx} +\usepackage{hhline} +\usepackage{ifthen} +\usepackage{listings} +\usepackage{makecell} +\usepackage{multirow} +\usepackage{newunicodechar} +\usepackage{pgf,tikz} +\usepackage{subcaption} +\usepackage{tipa} +\usepackage{wasysym} +\usepackage{xcolor} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata} + +\usepackage{geometry} + \geometry{ + a4paper, + total={170mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\definecolor{mygray}{rgb}{0.0, 0.0, 0.0} +\definecolor{blue(pigment)}{rgb}{0.2, 0.2, 0.6} +\definecolor{brickred}{rgb}{0.8, 0.25, 0.33} +\definecolor{coolblack}{rgb}{0.0, 0.18, 0.39} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\bullet$} + +% A dokument itt kezdődik +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} +\date{} +\useunder{\uline}{\ul}{} +\fancyhf{} % sets both header and footer to nothing + \lfoot{ELTE-IK} + \cfoot{\thepage} + \rfoot{13. tétel } + +\pagestyle{fancy} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\huge\bfseries\noindent 13. Alapvető algoritmusok és adatszerkezetek} \\ + \end{center} + + \section*{Egyszerű adattípusok ábrázolásai, műveletei és fontosabb alkalmazásai} + + A következő öt különböző absztrakciós szintet különböztetünk meg adattípusoknál: + \begin{enumerate} + \item Absztrakt adattípus (ADT) + \item Absztrakt adatszerkezet (ADS) + \item Reprezentáció (ábrázolás) + \item Implementáció (fejlesztés, programnyelvi megvalósítás) + \item Fizikai (memória) szint + \end{enumerate} + + \subsubsection*{Absztrakt adattípus (ADT)} + + \noindent Ez az adattípus leírásának legmagasabb absztrakciós szintje. Az adattípust úgy specifikáljuk ezen a szinten, hogy a szerkezetére (még) nem teszünk megfontolásokat. A leírásban kizárólag matematikai fogalmak használhatók. A specifikáció eredménye az absztrakt adattípus.\\ + + \noindent Az ADT szintű specifikáció lehet formális, de lehet informális is: természetes magyar nyelven is elmondhatjuk, hogy mit várunk el például egy veremtől. A lényeg nem a leírás formalizáltsága, hanem az, hogy a specifikációban \emph{nem látjuk} az adattípus belső struktúráját.\\ + + \noindent Mire jó az ADT szintű leírás?\\ + + \noindent Ebben megadjuk a feladat állapotterén ($A$), illetve paraméterterén ($B$) a bemenő adatokra fennálló előfeltételeket ($Q$), majd az utófeltétel ($R$) formájában megfogalmazzuk az eredményre vonatkozó elvárásainkat. Az elő-, és utófeltétel lényegében statikus logikai állításokat tartalmaz, így a specifikáció valóban nélkülözi az algoritmikus elemeket.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + \noindent Az adatszerkezetek világában is adódhatnak hasonló természetű feladatok. Amikor például egy reprezentálási mód megválasztása a kérdés, célszerű, ha úgy tudjuk leírni az adattípussal kapcsolatos elvárásainkat, hogy nem teszünk megfontolásokat a szerkezetre nézve. Ilyen például az elsőbbségi (prioritásos) sor hatékony megvalósításának a problémája. Míg a legtöbben eleve tudják, hogy milyen a verem, vagy a sor adatszerkezet, addig kevesen hozzák magukkal köznapi ismereteik részeként az elsőbbségi sor reprezentálásáról szóló tudást. Mindenképpen hasznos tehát, ha szerkezeti összefüggések nélkül definiáljuk az elsőbbségi sor fogalmát.}\\ + + {\footnotesize + \noindent Az ADT szintű leírás közvetíti az enkapszuláció gondolatát is. Ha valaki egy típust implementál, akkor az ezt tartalmazó modult várhatóan úgy írja meg, hogy magához az adatszerkezethez a felhasználó közvetlenül ne férhessen hozzá, hanem csak a műveleteken keresztül érhesse el azt. A másik oldalról, ugyanebben a szellemben, a program felhasználója is elfogadja, hogy közvetlenül nem nyúl bele egy adatszerkezetbe, hanem csak a műveletein keresztül használja és módosítja azt.}\\ + + {\footnotesize + \noindent Alapvetően két leírási mód terjedt el: + \begin{enumerate} + \item az algebrai specifikáció, amely logikai axiómák megadásával definiálja az absztrakt adattípust, illetve + \item a funkcionális specifikáció, amely matematikai reprezentációval az elő-, utófeltételes módszerrel teszi ugyanezt. + \end{enumerate} + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \paragraph{Algebrai specifikáció\\\\} + + \noindent Ebben a specifikációs módszerben először megadjuk az adattípus műveleteit, mint leképezéseket, az értelmezési tartományukra vonatkozó esetleges megszorításokkal együtt. Utána a műveletek egymásra hatásának értelmes összefüggéseit rögzítjük axiómák formájában.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + \noindent A módszer alkalmazását a verem adattípus példáján mutatjuk be. A verem intuitív fogalma ismerős: olyan tároló struktúra, amelyből az utoljára betett elemet tudjuk kivenni. Ehhez nyilvánvalóan szerkezeti kép is társul, amelyről most tudatosan elfeledkezünk átmenetileg.\\ + + \noindent Először megadjuk a verem műveleteit, mint leképezéseket. Ezek közül talán csak az Üres művelet értelmezése lehet szokatlan: egyrészt létrehoz egy vermet, amely nem tartalmaz elemeket (lásd: deklaráció a programnyelvekben), másrészt az üres verem konstans neve is. Az Üres tehát egy konstans, ezért, mint leképezés nulla-argumentumú.\\ + + \noindent Az alábbi műveleteket vezetjük be:\\ + + $\begin{array}{l|l|l} + \text{Üres} & \rightarrow V & \text{Üres verem konstans; az üres verem létrehozása} \\ + \text{Üres-e} & V \rightarrow L & \text{A verem üres voltának lekérdezése} \\ + \text{Verembe} & V \times E \rightarrow V & \text{Elem betétele a verembe} \\ + \text{Veremből} & V \rightarrow V \times E & \text{Elem kivétele a veremből} \\ + \text{Felső} & V \rightarrow E & \text{A felső elem lekérdezése} \\ + \end{array}$\\\\ + + \noindent Megadjuk a leképezések megszorításait. A Veremből és a Felső műveletek értelmezési tartományából ki kell vennünk az üres vermet, arra ugyanis ez a két művelet nem értelmezhető. + + $D_{\text{Veremből}}=D_{\text{Felső}}=V \backslash \{\text{Üres}\}$\\ + + \noindent Az algebrai specifikáció logikai axiómák megadásával valósul meg. Sorra vesszük a lehetséges művelet-párokat és mindkét sorrendjükről megnézzük, hogy értelmes állításhoz jutunk-e.}\\ + \newpage + + {\footnotesize + \noindent Az alábbi axiómákat írjuk fel: + + \begin{enumerate} + \item Üres-e (Üres) vagy v=Üres $\rightarrow$ Üres-e (v) + \item Üres-e (v) $\rightarrow$ v=Üres + \item $\neg$ Üres-e (Verembe (v, e)) + \item Veremből (Verembe (v, e))=(v, e) + \item Verembe (Veremből (v))=v + \item Felső (Verembe (v, e))=e + \item Felső (v)=Veremből (v).2 + \end{enumerate} + + \begin{itemize} + \item Az 1. axióma azt fejezi ki, hogy az üres verem konstansra teljesül az üresség.\\ + Ezt változó használatával egyenlőségjelesen is megfogalmaztuk. + \item A 2. axióma az üres verem egyértelműségét mondja ki. + \item A 3. állítás szerint, ha a verembe beteszünk egy elemet, akkor az már nem üres. + \item A 4-5. axiómapár mindkét sorrend esetén leírja a verembe történő elhelyezés és az elem kivétel \lword{egymásutánjának} a hatását. Mindkét esetben a kiinduló helyzetet kapjuk vissza. (Az utóbbiban a Verembe művelet argumentum-száma helyes, ugyanis a belső Veremből művelet eredménye egy (verem, elem) pár.) Az utolsó két állítás a felső elem és a vermet módosító két művelet kapcsolatát adja meg. + \end{itemize} + + Egy ilyen axiómarendszertől először is azt várjuk, hogy helyes állításokat tartalmazzon. Természetes igény a teljesség is. Ez azt jelenti, hogy ne hiányozzon az állítások közül olyan, amely nélkül a verem meghatározása nem lenne teljes. Végül, a redundancia kérdése is felvethető: van-e olyan állítás a specifikációban, amely a többiből levezethető?\\ + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \paragraph{Funkcionális specifikáció\\\\} + + A funkcionális specifikáció módszerében először megadjuk az adattípus matematikai reprezentációját, amelyre azután az egyes műveletek elő-, utófeltételes specifikálása épül.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + A módszer a következőképp néz például sor adattípus esetén. Absztrakt szinten úgy tekinthetjük a sort, mint \emph{(elem, időpont)} rendezett párok halmazát.\\ + + Az időpontok azt jelzik, hogy az egyes elemek mikor kerültek a sorba. Kikötjük, hogy az időpontok mind különbözők. Ezek után tudunk a legrégebben bekerült elemre hivatkozni.\\ + + A \ref{fig:queueabs}. ábrán szereplő absztrakt sornak öt eleme van és először (legrégebben) a 40-es érték került a sorba. Ez az absztrakt reprezentáció a veremre is megfelelő lenne! A verem esetén azt az elemet választjuk ki, amelyikhez a legnagyobb időpont tartozik, a sor esetében viszont éppen a legkisebb időponttal rendelkező érték az, amely aktuálisan kivételre kerül.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/queue_abs.png} + \caption{A sor (és a verem) absztrakciója, mint érték-időpont párok halmaza (ADT)} + \label{fig:queueabs} + \end{figure} + + \noindent Formálisan ez például a következőképpen írható le (=nincs két eltérő elem azonos bekerülési idővel): + \[ + s = \left\{ (e_i, t_i)|\ i \in \{1, \ldots, n\} \wedge n \geq 0 \wedge \forall j \in \{ 1, \ldots, n\}: i \neq j \rightarrow t_i \neq t_j \right\} + \] + + \noindent Ha a sor műveleteit szeretnék specifikálni, akkor azt most már külön-külön egyesével is megtehetjük, nem kell az egymásra való hatásuk axiómáiban gondolkodni. Definiáljuk például a Sorból műveletet, elő-, utófeltételes specifikációval írjuk le formálisan, hogy ez a művelet a sorból az elsőkét betett elemet veszi ki, vagyis azt, amelyikhez a legkisebb időérték tartozik. + + \noindent $A = \underset{s}{S} \times \underset{e}{E}$\\ + \noindent $B = \underset{s}{S}$\\ + \noindent $Q = (s = s^{'} \wedge s^{'} \neq \emptyset)$\\ + \noindent $R = (s = s^{'}\backslash \left\{(e_{j}, t_{j}) \right\} \in \nu' \wedge e = e_{j} \wedge \forall i((e_{i}, t_{i}) \in \nu' \wedge i \neq j): t_{j} < t_{i})$\\ + } + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \subsection*{Absztrakt adatszerkezet (ADS)} + + \noindent Az ADS szinten megmondjuk azt, hogy alapvetően (esetleg nem teljes részletességgel) milyen struktúrával rendelkezik a szóban forgó adattípus. Közelebbről ez azt jelenti, hogy megadjuk az adatelem közötti legfontosabb rákövetkezési kapcsolatokat, és ezt egy irányított gráf formájában le is rajzoljuk. Az absztrakt adatszerkezetet egy szerkezeti gráf és az ADT szinten bevezetett műveletek alkotják együttesen.\\ + + \noindent Az ADS szinten az adattípus legfontosabb szerkezeti összefüggéseit adjuk meg egy irányított gráffal. A gráf csúcspontjai adatelemeket azonosítanak, az irányított élek pedig a közöttük fennálló rákövetkezési relációt ábrázolják.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + + {\footnotesize + \noindent A \ref{fig:liststack_ads}. ábrán egy nagyon egyszerű gráf látható, amely egyetlen lineáris élsorozatot tartalmaz. Ez egyaránt ábrázolhat vermet, sort vagy listát. A szövegkörnyezet dönti el, hogy melyik adattípus absztrakt szerkezetét láthatjuk az ábrán. Ha veremről van szó, akkor említésre kerül, hogy a 40-es a felső elem. Sor esetén a 40-es az első, a 80-as pedig az utolsó elem. Ha egy lista ADS szintű ábráját látjuk, akkor viszont az aktuális elem fogalmát kell szóba hozni és meg kell mondani, hogy a melyik a lista aktuális eleme; lehet az például a 20-as.}\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/liststack_ads.png} + \caption{Lista (verem és sor) absztrakt szerkezeti ábrája (ADS)} + \label{fig:liststack_ads} + \end{figure} + + {\footnotesize + \noindent Tegyük fel, hogy most egy absztrakt sorral van dolgunk. Az ábrán látható kétféle megjelenítés (az egzakt és az informális) megfeleltethető egymásnak. Az utóbbi a sor tömbös ábrázolása felé mutat, míg az első a láncolt ábrázolás kiindulópontjának tekinthető.\\ + + \noindent Jellegzetes a bináris fa ábrája ezen a szinten, amellyel gyakran találkozhatunk. A \ref{fig:bintree_ads}. ábrán látható (gyökeres) bináris fa eredetileg irányított éleket tartalmaz, ám legtöbbször az irányítás lemarad az ábrákról. A rákövetkezéseket mutató nyilakat azonban odaértjük az élekre, szülő-gyerek irányban mindenképpen, de esetleg a fordított irányban is.\\ + } + + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/bintree_ads.png} + \caption{Bináris fa absztrakt szerkezeti ábrája (ADS)} + \label{fig:bintree_ads} + \end{figure} + + {\footnotesize + \noindent Az ADS szint előnyeit vegyük röviden sorra. + \begin{itemize} + \item Ez a szint illeszkedik legjobban az ember kognitív adottságaihoz. Ennek az lehet a magyarázata, hogy éppen kellően absztrakt: már megjelenik a struktúra, de még nem kell döntést hozni az ábrázolás módjáról. + \item A szerkezeti összefüggések lényegét emeli ki, amelyeket majd a reprezentáció szintjén teszünk teljessé. + \item Az ADS szint szemléletes, ami nem csak a struktúrára, hanem adattípushoz tartozó műveletek illusztrálására is vonatkozik. + \end{itemize} + } + + \noindent {\footnotesize $\triangleleft$ \faLightbulbO } + + \subsection*{Adatszerkezetek reprezentálása} + + \noindent Ezen a szinten arról döntünk, hogy az ADS-szinten megjelenő gráf rákövetkezési relációit – kiegészítve azokat további szükséges szerkezeti összefüggésekkel – milyen módon ábrázoljuk. Egy adatszerkezetet többféle reprezentációval is meg lehet valósítani (pl. prioritásos sor lehet rendezetlen tömb, rendezett tömb, kupac). Két tiszta reprezentálási módot alkalmazunk. Ezek a következők: + \begin{itemize} + \item Aritmetikai (tömbös) reprezentáció: takarékos ábrázolás, elhelyezése, tetszőleges rákövetkezések, bejárások, de ezeket meg kell adni. + \item Láncolt (pointeres) ábrázolás: minden pointer egy összetett rekord elejére mutat. + \end{itemize} + Az így kapott ábrázolás már az implementációhoz közeli és a számítógépes megvalósítást modellezi. + + \subsection*{Adatszerkezetek} + + \subsubsection*{Tömb} + + \begin{itemize} + \item A tömbök legfontosabb tulajdonsága az, hogy elemei – indexeléssel – közvetlenül elérhetők. Ezt ADT szintű tulajdonságnak tekinthetjük. + \item A tömbről ADS szinten \emph{tömbszerű} képünk van, de az elemek rákövetkezősége alapján irányított gráfként is felfoghatunk egy tömböt. Ez az absztrakció a láncolt ábrázolás felé mutat. + \item Az megvalósítás során, az ADS szinttel összhangban, ritkán választjuk a tömb láncolt ábrázolását (ahogyan- fordítva – a listák esetében sem gyakori a tömbös megvalósítás). + \item A tömbökről nem könnyű megmondani a felhasználás egy körében vagy konkrét esetében, hogy saját műveletekkel rendelkező önálló típusnak, vagy csupán a reprezentáció adatszerkezetének tekinthetők. + \item A tömbök dimenziószámmal rendelkeznek; a vektor egydimenziós, míg a mátrix kétdimenziós ismert struktúra; de magasabb dimenziós tömbök használata sem ritka. A tömb erősen szemléletes fogalom; három dimenzióig könnyű elképzelni, lerajzolni a szerkezetüket. + \item Ma már egy többdimenziós tömb, például egy mátrix nem juttatja eszünkbe, hogy a további lépésként egydimenziós tömbbel kellene reprezentálni. Ez annak köszönhető, hogy a programozási nyelvek elemi lehetőségként kínálják a többdimenziós tömbök használatát. Érdemes azonban tudatosítani, hogy többdimenziós tömbök a számítógép memóriában egydimenziósként ábrázolódnak. + \item Speciális több dimenziós tömbök (például alsóháromszög-mátrix) helytakarékos egydimenziós ábrázolásáról olyakor magunk gondoskodunk. + \end{itemize} + + \paragraph{A tömb absztrakt adattípus\\\\} + + \noindent Legyen $T$ az $E$ alaptípus feletti $k(\geq1)$ dimenziós tömb típus. Vezessük be az indexhalmazt $I=I_{1} \times \ldots \times I_{k}$, ahol $I_{j}=[1 \ldots n_{j}]\ (1\ \leq j\ \leq k)$.\\ + (Megjegyezzük, hogy az indexelés $1$ helyett kezdődhetne általában $m_j$-vel is, de az egyszerűség kedvéért $1$-et fogunk használni.)\\ + + \noindent Az $A \in T$ tömbnek így $n=n_1 \cdot n_2 \cdot \ldots \cdot n_k$ elemet tárol, amelyek halmazát $\left\{a_1, \ldots,\ a_n \right\}$ jelöli. A $T$ tömbhöz tartozik, mint a típus meghatározó komponense, egy $f: I \rightarrow \left[1\ \ldots n\right]$ indexfüggvény, amely kölcsönösen egyértelmű leképezést létesít az indexhalmaz és az elemek halmazbeli indexei között, ezáltal egyértelmű leképzést valósít meg az indexhalmaz és a tömb elemei között. A tömbelemek egyértelműen és közvetlenül elérhetővé válnak az indexfüggvény alkalmazásával.\\ + + \noindent Bevezetjük az $A[1..n_1,1..n_2,...,1..n_k]$ jelölést az A tömbre, amely magában foglalja az indexhalmazát és utal arra, hogy az indexkifejezések és a tömbelemek közötti kapcsolat is adott, így annak alapján az elemekre – indexeléssel – lehet közvetlenül hivatkozni.\\ + + \noindent Bevezetjük az $A[i_1,\i _2,\ \ldots,\ i_k]$ jelölést a tömbelemek indexelésére. Ha a fenti indexfüggvény szerint $f(i_1,\ i_2,\ \ldots,\ i_k) = j$, akkor ez az indexelés az $a_j$ elemet választja ki $A[i_1,\i _2,\ \ldots,\ i_k]=a_j$. Az indexelés mechanizmusát (absztrakt megközelítésben) a \ref{fig:array_adt}. ábra szemlélteti. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/array_adt.png} + \caption{Tömb absztrakt adattípus} + \label{fig:array_adt} + \end{figure} + + \noindent A tömb műveleteinek köre szerény: a most bevezetett indexeléssel lekérdezhetjük a tömb elemeit, emellett módosíthatjuk is azokat. A tömb a mérete nem változik; nem lehet a tömbbe egy új elemet beszúrni, és nem lehet a tömbből egy elemet kitörölni. A szokás elnevezések szerint $k=1$ esetén a vektorról, $k=2$ esetén a mátrixról beszélünk. + + \paragraph{A tömb absztrakt adatszerkezet\\\\} + + \noindent A tömböktől elválaszthatatlan a szerkezetükről alkotott kép. Ezen a kép alapján például egy cellákból álló lineáris vagy négyzethálós sémában helyezzük el (az egy, illetve kétdimenziós) tömb elemeit. A \ref{fig:array_matrix_ads}. ábrán egy mátrix szokásos ábrája látható. + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/array_matrix_ads.png} + \caption{Tömb szemléletes képe (ADS)} + \label{fig:array_matrix_ads} + \end{figure} + + \noindent Az absztrakt adatszerkezet bevezetésével a fenti $f$ indexfüggvény a háttérbe húzódik, hiszen azt lehet mondani például a fenti kétdimenziós tömb esetén, hogy mondjuk az A[2,3]=40 elem a 2. sor 3. eleme, vagyis az indexkifejezést vizuálisan megjelenítettük az ADS szintű sémával.\\ + + \noindent Szemléletünk számára tehát a vektor egy beosztásokkal ellátott szalag, a 2-dimenziós tömb egy mátrix, a 3-dimenziós tömb egy cellákra osztott téglatest alakját ölti gondolatainkban.\\ + + \noindent Az előző, bevezető jellegű 2. fejezet szerint, az absztrakt adatszerkezetet általában egy olyan irányított gráf szemlélteti, amelyben az élek az adatelemek közötti rákövetkezéseket jelenítik meg. Egy k-dimenziós tömb elemeinek általában, a dimenziók határát kivéve, k számú rákövetkezőjük van. Formálisan is bevezethetjük a j szerinti rákövetkezés fogalmát: + \[ + \text{köv}_{j}A\left[i_1,\ \ldots,\ i_j,\ \ldots,\ i_k\right] = A\left[i_1,\ \ldots,\ i_{j+1},\ \ldots,\ i_k\right]\quad (i_j < n_j) + \] + + \noindent A \ref{fig:array_matrix_linked_ads}. ábra egy kétdimenziós tömb, az A[1..3,1..4] mátrix absztrakt gráfszerkezetét mutatja. Ez egy olyan ortogonális struktúra, amelyben minden csúcsból két él vezet a tömbbeli rákövetkezőkhöz. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/array_matrix_linked_ads.png} + \caption{Tömb gráfja (ADS)} + \label{fig:array_matrix_linked_ads} + \end{figure} + + \noindent Valójában a tömbről nem ilyen képet őrzünk fejünkben, ahogyan a verem sem egy lineáris gráf formájában rögzül a memóriánkban. Annyiban azonban mégsem fölösleges a gráfos szemlélet, mert közelebb hozza a ritka mátrixok láncolt ábrázolásának ötletét. + + \subsection*{A tömb megvalósításai} + + \paragraph{Aritmetikai reprezentáció\\\\} + + \noindent Egy adatszerkezet aritmetikai ábrázolása során az adatelemeket egy tömbben helyezzük el, az eredeti strukturális összefüggéseket pedig függvények formájában adjuk meg.\\ + + \noindent Az adatokat tároló tömb lehet egy- vagy többdimenziós. Szemléletünk számára egy többdimenziós tömb már annyira egyszerű adatszerkezet, hogy nem szükséges mindig újra meggondolni az egydimenziós elhelyezés lehetőségét. A programnyelvek is megerősítenek ebben, hiszen a többdimenziós tömbök használatát az alapvető lehetőségek között nyújtják.\\ + + \noindent A tömb adattípus ismertetésekor azonban, legalább ezen a helyen egyszer, érdemes szóba hozni azt, hogy a többdimenziós tömbök elemeit még el kell helyezni a szalagszerű egydimenziós memóriában.\\ + + \noindent A szekvenciális tárolást általában a sorfolytonos vagy oszlopfolytonos módszerrel szokás megoldani. (Azzal még itt sem foglalkozunk, hogy a tárolás végállomása egy bájtokból álló vektor, és a bájtokat – még tovább finomítva – bitek sorozata alkotja.)\\ + + \noindent A \ref{fig:array_storage_one}. ábrán a korábban is szereplő mátrixnak az egydimenziós tárolást illusztrálja, mindkét elhelyezési stratégia szerint. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/array_storage1.png} + \caption{Kétdimenziós tömb egydimenziós tárolása} + \label{fig:array_storage_one} + \end{figure} + + \noindent A kapcsolatot az elemek mátrixban elfoglalt pozíciója és az új helye között index-függvényekkel adjuk meg. Egy $A[1 \ldots m, 1\ldots n]$ kétdimenziós tömbre, például a sorfolytonos esetben ez a következő: + \[ + ind(i,j) = (i-1)n + j + \] + + \paragraph{Láncolt ábrázolás\\\\} + + \noindent Bizonyos (jobbára gazdasági) problémák modellezése nagyméretű mátrixok alkalmazásához vezet. Előfordul azonban, hogy a mátrix csekély értékes adatot tárol. Ilyenkor gondolhatunk arra a reprezentálási módra, amelyet a \ref{fig:array_linked_list}. ábrán láthatunk. + + \noindent A ritka mátrixok láncolt ábrázolásában csak az értékes elemek szerepelnek. Alkalmazhatunk egyirányú láncolást, amelyben minden elemtől a sor- és oszlopbeli rákövetkezőjéhez irányít a két tárolt pointer. A sorok és az oszlopok bejárataira, pontosabban az első bennük szereplő elemre, egy-egy fejelem mutat, amelyek maguk is egy-egy listát alkotnak. A két fejelem lista egy közös fejelemből érhető el. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/array_linked_list.png} + \caption{Ritka mátrix láncolt ábrázolása} + \label{fig:array_linked_list} + \end{figure} + + \noindent Az ábra nem csak a helytakarékosság lehetőségét érzékelteti, hanem azt is, hogy ezzel az ábrázolási móddal feladtuk az elemek közvetlen indexelhetőségét és csak meglehetős nehézkességgel tudunk eljutni az elemekhez.\\ + + \noindent Az elemek elérését, illetve a struktúrában való mozgást valamelyest javítja, ha kétirányú láncolást alkalmazunk, mind a sorokban és az oszlopokban, mind pedig a két fejelem-listában.\\ + + \noindent Azt a kérdést, hogy alkalmazzuk-e adott esetben ezt a tárolási formát, két szempont dönti el. Egyik a helytakarékosság kérdése: az értékes mátrixelemek (várható) számának és méretének ismerete esetén könnyen kiszámítható, hogy előnyösebb-e ez az ábrázolás, mint a hagyományos. Ehhez csak a pointerek számát kell meghatározni, amelyet a memóriacím helyfoglalásával (ami általában 2 vagy 4 bájt) szorozva kell a memóriaigény számításában figyelembe venni.\\ + + \noindent A másik mérlegelendő szempont az, hogy mennyire támogatják a feldolgozó eljárások megvalósíthatóságát a láncolt adatszerkezeten való közlekedés korlátozott lehetőségei. \\ + A mai memóriakapacitások mellett lehet, hogy ez a súlyosabb szempont. Ha arra gondolunk például, hogy hogyan kellene két ritka mátrix összegét előállítani, akkor látható, hogy a láncolt ábrázolás mellett a legegyszerűbb feladat megoldása is körülményessé válhat.\\ + + \begin{itemize} + \item \textit{Tömb}: Azonos típusú elemek sorozata, fix méretű. + \item \textit{Verem}: Mindig a verem tetejére rakjuk a következő elemet, csak a legfelsőt kérdezhetjük le, és vehetjük ki. + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/stack_operations.png} + \caption{Verem műveletei} + \end{figure} + \item \textit{Sor}: Egyszerű, elsőbbségi és kétvégű. A prioritásos sornál az elemekhez tartozik egy érték, ami alapján rendezhetjük őket. + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/queue_operations.png} + \caption{Sor műveletei} + \end{figure} + \item \textit{Lista}: Láncolt ábrázolással reprezentáljuk. 3 szempont szerint különböztethetjük meg a listákat: fejelem van/nincs, láncolás iránya egy/kettő, ciklusosság van/nincs. Ha fejelemes a listánk, akkor a fejelem akkor is létezik, ha üres a lista.\\ + A lista node-okból áll, minden node-nak van egy, a következőre mutató pointere, illetve lehet az előzőre is, ha kétirányú. Ezen kívül van egy első és egy aktuális node-ra mutató pointer is, és az utolsó elem mutatója NIL. A listát megvalósíthatjuk úgy, hogy tetszőleges helyre lehessen elemet beszúrni, illetve törölni. + + \begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{img/list_operations1.png} + \caption{Lista műveletei} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{img/list_operations2.png} + \caption{Lista műveletei} + \end{figure} + + \item \textit{Fa}: Egyszerű, bináris és speciális (kupac, bináris keresőfa, AVL-fa). A bináris fát rekurzívan definiáljuk: $t \in T(E)$ [bin. fák típusérték halmaza(alaptípus)] $t$ üres fa (jele: $\Omega$), vagy $t$-nek van gyökéreleme, $bal(t)$, $jobb(t)$ részfája. Láncoltan ábrázoljuk, tömbösen csak teljes fák, illetve kupac esetén. + \item \textit{Kupac}: Olyan bináris fa, melynek alakja majdnem teljes és balra rendezett. Tömbösen ábrázoljuk, mert pointeresen a bonyolult lépkedést nem teszi lehetővé, tömbösen indexösszefüggésekkel könnyen megoldható. + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/KupacbaBeszur.jpg} + \caption{Kupac műveletei} + \end{figure} + \item \textit{Hasítótábla} + \item \textit{Gráf} [Nem egyszerű adattípus.] + \end{itemize} + + \subsection*{Adatszerkezetek lehetséges műveletei} + + \begin{itemize} + \item Üres adatszerkezet létrehozása + \item Annak lekérdezése, hogy üres-e az adatszerkezet + \item Elem berakása, itt ellenőrizni kell, hogy nem telt-e még meg + \item Elem kivétele vagy törlése, itt ellenőrizni kell, hogy nem üres-e + \item Adott tulajdonságú elem (például maximum, veremben a felső) lekérdezése, itt is ellenőrizni kell, hogy üres-e az adatszerkezet + \item Bejárások (preorder, inorder, postorder, szintfolytonos), listáknál az első, előző vagy következő elemre lépés + \item Elem módosítása bizonyos adatszerkezeteknél (pl. listák) + \end{itemize} + + \subsection*{Fontosabb alkalmazásai} + + \textit{Prioritásos sor}: nagygépes programfuttatásnál az erőforrásokat a prioritás arányában osszuk el, adott pillanatban a maximális prioritásút válasszuk. Sürgősségi ügyeleten, gráfalgoritmusoknál is alkalmazható. + \textit{B-fa}: ipari méretekben adatbázisokban használják. + + \section*{A hatékony adattárolás és visszakeresés néhány megvalósítása} + + \subsection*{Bináris keresőfa} + + \noindent A bináris keresőfa a kulcsos adatrekordok tárolásának egyik elsőként kialakult eszköze. Egyszerű tárolási elvet valósít meg: a legelső, a gyökérben elhelyezett rekord utáni kulcsokat a \emph{kisebb balra, nagyobb jobbra} elv alapján illesztjük be a fába. A kiegyensúlyozással kiegészítve a tárolás hatékony adatszerkezetét kapjuk (AVL-fa, piros-fekete fa).\\ + + \noindent A bináris keresőfa nevezetes tulajdonsága az, hogy inorder bejárással a kulcsokat rendezett sorozatként érjük el. Ez következik az inorder bejárás azon tulajdonságaiból, hogy + \begin{enumerate} + \item a gyökeret középen, a bal oldali és a jobb oldali részfa bejárása között érintjük, + \item a bal oldali részfa minden kulcsa kisebb, a jobb oldali minden kulcsa nagyobb, mint a gyökérben tárolt kulcs és + \item mindkét oldali részfát inorder módon járjuk be. + \end{enumerate} + + \begin{figure}[H] + \centering + \includegraphics[width=0.26\textwidth]{img/bin_tree_sample1.png} + \caption{Bináris keresőfa} + \includegraphics[width=0.4\textwidth]{img/bin_tree_sample2.png} + \caption{Bináris keresőfa láncolt ábrázolása} + \end{figure} + + \noindent Adjuk meg a bináris keresőfa definícióját. A felépítés dinamikus szabálya után statikus meghatározást keresünk. A $t$ bináris fát pontosan akkor mondjuk egyúttal bináris keresőfának, ha $t$ bármely $x$ csúcsára igaz az, hogy amennyiben $y$ az $x$ bal oldali részfájának egy csúcsa, illetve ha a $z$ pont az $x$ jobb oldali részfájának egy csúcsa, akkor + \begin{center} + $kulcs(y) < kulcs(x) < kulcs(z)$ + \end{center} + Az adatfeldolgozásban általában nem engedjük meg azonos kulcsok előfordulását. Figyelni kell arra, hogy nem elég csupán a fenti egyenlőtlenségeket szülő-gyermek szinten megkövetelni. Ha rendezésre használnánk a bináris keresőfát, akkor abban az alkalmazásban nevezhetnénk rendezőfának. Mivel a rendezendő elemek között lehetnek egyenlők is, a fenti definícióban $\leq$ jeleket alkalmaznánk.) + + \subsubsection*{Adott kulcsérték keresése} + + \noindent A bináris keresőfa műveletei között alapvető egy adott k kulcsú rekord megkeresése. A keresés módja a keresőfa felépítésének elvén alapul. A gyökérnél kezdve összehasonlítjuk a keresett $k$ értéket a csúcsban tárolt kulccsal. Ha az aktuális kulcs éppen megegyezik $k$-val, akkor megtaláltuk a keresett rekordot. Ha $k$ kisebb, mint az aktuális kulcs, akkor balra lépve keresünk tovább, fordított esetben pedig a jobb oldalon folytatjuk a keresést. Ha olyan kulcsot keresünk, amely nem található a fában, akkor az eljárás egy levélcsúcsba található $NIL$ pointeren áll meg. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/bin_tree_iterative.png} + \caption{A keresés műveletének iteratív algoritmusa} + \end{figure} + + \subsubsection*{A legkisebb kulcs keresése} + + \noindent Egy nem üres bináris keresőfában úgy jutunk el a minimális kulcsot tároló csúcshoz, hogy a gyökértől indulva mindig a bal oldali pointeren lépünk tovább. Ha már nem vezet tovább balra út, akkor megtaláltuk a legkisebb kulcsot. + \begin{figure}[H] + \centering + \includegraphics[width=0.25\textwidth]{img/btree_min.png} + \caption{A minimális kulcs megkeresése} + \end{figure} + + \subsubsection*{A következő kulcsérték megkeresése} + + \noindent Általában, az adott pontból szülő pointereken megyünk addig, amíg azok – a szülőből nézve – jobb gyerekre mutató pointerek (ez a sorozat lehet üres is). Utána még egy lépést kell tennünk felfelé egy szülő pointeren, amely – ismét a szülő csúcshoz viszonyítva – bal gyerekhez vezet. A bináris fában található maximális kulcsnak nincs rákövetkezője. Ilyenkor a keresés, ezzel összhangban, $NIL$ pointert ad vissza. + + \begin{figure}[H] + \centering + \includegraphics[width=0.30\textwidth]{img/btree_next.png} + \caption{A nagyság szerint következő kulcs megkeresése} + \end{figure} + + \subsubsection*{Adott kulcsérték beszúrása} + + \noindent A bináris keresőfába úgy illeszthetünk be – csúcs formájában - egy új kulcsos rekordot, hogy összeállítjuk az új tartalmat egy pontosan olyan szerkezetű rekordban, mint amilyen többi rekord. Az új rekord rendelkezik azzal a három pointer mezővel, amellyel a fában mindegyik fel van szerelve; ezek a bal és a jobb gyerekre, valamint a szülőre mutatnak. + + \noindent Az új rekordra mutató pointert \emph{adjuk oda} a beszúrást végző eljárásnak, amely a már többször látott, balra-jobbra összehasonlító és lépegető stratégiával megkeresi az új kulcs helyét és létrehozza a bináris keresőfa egy új levelét. + + Ha a beillesztendő kulcs különbözik a fa mindegyik kulcsától, akkor sikeres lesz az elhelyezés (ezt az jelzi, hogy az eljárás a p pointer étékét adja vissza), ha viszont megegyezik valamely kulcsértékkel a fában, akkor a sikertelen beszúrást a visszaadott NIL érték jelzi. + + \begin{figure}[H] + \centering + \includegraphics[width=0.40\textwidth]{img/btree_insert.png} + \caption{Kulcsos rekord beszúrása bináris keresőfába} + \end{figure} + + \subsubsection*{A keresőfa műveleteinek hatékonysága} + + Ha sorra áttekintjük azt az négy műveletet, amelyet a bináris keresőfákra bevezettünk, akkor azt láthatjuk, hogy mindegyiknek a lényegi részét egy útvonal bejárása adja a fában. Ez az útvonal egy olyan útnak részét képezi, amely a fa gyökerétől valamely levélig terjed. Ennek a befoglaló útvonalnak a hossza attól függ, hogy milyen mélységben található az a levél, amelyben végződik. Minden esetre, a keresőfa magassága felső korlátját képezi a teljes útnak, így a szóban forgó művelet úthosszának is.\\ + + A műveletek lépésszáma lényegében megegyezik a fában bejárt útvonal hosszával, amelyhez még hozzá számítunk néhány (konstans számú) lépést. + Azt mondhatjuk tehát, hogy bináris keresőfa mindegyik $op$ műveletére érvényes az az állítás, hogy lépésszámát nagyságrendben a fa ($h(t)$) magassága felülről korlátozza: + \begin{center} + $T_{op}(n) = \mathcal{O}(h(t)) $. + \end{center} + + A bináris fa a magasságának az alsó korlátját a majdnem teljes fa \emph{összenyomott} állapotában veszi fel, a magasság legnagyobb értékét pedig egy láncszerű fa esetén kapjuk.\\ Érvényes a következő összefüggés: + \begin{center} + $\lfloor log_2n \rfloor \leq h(t) \leq n - 1$.\\ + \end{center} + + \noindent A két összefüggés alapján a bináris fa műveleteire a következőket állíthatjuk az + \begin{itemize} + \item általános (tetszőleges egyedi) esetben: $T_{op}(n) = \mathcal{O}(n)$, valamint a + \item legkedvezőbb esetben: $mT_{op}(n) = \mathcal{O}(log n)$, illetve a + \item legkedvezőtlenebb esetben: $MT_{op}(n) = \mathcal{O}(n)$ + \end{itemize} + + \noindent Az a cél, hogy a bináris keresőfa ne nyúljon meg láncszerűen, erre jó az AVL-fa és a 2-3-fa. + + \subsection*{AVL-fa} + + Cél: a $t$ bináris keresőfa magasságának $\log_2(n)$ közelében tartása, azaz $h(t) \leq c \cdot \log_2(n)$, ahol $c$ elfogadhatóan kicsi. Az ilyen fát kiegyensúlyozottnak nevezzük. \\ + \textit{AVL}: Adelszon-Velszkij, Landisz 1962-ben alkották meg. \\ + A $t$ bináris keresőfát egyúttal AVL-fának nevezzük $\Longleftrightarrow$ $t$ minden $x$ csúcsára $|h(bal(x))-h(jobb(x))| \leq 1$. \\ + Minden csúcsnak van egy címkéje $+,-,=$ (gyerekek magasságának különbsége). A beszúrás helyétől felfelé ellenőrizzük ezeket, és ha kell, akkor módosítjuk. Ha valahol $++$ vagy $--$ alakul ki, akkor ott elromlik az AVL-tulajdonság, egy vagy több forgatással vagy átkötéssel konstans műveletigénnyel helyre lehet hozni. \\ + Többféle séma is van: $(++,+), (++,-), (++,=)$ és a tükörképeik. + + \subsection*{2-3-fa és B-fa} + + 2-3-fa kis méretben az elmélet számára jó, a B-fa a gyakorlati változat adatbázisban. \\ + $t$ 2-3-fa $\Longleftrightarrow$ minden belső csúcsnak 2 vagy 3 gyereke van, a levelek azonos szinten helyezkednek el, adatrekordok csak a levelekben vannak, belső pontokban kulcsok és mutatók, levelekben a kulcsok balról jobbra nőnek. \\ + Ha 4 gyerek lenne a beszúrás után, akkor csúcsot kell vágni. Ha törlésnél 1 gyerek lenne valahol, akkor csúcsösszevonásokat és gyerekátadást alkalmazunk. \\ + B-fa nagyobb méretű, itt két határ között mozog a gyerekszám: $\lceil\frac{r}{2}\rceil$ és $r$, ahol $50 \leq r \leq 1000$. + + \subsection*{Hasítás} + + Kulcsos rekordokat tárol. + \begin{itemize} + \item \textit{Hasítás láncolással}: a kulcsütközést láncolással oldja fel. Van egy hasítófüggvény: $h: U \to [0..m-1]$, elvárás vele kapcsolatban, hogy gyorsan számolható és egyenletes legyen. $m$-et úgy választjuk meg $n$ nagyságrendjének ismeretében, hogy $\alpha = \frac{n}{m}$ lesz a várható listahossz, ha egyenletes hasítást feltételezünk.\\ + Például kétirányú listát használhatunk a hasításhoz. Műveletek: beszúrás, keresés, törlés. \\ + Gyakorlatban érdemes $m$-et úgy megválasztani, hogy olyan prímszám legyen, ami nem esik 2-hatvány közelébe. + \item \textit{Hasítás nyitott/nyílt címzéssel}: A kulcsokat lehessen egészként értelmezni, ekkor vannak jó hasítófüggvények. \\ + Próbálkozás általános képlete: $h(k) + h_i(k)$ $(mod$ $M)$, $0 \leq i \leq M-1$. Egész addig alkalmazza, amíg üres helyet nem talál. + \begin{enumerate} + \item \textit{Lineáris próba}: $h_i(k) = -i$ $(mod$ $M)$, egyesével balra lépegetve keressük az üres helyet. Hátránya az elsődleges csomósodás, ez jelentős lassulást okoz beszúrásnál és keresésnél. + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/hash_opentest.png} + \caption{Nyílt címzés lineáris próbálkozással} + \end{figure} + \item \textit{Négyzetes próba}: $h_i(k) = (-1)^i(\lceil\frac{i}{2}\rceil)^2$ $(mod$ $M)$, a négyzetszámokkal lépegetünk balra-jobbra, ezek az eltolások kiadják $\{0,1,...,M-1\}$-et. Hátrány: másodlagos csomósodás. + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/hash_squaretest.png} + \caption{Nyílt címzés négyzetes próbálkozással} + \end{figure} + \item \textit{Kettős hash-elés}: $h_i(k) =-ih'(k)$ $(mod$ $M)$, $h'(k)$ a $k$-hoz tartozó egyedi lépésköz, $(h'(k),M)=1$ relatív prímek. Ha az $M$ elég nagy, akkor nincs csomósodás. + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/hash_doubletest.png} + \caption{Nyílt címzés négyzetes próbálkozással} + \end{figure} + \end{enumerate} + \item \textit{Hasítófüggvények}: Leggyakoribb: $k$ egész, kongruencia reláció. Általánosan: $h(k) = (ak +b$ $(mod$ $p))$ $(mod$ $M)$, az univerzális hasítás családja. Tapasztalat: $k$ egyenletesen hasít. + \end{itemize} + + \section*{Összehasonlító rendező algoritmusok} + + \subsection*{Buborékrendezés} + + A buborékrendezés az egyik legrégebbi ismert rendezés. Lényege az, hogy a maximális elemet cserékkel ,,felbuborékoltatjuk" a tömb végére, és így visszavezetjük a problémát egy 1-gyel rövidebb rendezési feladatra. A buborékoltatás úgy működik, hogy párosával (mintha egy két elem szélességű ablakot léptetnénk) haladunk végig az elemeken és a rossz sorrendben lévő párokat megcseréljük. Ezt az eljárást a \ref{fig:bubblesort_sample}. ábra szemlélteti. + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/bubblesort_sample.png} + \caption{A buborékrendezés működése} + \label{fig:bubblesort_sample} + \end{figure} + + Belátható, hogy így a legnagyobb elem eljut egészen a tömb végéig. (Ha több maximális elem is van a tömbben, akkor közülük a jobboldali jut el a tömb végére, mert egy egyenlő elempár esetén nem hajtunk végre cserét.) A második felbuborékoltatásnál már a tömb utolsó elemét nem kell figyelembe vennünk, hiszen tudjuk, hogy az jó helyen van.\\ + + Indukcióval látható, hogy a k-adik felbuborékoltatáskor az utolsó $k-1$ elem a tömb jobb szélén helyezkedik el, rendezve.\\ + + A rendezés algoritmusa a \ref{fig:bubblesort}. ábrán látható. (A működés leírásában saját ciklusszervezést használtunk.) + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/bubblesort.png} + \caption{A buborékrendezés algoritmusa} + \label{fig:bubblesort} + \end{figure} + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n^2)$ + \item Átlagos eset: $\Theta(n^2)$ + \end{itemize} + + \subsection*{Beszúró rendezés} + + A beszúró rendezés sok esetben a leggyorsabb négyzetes rendezés. Működése hasonló ahhoz, mint amikor lapjainkat rendezzük egy kártyajáték során. A rendezés fő lépése az, hogy az asztalon lévő rendezetlen saját pakliból elvesszük a felső lapot és beszúrjuk a kezünkben tartott rendezett lapok közé. Kezdetben a rendezett rész az első felvett lapból áll, majd $n - 1$ beszúrás után lapjainkat már rendezett módon tartjuk a kezünkben. + + A beszúró rendezés még nem említett előnye az, hogy nem csak tömbben tárolt elemek rendezésére alkalmas, hanem a láncolt listákra is könnyen alkalmazható. + + \subsubsection*{Tömbös megvalósítás} + + A tömbben tárolt adatok rendezésére alkalmazott beszúró rendezés működését, egy-egy jellemző lépés megjelenítésével a \ref{fig:insertsort_sample}. ábra szemlélteti. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/insertsort_sample} + \caption{A beszúró rendezés működése tömbös megvalósítás esetén} + \label{fig:insertsort_sample} + \end{figure} + + Tömbös megvalósítás esetén a rendezett részt a tömb elején tároljuk, a rendezetlent pedig utána. Kezdetben csak a tömb első eleme rendezett. Minden iterációban a következőnek beszúrandó elemet elmentjük egy $w$ változóba, majd az eddig rendezett rész nála nagyobb elemeit jobbra csúsztatjuk egy pozícióval.\\ + + A megfelelő számú léptetés után felszabadul a félretett beszúrandó elem számára a megfelelő hely. Ezután a beszúrandó elemet $w$-ből bemásoljuk a megfelelő helyre. A teljes algoritmus a \ref{fig:insertsort}. ábrán látható. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/insertionsort.png} + \caption{A beszúró rendezés algoritmusa tömbös megvalósítás esetén} + \label{fig:insertsort} + \end{figure} + + Algoritmusunk egy külső és egy belső ciklusból áll. A külső ciklus beszúrásonként lép egyet, míg a belső ciklus a beszúrás közbeni jobbra másolásokért felelős. A külső ciklus addig halad, amíg minden elemet be nem illesztettünk a helyére, a belső pedig addig, amíg meg nem találtuk az aktuálisan beszúrandó elem helyét.\\ + + A külső ciklus mindig $n-1$ alkalommal fut le, hiszen ennyi elemet kell beszúrnunk a rendezett részbe, ahhoz hogy az egész tömb rendezve legyen.\\ + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n^2)$ + \item Átlagos eset: $\Theta(n^2)$ + \end{itemize} + + \subsection*{Versenyrendezés} + + \noindent A versenyrendezés a versenyfa (tournament) adatszerkezetet használja. A versenyfa olyan teljes bináris fa, amelynek a leveleiben helyezkednek el a rendezendő elemek. Szintfolytonosan ábrázoljuk tömbösen. A \ref{fig:tournament_start}. ábrán egy kitöltött levelekkel rendelkező, de a belső pontjaiban még kitöltetlen versenyfát láthatunk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/tournament_start.png} + \caption{Versenyfa, leveleiben a rendezendő számokkal} + \label{fig:tournament_start} + \end{figure} + + \noindent A fa belső pontjait szintenként úgy töltjük ki, ahogyan egy kieséses verseny halad előre: minden belső pontban a gyerekei közül a nagyobbnak az értéke kerül (mint egy mérkőzés nyertese). Végül, a maximum (az abszolút győztes) a fa gyökerébe kerül. A kitöltött versenyfát a \ref{fig:tournament_fill1}. ábra szemlélteti, $n=8$ rendezendő szám esetére. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/tournament_fill1.png} + \caption{Kitöltött versenyfa} + \label{fig:tournament_fill1} + \end{figure} + + \noindent A rendezés egy speciális első menetet, majd azután még $(n – 1)$ egyszerűbb iterációs lépést hajt végre. Az első menetben – a versenyfa imént leírt kitöltésével – kiválasztjuk a legnagyobb elemet, amely \emph{felkerül} a fa gyökerébe. Vegyük hozzá ehhez még a legnagyobb elem kiírását is, a rendezés kimenetére. Ezt már a következő \ref{fig:tournament_max}. ábra tünteti fel. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/tournament_max.png} + \caption{Az első "újrajátszás" a győztes ágán} + \label{fig:tournament_max} + \end{figure} + + \noindent A versenyfa kitöltését követően kerül sor $(n – 1)$ egyszerűbb menetre, a következő legnagyobb elem kiválasztására. Példánkban ez $(8 – 1 = 7)$ iterációt jelent, amelyek közül az első kettő lépéseit mutatja be a \ref{fig:tournament_max}. és a \ref{fig:tournament_max2}. ábra.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/tournament_max2.png} + \caption{A második "újrajátszás" a következő győztes ágán} + \label{fig:tournament_max2} + \end{figure} + + \noindent Miután a gyökérben megjelenő legnagyobb elemet kiírtuk, \emph{lefelé} haladva megkeressük azt a levelet, amelyben eredetileg ez az érték helyet foglal. A levélben található értéket (mínusz végtelen)-re cseréljük, azaz egy abszolút vesztest teszünk a helyére. Utána \emph{felfelé} haladva ezen az ágon \emph{újrajátsszuk a mérkőzéseket}. Ezeket a lépéseket sorszámozott formában láthatjuk a \ref{fig:tournament_max}. ábrán.\\ + + \noindent Az újrajátszás eredményét már a következő \ref{fig:tournament_max2}. ábra tünteti fel. A második legnagyobb elem megjelent a gyökérben. Ez által azt is megtudjuk, hogy \emph{ki nyert volna, ha a győztes nem indult volna a versenyen}. Ezen az ábrán bejelöltük a második legnagyobb elem levélszintű helyének a megkeresését és az ezt követő újrajátszás útvonalát.\\ + + \noindent Így haladunk tovább, minden menetben a következő legnagyobb elemet megkeresve és kiírva. Mivel az elemeket csökkenő sorrendben vettük ki, az eljárás alkalmas a rendezés megvalósítására. + + \begin{figure}[H] + \centering + \includegraphics[width=0.32\textwidth]{img/tournamentsort.png} + \includegraphics[width=0.32\textwidth]{img/vtree_fill.png} + \includegraphics[width=0.32\textwidth]{img/vtree_max.png} + \caption{Versenyrendezés} + \end{figure} + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n \cdot log\ n)$ + \item Átlagos eset: $\Theta(n \cdot log\ n)$ + \end{itemize} + + \subsection*{Kupacrendezés} + + \noindent A kupacrendezés algoritmusa két fő részből áll. Az első részben felépíti az inputból a kupacot (KezdőKupac), a másodikban pedig visszaírja a kimenetbe a kupacból az elemeket. A kupac felépítése az elemek egyenkénti beszúrásával történik az Insert és a MoveUp kupacműveletek segítségével úgy, hogy minden lépésben megmaradjon a kupac-tulajdonság. A beszúrásokat addig folytatja, amíg a bemeneti tömb kiürül. A második lépésben a TakeOut és Süllyeszt műveletekkel kiírja az aktuális gyökérelemet a kimenetbe, a helyére beszúrja a legszélső levél tartalmát, és rendezi a kupacot. Addig ismétli ezt a lépést, amíg üres kupacot nem kapunk. + + \subsubsection*{Tömbös megvalósítás} + + \noindent Mivel programozásban egyszerűbb a kupac tömbös megvalósításával dolgozni, ezért a rendezést úgy hajtjuk végre, mintha egy szintfolytonos bejárással létrehozott tömbön végeznénk. Ebben a felfogásban első lépésként úgy rendezzük az inputot, hogy végig megyünk a tömbön, megvizsgáljuk az aktuális elem és a leszármazottjai viszonyát, és ahol nem teljesül a kupac tulajdonság, ott a nagyobbikkal megcseréljük (ez felel meg a Süllyeszt műveletnek). Addig folytatjuk a cseréket, amíg egy kupacnak megfeleltethető tömböt kapunk.\\ + + \noindent A második szakaszban a gyökérelem, vagyis az éppen aktuális maximum mindig a tömb elején fog elhelyezkedni, míg a jobb alsó elem a tömb még rendezetlen részének végén lesz. A gyökérelem kivétele és a jobb alsó elem beszúrása megfeleltethető a két elem cseréjének, ami után a tömb rendezetlen részének mérete eggyel csökken. Ha a beszúrt elem kisebb, mint a nagyobbik leszármazottja, akkor átrendezzük a tömböt úgy, hogy ismét megfeleljen a kupac definíciónak.\\ + + \noindent Az újrarendezés után ismét az első és a rendezetlen rész utolsó elemének cseréjével folytatódik az algoritmus. A rendezés akkor ér véget, ha a tömb rendezetlen részének mérete 1, vagyis a teljes tömb rendezve van. + + \subsubsection*{Kezdőkupac kialakítása} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort_createheap1.png} + \caption{Kezdőkupac kialakítása (1)} + \label{fig:heap_sort_createheap1} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort_createheap2.png} + \caption{Kezdőkupac kialakítása (2)} + \label{fig:heap_sort_createheap2} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort_createheap3.png} + \caption{Kezdőkupac kialakítása (3)} + \label{fig:heap_sort_createheap3} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort_createheap4.png} + \caption{Kezdőkupac kialakítása (4)} + \label{fig:heap_sort_createheap4} + \end{figure} + + \subsubsection*{A következő legnagyobb elem kiválasztása} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort_max.png} + \caption{A maximális elem kiválasztása, elhelyezése és a kupac tulajdonság helyreállítása} + \label{fig:heap_sort_max} + \end{figure} + + \subsubsection*{A kupacrendezés teljes eljárása} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort1.png} + \caption{A második legnagyobb elem kiválasztása} + \label{fig:heap_sort1} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort2.png} + \caption{A következő legnagyobb elem kiválasztása} + \label{fig:heap_sort2} + \end{figure} + + \begin{center} + $\cdots$ + \end{center} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort3.png} + \caption{Az utolsó előtti elem kiválasztása} + \label{fig:heap_sort3} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/heap_sort4.png} + \caption{Az utolsó elem kiválasztása, kész kupac} + \label{fig:heap_sort4} + \end{figure} + + \subsubsection*{Algoritmusok} + + \begin{figure}[H] + \centering + \includegraphics[width=0.32\textwidth]{img/heapsort_start.png} + \includegraphics[width=0.32\textwidth]{img/heapsort_pulldown.png} + \includegraphics[width=0.32\textwidth]{img/heapsort.png} + \caption{Kupacrendezés} + \end{figure} + + \noindent A kezdőkupac kialakításánál, és a ciklus közben a süllyesztés módja kicsit különbözik, hiszen az első esetben a változó elem süllyed le a teljes kupacon, a másodikban a gyökér süllyed az aktív kupacon. A képen látható algoritmus mindkét műveletet teljesíti. + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n \cdot log\ n)$ + \item Átlagos eset: $\Theta(n \cdot log\ n)$ + \end{itemize} + + \subsection*{Gyorsrendezés} + + \noindent Az algoritmus Az ,,oszd meg és uralkodj" elvet használja, azaz a problémát kisebb méretű, azonos problémákra bontja, amelyek rekurzívan megoldhatók, majd a megoldásokat egyesíti. Első lépéseként kiválasztunk egy tetszőleges főelemet, ez után a tömböt három részre particionáljuk úgy, hogy a kiválasztott főelemnél kisebb elemeket a főelem elé, a nála nem kisebbeket pedig mögé mozgatjuk. Az így kialakuló három résztömbön - amiket a főelem, a nála kisebb, valamint a nála nagyobb elemek alkotnak - újra futtatjuk a gyorsrendezést. Ez az algoritmus két fő részre bontható, az egyik maga a rekurzív rendezés, a másik pedig a particionálás. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/quicksort_sample.png} + \caption{A gyorsrendezés elve} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/quicksort.png} + \caption{Az algoritmus megvalósítása tömbre} + \end{figure} + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/quicksort_move.png} + \caption{Az egy elemet a helyére vivő eljárás} + \end{figure} + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n^2)$ + \item Átlagos eset: $\Theta(n \cdot log\ n)$ + \end{itemize} + + \subsection*{Összefésülő rendezés} + + \subsubsection*{Két rendezett sorozat összefésülése} + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/merge_sort_sample.png} + \caption{Két rendezett sorozat összefésülése} + \end{figure} + + \noindent Ez a rendezés két már rendezett tömböt fésül össze úgy, hogy a végeredmény is egy rendezett tömb legyen. Az összefésülés folyamata úgy zajlik, hogy mindkét tömb első elemét összehasonlítjuk, és a kisebbet beírjuk a kimeneti tömb első szabad helyére, majd abból a tömbből, amelyikből ez kikerült, vesszük a következő elemet, és újra elvégezzük az összehasonlítást. Ezt addig folytatjuk, amíg valamelyik kezdeti tömbből el nem fogynak az elemek. Végül másik tömb maradék elemeit is sorban hozzáírjuk az eredményhez, így alakul ki a végleges, rendezett kimeneti tömb. Az algoritmus az összefésülés előtt az inputot rekurzívan kettébontja addig, amíg végül csak rendezett résztömbök lesznek (ez általában az egy elemű résztömb), majd ezeken végzi el az összefésülést. Ezt alkalmazhatjuk felülről lefelé (rekurzív) vagy alulról felfelé (iteratív), ez utóbbit szekvenciális fájloknál.\\\\ + + \noindent Műveletigény: + \begin{itemize} + \item Legrosszabb eset: $\Theta(n \cdot log\ n)$ + \item Átlagos eset: $\Theta(n \cdot log\ n)$ + \end{itemize} + + \subsubsection*{Az összefésülő rendezés rekurzív algoritmusa} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/mergesort_alg1.png} + \caption{Összefésülő rendezés} + \end{figure} + + \section*{Az összehasonlításos rendezések műveletigényének alsó korlátjai} + + \subsection*{Műveletigény} + + Kijelöljük a domináns műveleteket, és az $n$ inputméret függvényében hányszor hajtódnak végre, ezt nézzük. Jelölés általánosan $T(n)$, de lehet konkrétan is, pl $Cs(n)$ [csere]. $mT(n)$ a minimális műveletigény, $MT(n)$ a maximális és $AT(n)$ az átlagos. + \begin{itemize} + \item[$\Theta$]: nagyságrendileg azonos, két konstans közé beszorítható + \item[$\mathcal{O}$]: nagyságrendi felső becslés, $o$: nincs megengedve az egyenlőség + \item[$\Omega$]: nagyságrendi alsó becslés, $\omega$: nincs megengedve az egyenlőség + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/functionsrelations.png} + \caption{A függvényosztályok egymáshoz való viszonya} + \end{figure} + + \noindent Aszimptotikus (nagyságrendi) alsó korlátot akarunk adni az összehasonlításokat használó rendező eljárások lépésszámára. Azt akarjuk belátni, hogy egy $n$ méretű input rendezése nagyságrendben legalább $n log n$ összehasonlítást igényel. Ez igaz minden eddig és még nem létező összehasonlításos rendező algoritmusra. + + \subsubsection*{Döntési fa} + + \noindent A döntési fa elkészíthető minden algoritmushoz és annak adott $n$ méretű összes bemenő adatához, feltéve, hogy ezek az adatok felsorolhatók és számuk meghatározható. A rendező eljárásokra ez teljesül, hiszen bemenő adatoknak tekinthetjük az $1,\ 2, \ldots,\ n$ számok permutációit, amelyek $n!$ száma közismert.\\ + + \noindent A döntési fa belső pontjaiban tartalmazza az algoritmus által feltett összes igen/nem kimenetelű kérdést, minden lehetséges n méretű bemenő adatra. (Az algoritmus ciklusai az adott n méretű bemenetre történő végrehajtás során egymás utáni lépések szekvenciájává egyenesednek ki, így iteratív vezérlési szerkezetet nem kell megjelenítenünk a fában.) Az esetleges értékadásokat sem helyezzük el a döntési fában. A kérdésekre adott válaszok információtartalmát – az értékadások adattranszformáló hatásának figyelembevételével – minden bemenő adat útvonalán végig haladva fában összegyűjtjük, és a levelekbe írjuk. A döntési fában a levelek tartalma a megoldást fogalmazza meg az egyes inputokra.\\ + + \noindent A \ref{fig:decisiontree_sample}. ábrán látható $t_{R}(3)$ döntési fa egy olyan algoritmus működését szemlélteti, amelyet speciálisan három elem rendezésére terveztünk. Az R eljárás az $s1,\ s2,\ s3$ elemek összehasonlítását végzi minden lehetséges input sorrendre. A kérdésekre adott válaszokból meghatározható az elemek nagyság szerint rendezett sorrendje. Ehhez kettő vagy három kérdés szükséges. (Ebben a kis eljárásban értékadások nem szerepelnek.) + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/decisiontree_sample.png} + \caption{Az R rendező algoritmus $t_{R}(3)$ döntési fája 3 elemű sorozatokra} + \label{fig:decisiontree_sample} + \end{figure} +\newpage + \noindent \textbf{Lemma}: Bármely $R$ összehasonlító rendező eljárás $t_{R}(n)$ döntési fájának $h(t_{R}(n))$ magassága és az $n$ elemszám között fennáll a következő összefüggés: + \[ + h(t_{R}(n)) \geq log_{2}n + \] + + \subsubsection*{Alsó korlát az összehasonlítások számára a legkedvezőtlenebb esetben} + + \noindent \textbf{T:} Bármely $R$ összehasonlításos rendező eljárás a legkedvezőtlenebb bemenő adata rendezése során nagyságrendben legalább ($n\ \log\ n$) összehasonlítást végez, azaz + \[ + \text{MÖ}_{R}(n) = \Omega(n\ \log\ n) + \] + + \subsubsection*{Alsó korlát az összehasonlítások számára átlagos esetben} + + \noindent \textbf{Lemma:} Az azonos számú levelet tartalmazó tökéletes fák közül levélmagasság összeg azokra a legkisebb, amelyek egyben majdnem teljes bináris fák.\\ + + \noindent \textbf{T:} Bármely $R$ összehasonlítás alapú rendező eljárás átlagosan nagyságrendben legalább $n\ log\ n$ összehasonlítást végez az összes lehetséges bemenő sorozat rendezése során: + \[ + \text{AÖ}_{R}(n) = \Omega(n\ \log\ n) + \] + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore.jpg new file mode 100644 index 0000000..fe287c6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_initshift.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_initshift.jpg new file mode 100644 index 0000000..d2a962f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_initshift.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift1.png new file mode 100644 index 0000000..66b94ac Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift2.png new file mode 100644 index 0000000..514f401 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/BoyerMoore_shift2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Huffman_fa.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Huffman_fa.png new file mode 100644 index 0000000..682a93c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Huffman_fa.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP.jpg new file mode 100644 index 0000000..c4ca0bc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_algo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_algo.png new file mode 100644 index 0000000..cc457fa Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_algo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_init_next.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_init_next.png new file mode 100644 index 0000000..a63b538 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_init_next.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_initnext.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_initnext.jpg new file mode 100644 index 0000000..9a7da44 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_initnext.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_sample.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_sample.png new file mode 100644 index 0000000..80cf80a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/KMP_sample.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_Init_Shift.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_Init_Shift.png new file mode 100644 index 0000000..bf4190a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_Init_Shift.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_algo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_algo.png new file mode 100644 index 0000000..b7ddd62 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/QS_algo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK.jpg new file mode 100644 index 0000000..f913a3e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK_Horner.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK_Horner.jpg new file mode 100644 index 0000000..e36aaab Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/RK_Horner.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Rabin_Krap_algo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Rabin_Krap_algo.png new file mode 100644 index 0000000..9d16254 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/Rabin_Krap_algo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/bruteforce.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/bruteforce.png new file mode 100644 index 0000000..cb73518 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/bruteforce.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_1.png new file mode 100644 index 0000000..3a41bfd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_2.png new file mode 100644 index 0000000..6d45056 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_3.png new file mode 100644 index 0000000..0820c73 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_4.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_4.png new file mode 100644 index 0000000..3d28f2d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/melysegi_4.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.jpg new file mode 100644 index 0000000..7daa76c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.png new file mode 100644 index 0000000..6245119 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/img/spanning_tree.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.pdf new file mode 100644 index 0000000..9e7de09 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.tex new file mode 100644 index 0000000..c456ebc --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/14.Haladó algoritmusok/tetel14.tex @@ -0,0 +1,928 @@ +\documentclass[margin=0px]{article} + +\usepackage{listings} +\usepackage[utf8]{inputenc} +\usepackage{graphicx} +\usepackage{float} +\usepackage[magyar]{babel} +\usepackage[a4paper, margin=1in]{geometry} +\usepackage{subcaption} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{fancyhdr} +\usepackage[thinlines]{easytable} +\usepackage{hhline} +\usepackage{multirow} +\usepackage[table,xcdraw]{xcolor} +\usepackage[normalem]{ulem} +\usepackage{makecell} +\usepackage{enumitem} +\usepackage{xcolor} +\usepackage[export]{adjustbox} +\usepackage{ifthen} +\usepackage{pgf,tikz} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata} + +\usepackage{geometry} + \geometry{ + a4paper, + total={170mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} +\renewcommand{\baselinestretch}{1.15} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\definecolor{mygray}{rgb}{0.0, 0.0, 0.0} +\definecolor{blue(pigment)}{rgb}{0.2, 0.2, 0.6} +\definecolor{brickred}{rgb}{0.8, 0.25, 0.33} +\definecolor{coolblack}{rgb}{0.0, 0.18, 0.39} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\bullet$} + +\date{} +\useunder{\uline}{\ul}{} +\fancyhf{} % sets both header and footer to nothing + \lfoot{ELTE-IK} + \cfoot{\thepage} + \rfoot{14. tétel } + +\pagestyle{fancy} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + + +\tikzstyle{pointer}=[fill=black, circle, minimum width = 3pt, inner sep=0] +\tikzstyle{link}=[>=stealth] +\tikzstyle{array}=[draw, fill=green!40, minimum width = 7mm, minimum height = 7mm] +\tikzstyle{list_node_horizontal}=[draw, rectangle split, rectangle split parts=2, rectangle split horizontal, + rounded corners=2pt,minimum height=5mm, minimum width=10mm, node distance=5mm,fill=red!35] +\tikzstyle{nil}=[draw, rectangle,minimum height=4mm, minimum width=4mm, node distance=5mm] + +\tikzset{ +node of list/.style = { + draw, + minimum height=6mm, + minimum width=6mm, + node distance=6mm + }, +link/.style = { + -stealth, + shorten >=1pt + }, +array element/.style = { + draw, fill=white, + minimum width = 6mm, + minimum height = 10mm + }, +} + +\def\LinkedList#1{% + \foreach \element [count=\xi] in \list { + \node[node of list, right = of aux, name=ele] {\element}; + \node[node of list, name=aux2, anchor=west] at ([xshift=-.4pt] ele.east) {}; + \draw[link] (aux) -- (ele); + \coordinate (aux) at (aux2); + } + \ifthenelse{\xi > 0}{ + \node[nil, right = of aux, name=elenil] {}; + \draw (elenil.north east) -- (elenil.south west); + \draw (elenil.north west) -- (elenil.south east); + \draw[link] (aux) -- (elenil); + } +} + +\def\Adjacencylist#1{% + % Draw Adjacency List + \foreach [count=\js] \element in \adlist { + % a counter the refers to the previous node + \prevnode=\j + \advance\prevnode by -1 + % draw the node from the list with a pointer + \node[list_node_horizontal,right = of node\the\prevnode] (node\js) {\element}; + \path[-] let \p1 = (node\j.two), \p2 = (node\j.center) in + node[pointer] (rightpointer\js) at (\x1+2,\y2){}; + %draw incomming link from previous node + \draw[link,->] (rightpointer\the\prevnode) edge (node\js); + } + \node[nil, right = of rightpointer\js] (rightnil) {}; + \draw (rightnil.north east) -- (rightnil.south west); + \draw (rightnil.north west) -- (rightnil.south east); + % Draw edge to nil pointer node + \path [link,->] (rightpointer\js) edge (rightnil); +} +\newcount\prevnode + +\begin{document} + \begin{center} + {\Large\bfseries\noindent 14. Haladó algoritmusok} \\ + \end{center} + + \section*{Gráfalgoritmusok} + + \subsection*{Gráf ábrázolás} + + Legyen a továbbiakban $G = (V, E)$ gráf, ahol + \begin{itemize} + \item $V$ a csúcsok halmaza ($|V| = n$), + \item $E$ pedig a csúcsok közti élek halmaza. + \end{itemize} + + \paragraph*{Éllistás ábrázolás\\\\} + + \noindent Legyen $G$ véges gráf. Vegyünk fel egy mutatókat tartalmazó $Adj[1...n]$ tömböt (a csúcsokkal indexeljük a tömböt). A tömbben lévő mutatók mutatnak az éllistákra (más néven a szomszédsági listákra). Az éllisták lehetnek egy- vagy kétirányú, fejelemes vagy fejelem nélküli listák, ez most nem lényeges a gráf szempontjából. + \begin{itemize} + \item Irányított gráf esetén, az éllisták listaelemei reprezentálják az éleket. Az élnek megfelelő listaelemet abban a listában tároljuk, amelyik csúcsból kiindul az él, és a célcsúcs indexét eltároljuk a listaelemben. Tehát az él megvalósítása az $i$-edik listában egy olyan listaelem, amelyben eltároltuk $j$-t, mint az él célcsúcsát. + + \[ + \begin{tikzpicture}[>={Stealth[black]}, + every node/.style={circle,thick,draw}, + every edge/.style={draw=red,very thick}] + %Nodes + \node (1) at (0,0) {1}; + \node (2) at (2,0) {2}; + \node (3) at (0,-2) {3}; + \node (4) at (2,-2) {4}; + \node (5) at (4,-1) {5}; + + %Lines + \draw[->] (1) -- (2); + \draw[->] (1) -- (3); + \draw[->] (2) -- (5); + \draw[->] (2) -- (3); + \draw[->] (2) -- (4); + \draw[->] (3) -- (4); + \draw[->] (5) -- (4); + \end{tikzpicture} + \quad + % Define graph as a list of pairs, where each pair consists of a node, the delimiter "/" and the set of adjacent nodes. + \newcommand{\inputgrapha}{1/{2,3}, 2/{3,4,5}, 3/{4}, 4/{}, 5/{4}} + \begin{tikzpicture} + \foreach [count=\i] \index/\list in \inputgrapha { + \node[array element] (aux) at (0,-\i) {\index}; + \LinkedList{\list} + } + \end{tikzpicture} + \] + + \item Irányítatlan gráf esetén, egy élnek két listaelemet feleltetünk meg, azaz egy irányított élt egy oda-vissza mutató, irányított élpárral valósítunk meg a korábban említett módon. Élsúlyozott gráf esetén, az él súlyát is a listaelemben fogjuk tárolni. + + \[ + \begin{tikzpicture}[>={Stealth[black]}, + every node/.style={circle,thick,draw}, + every edge/.style={draw=red,very thick}] + %Nodes + \node (1) at (0,0) {1}; + \node (2) at (2,0) {2}; + \node (3) at (0,-2) {3}; + \node (4) at (2,-2) {4}; + \node (5) at (4,-1) {5}; + + %Lines + \draw[-] (1) -- (2); + \draw[-] (1) -- (3); + \draw[-] (2) -- (5); + \draw[-] (2) -- (3); + \draw[-] (2) -- (4); + \draw[-] (3) -- (4); + \draw[-] (5) -- (4); + \end{tikzpicture} + \qquad + % Define graph as a list of pairs, where each pair consists of a node, the delimiter "/" and the set of adjacent nodes. + \newcommand{\inputgraphb}{1/{2,3}, 2/{3,4,1,5}, 3/{1,2,4}, 4/{3,2,5}, 5/{2,4}} + % Define graph as a list of pairs, where each pair consists of a node, the delimiter "/" and the set of adjacent nodes. + \begin{tikzpicture} + \foreach [count=\i] \index/\list in \inputgraphb { + \node[array element] (aux) at (0,-\i) {\index}; + \LinkedList{\list} + } + \end{tikzpicture} + \] + + \end{itemize} + + \noindent Az éllistás ábrázolás helyfoglalása irányítatlan gráfok esetén a csúcsok számával (Adj tömb), illetve az élek számával (éllista-elemek száma) arányos. Az elfoglalt memória méretének nagyságrendje ($n + e$). Irányított gráfok esetén az élek számának duplájával kell számolnunk, így ($n + 2e$)-vel arányos helyfoglaláshoz jutunk. + + \noindent Mivel a memóriaigény az élek számával arányos, ezért az éllistás ábrázolást ritka, illetve nem-sűrű (mondhatnánk 'normál') gráfok ($e \ll n^2$) esetén szokták használni, ugyanis sűrű gráf esetén a szomszédsági mátrixhoz képest itt jelentkezik a listák láncolásából származó helyfoglalás is, a mutatók tárolása révén. + + \paragraph*{Szomszédsági mátrix\\\\} + + \noindent Legyen $G = (V, E)$ véges gráf, és $n$ a csúcsok száma. Ekkor a gráfot egy $n \times n$-es mátrixban ábrázoljuk, ahol az oszlopokat és a sorokat rendre a csúcsokkal indexeljük (ez leggyakrabban $1,\ \ldots\ ,n$). Egy mezőben akkor van $1$-es, ha a hozzá tartozó oszlop által meghatározott csúcs szomszédja a sor által meghatározott csúcsnak. + \[ + C[i,j] = \left\{\begin{array}{lr} + 1, & \text{ha } (i, j) \in E\\ + 0, & \text{ha } (i, j) \not\in E\\ + \end{array}\right. + \] + Példa:\\\\ + {\footnotesize + \begin{tikzpicture}[>={Stealth[black]}, + every node/.style={circle,thick,draw}, + every edge/.style={draw=red,very thick}] + %Nodes + \node (1) at (0,0) {1}; + \node (2) at (2,0) {2}; + \node (3) at (0,-2) {3}; + \node (4) at (2,-2) {4}; + \node (5) at (4,-1) {5}; + + %Lines + \draw[->] (1) -- (2); + \draw[->] (1) -- (3); + \draw[->] (2) -- (5); + \draw[->] (2) -- (3); + \draw[->] (2) -- (4); + \draw[->] (3) -- (4); + \draw[->] (5) -- (4); + \end{tikzpicture} + $A^{5 \times 5} = \left[\begin{array}{ccccc} + 0 & 1 & 1 & 0 & 0 \\ + 0 & 0 & 1 & 1 & 1 \\ + 0 & 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 1 & 0 + \end{array}\right]^{5 \times 5} \Leftrightarrow \left[\begin{array}{ccccc} + \cdot & 1 \rightarrow 2 & 1 \rightarrow 3 & \cdot & \cdot \\ + \cdot & \cdot & 2 \rightarrow 3 & 2 \rightarrow 4 & 2 \rightarrow 5 \\ + \cdot & \cdot & \cdot & 3 \rightarrow 4 & \cdot \\ + \cdot & \cdot & \cdot & \cdot & \cdot \\ + \cdot & \cdot & \cdot & 5 \rightarrow 4 & \cdot + \end{array}\right]^{5 \times 5}$ + }\\ + + \noindent Ha súlyozott a gráf, akkor az élsúlyokat (élköltségeket) is el kell tárolni. Ezt is a mátrixon belül oldjuk meg. A súly valós számokat vehet fel. Természetesen adódik, hogy ahol előzőleg 1-est írtunk, azaz létezett az illető él, oda most írjuk be az él költségét.\\ + + \noindent Két további eset maradt, a mátrix főátlója, és az olyan mezők, amelyek esetén nem létezik él. Vezessük be a végtelen ($\infty$) élsúlyt, és a nem létező élek esetén a mátrix megfelelő helyére írjunk $\infty$-t. Egy ilyen "élen" csak végtelen nagy költséggel tudunk végighaladni (tehát nem tudunk).\\ + + \noindent A mátrix főátlójába kerülnének a hurokélek költségei, de ilyen értékeket nem alkalmazunk, mivel a legtöbb gyakorlati probléma leírására alkalmas egyszerű gráfokra korlátozzuk. Az egyszerű gráfok nem tartalmaznak hurokéleket (valamint többszörös éleket sem).\\ + + \noindent Élsúlyozott gráf esetén a szomszédsági mátrix kitöltését a következő megállapodás szerint végezzük: + \[ + C[i,j] = \left\{\begin{array}{lr} + 0, & \text{ha } i = j\\ + c(i, j), & \text{ha } (i, j) \in E\\ + \infty, & \text{ha } (i, j) \not\in E\\ + \end{array}\right. + \] + + \noindent A mátrixos ábrázolás helyfoglalása mindig ugyanakkora, független az élek számától, a mátrix méretével $n^2$-tel arányos. (Az $n$ pontú teljes gráfnak is ekkora a helyfoglalása.) A mátrixos reprezentációt sűrű gráfok esetén érdemes használni, hogy ne legyen túl nagy a helypazarlás. + + \subsection*{Szélességi bejárás} + + A $G$ gráf (irányított/irányítatlan) $s$ startcsúcsából a távolság sorrendjében érjük el a csúcsokat. A legrövidebb utak feszítőfáját adja meg, így csak a távolság számít, a súly nem. A nyilvántartott csúcsokat egy sor adatszerkezetben tároljuk, az aktuális csúcs gyerekeit a sorba tesszük. A következő csúcs pedig a sor legelső eleme lesz. A csúcsok távolságát egy $d$, szüleiket egy $\pi$ tömbbe írjuk, és $\infty$ illetve $0$ értékekkel inicializáljuk. + + \noindent Az algoritmus: + \begin{enumerate} + \item Az $s$ startcsúcsot betesszük a sorba + \item A következő lépéseket addig ismételjük, míg a sor üres nem lesz + \begin{itemize} + \item Kivesszük a sor legelső ($u$) elemét + \item Azokat a gyerekcsúcsokat, melyeknek a távolsága nem $\infty$ figyelmen kívül hagyjuk (ezeken már jártunk) + \item A többi gyerekre ($v$): beállítjuk a szülőjét ($\pi[v] = u$), a távolságát ($d[v] = d[u]+1$), majd berakjuk a sorba. + \end{itemize} + \end{enumerate} + + \subsection*{Minimális költségű utak keresése} + + \paragraph*{Dijkstra algoritmus\\\\} + + \noindent Egy $G$ irányított, pozitív élsúlyokkal rendelkező gráfban keres $s$ startcsúcsból minimális költségű utakat minden csúcshoz.\\ + + \noindent Az algoritmus a szélességi bejárás módosított változata. Mivel itt egy hosszabb útnak lehet kisebb a költsége, mint egy rövidebbnek, egy már megtalált csúcsot nem szabad figyelmen kívül hagyni. Ezért minden csúcs rendelkezik három állapottal (nem elért, elért, kész). A $d$ és $\pi$ tömböket a szélességi bejáráshoz hasonlóan kezeljük.\\ + + \noindent A még nem kész csúcsokat egy prioritásos sorba helyezzük, vagy minden esetben minimumkeresést alkalmazunk.\\ + + \noindent Az algoritmus: + \begin{enumerate} + \item Az $s$ startcsúcs súlyát 0-ra állítjuk eltároljuk + \item A többi csúcs súlyát $\infty$-re állítjuk + \item A következő lépéseket addig ismételjük, míg a konténerünk üres nem lesz + \begin{itemize} + \item Kivesszük a sor legjobb ($u$) elemét, és "kész"-re állítjuk + \item Ha egy gyerekcsúcs ($v$) nem kész, és a jelenleg hozzávezető út súlya kisebb, mint az eddigi, akkor:\\ + a szülőjét $u$-ra állítjuk ($\pi[v] = u$), és a súlyát frissítjük ($d[v] = d[u]+d(u,v)$). + \item A többi csúcsot kihagyjuk. + \end{itemize} + \end{enumerate} + + \paragraph*{A minimális költségű utak problémája (negatív élekkel)\\\\} + + \noindent A kezdőcsúcsból elérhető negatív összköltségű körön nem léteznének legkisebb költségű utak, mivel az illető körön tetszőlegesen sokszor végig menve az utak költsége mindig tovább csökkenthető lenne.\\ + + \noindent Irányítatlan gráf esetén, egy $(u,v)$ negatív súlyú irányítatlan élen oda-vissza haladva az út költsége szintén korlátlanul csökkenthető lenne, azaz úgy viselkedne, mint egy negatív összköltségű kör. Tekintsük az irányítás nélküli élte tehát negatív összköltségű, két élből álló irányított körnek. Ez egybevág az ábrázolás szintjén megvalósított irányítatlan gráffal, ahol egy irányítatlan élt, egy oda-vissza irányított élpárral valósítunk meg. Tehát irányítatlan gráf esetén a megszorításunk az, hogy egyáltalán ne tartalmazzon negatív súlyú élt, mert az negatív irányított körnek tekinthető. + + \paragraph*{Bellman-Ford algoritmus\\\\} + + \noindent Minden csúcsra, ha létezik legrövidebb út, akkor létezik egyszerű legrövidebb út is, mivel a körök összköltsége nem negatív, így a kört elhagyva az út költsége nem nőhet. Egy n pontú gráfban, a legnagyobb élszámú egyszerű út hossza legfeljebb n - 1 lehet.\\ + + \noindent A Bellman-Ford-algoritmus a Dijkstra algoritmusnál megismert közelítés műveletét végzi, azaz egy csúcson át a szomszédba vezető él mentén vizsgálja, hogy az illető él része-e a legrövidebb útnak, javító él-e. Egy menetben az összes élre megvizsgálja, hogy javító él-e vagy sem. Összesen n - 1 menetet végez.\\ + + + \noindent Vizsgáljunk meg egy $p^* = s \rightsquigarrow u$ legrövidebb utat. Minden menetben a $p^*$ minden élén végzünk közelítést. Legyen $v \rightarrow w$ él része $p^*$-nak. Miután $p^*$ v-ig tartó részútja $p^*_{v}$ ismertté válik, a következő menetben a $p^*_{v}$ is ismert lesz, mivel az $(v,w)$ éllel is végzünk közelítést. Azonban az élek feldolgozásának (közelítésének) sorrendjére nem tettünk semmilyen megkötést, így csak azt tudjuk garantálni, hogy az első lépés után az 1 élszámú legrövidebb utak, a második lépés után a 2 élszámú legrövidebb utak, és így tovább, válnak ismerté. Mivel a leghosszabb egyszerű út $n - 1$ élszámú, ezért szükséges lehet az $n - 1$ menet.\\ + + \noindent Egy $G$ élsúlyozott (akár negatív) irányított gráf $s$ startcsúcsából keres minden élhez minimális költségű utakat, illetve felismeri, ha negatív költségű kör van a gráfban. A $d$ és $\pi$ tömböket az előzőekhez hasonlóan kezeljük.\\ + + Az algoritmus: + \begin{enumerate} + \item A startcsúcs súlyát állítsuk be 0-ra. + \item $n-1$ iterációban menjünk végig az összes csúcson, és minden csúcsot ($u$) vessünk össze minden csúccsal ($v$). Ha olcsóbb utat találtunk akkor $v$-be felülírjuk a súlyát ($d[v] = d[u]+d(u,v)$), és a szülőjét ($\pi[v] = u$). + \item Ha az $n$-edik iterációban is történt módosítás, negatív kör van a gráfban + \end{enumerate} + + \subsection*{Minimális költségű feszítőfa keresése} + + \noindent A probléma megjelenése egy időszakban, a villamosítás éveiben elég gyakori volt. Ha egy terület villamosítását kell megoldani a lehető legkisebb költséggel, akkor a feladat minimális összköltségű vezetékrendszer tervezése megadott helységek között.\\ + + \noindent A modellünk legyen irányítás nélküli, súlyozott gráf, ahol a városoknak megfeleltetjük a gráf pontjait, az éleknek pedig a tervezett, két várost összekötő villamos vezetéket. Az élek irányítás nélküliek az elektromos áram irányítatlan tulajdonsága miatt, és súlyozottak, ahol az élek költségei legyenek a becsült építési költségek.\\ + + \noindent Legyen $G(V, E)$ irányítatlan gráf. + \begin{itemize} + \item Részgráf: A $G' = (V', E')$ gráf, G \textbf{\emph{részgráfja}}, ha $V' \subseteq V$ és $E' \subseteq E$ és $\forall (u, v) \in E': u, v \in V'$. + \item Feszítőfa: $F = (V, E')$ összeföggő, körmentes irányítatlangráfot G \textbf{\emph{feszítőfájának}} nevezzük.\\ + (F és G csúcshalmaza azonos) + \item Minimális feszítőfa: $F = (V, E')$ feszítőfa minimális, ha G feszítőfái között az élek költsége + \[c(H) = \sum\limits_{(u,v) \in E'}c(u,v)\] + minimális, azaz + \[ + C(F) = \left\{c(H)\ \big|\ \text{\emph{H} feszítőfája \emph{G}-nek}\right\} + \] + \end{itemize} + + \paragraph*{Prim-algoritmus\\\\} + + \noindent Egy speciális piros-kék algoritmus, amely minden lépésben a kék szabályt alkalmazza.\\ + + \noindent \textbf{\emph{Kék szabály}}: Válasszunk ki egy olyan $\emptyset \neq X \subset V$ csúcshalmazt, amiből nem vezet ki kék él. \\ + Ez után egy legkisebb súlyú $X$-ből kimenő szintelen élt fessünk kékre.\\ + + \noindent Az algoritmus: + \begin{itemize} + \item Válasszuk ki a gráf egy tetszőleges csúcsát, legyen ez egy egy csúcsú fa. (kezdő X) + \item Ameddig van a gráfnak olyan csúcsa, amelyik nincs benne a fában, végezzük el a következőket: + \begin{itemize} + \item Válasszuk ki a fa csúcsai és a gráf többi csúcsa között futó élek közül a legkisebb súlyút.\\ + $min\left\{(u, v) \in E\Big|\ u \in X,\ v \not \in X,\ (u, v) \not \in X\right\}$ + \item A kiválasztott él nem fabeli csúcsát tegyük át a fába az éllel együtt. (kékre festés) + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/spanning_tree.jpg} + \caption{Prim algoritmus} + \label{fig:Prim_sample} + \end{figure} + + \subsection*{Mélységi bejárás} + + \noindent A mélységi bejárás kidolgozása felé lépve, megkülönböztetjük a csúcsok státuszát. Erre több, szemléletében különböző módszerrel találkozhatunk, amelyek végső ugyanazt a célt érik el. Itt a színezés eszközével élünk és három színt használunk. Attól függően színezzük a csúcsokat, hogy az illető csúcsot illetően a bejárás milyen fázisban van.\\ + + \noindent Egy csúcs legyen fehér, ha még nem jutottunk el hozzá a bejárás során (kezdetben minden csúcs fehér).\\ + \noindent Egy csúcs legyen szürke, ha a bejárás során már elértük a csúcsot, de még nem állíthatjuk, hogy az illető csúcsból elérhető összes csúcsot meglátogattuk.\\ + \noindent A csúcs legyen fekete, ha azt mondhatjuk, hogy az illető csúcsból elérhető összes csúcsot már meglátogattuk és visszamehetünk (vagy már visszamentünk) az idevezető út megelőző csúcsára\\ + + \noindent A bejárás során tároljuk el, hogy egy csúcsot hányadikként értünk el, azaz hányadikként lett szürke és tároljuk el azt is, hogy hányadikként fejeztük be a csúcs, és a belőle elérhető csúcsok bejárását, azaz a csúcs hányadikként lett fekete. Az említett számokat nevezzük mélységi, illetve befejezési számnak, amelyeket az ábrákon a csúcsok címkéi alatt jelenítünk meg. (Alternatív szóhasználat: belépési, illetve kilépési számok.) Utalunk arra, hogy ezeknek a számoknak lényeges szerep jut majd az élek osztályozásánál.\\ + + \noindent A következő ábrákon egy gráf mélységi bejárása látható. A példában szereplő gráfon a csúcsokból kimenő élek feldolgozási sorrendje legyen a rákövetkező csúcsok címkéje szerint növekedően, vagyis alfabetikusan rendezett (például a láncolt ábrázolásnál az éllista a csúcsok címkéje szerint rendezett).\\ + + Nézzük az első ábrát, amelyben a kezdőcsúcs legyen az 1-es csúcs. Legyen kezdetben minden csúcs fehér, és a mélységi és befejezési számuk is legyen az extremális 0. A kezdőcsúcsot érjük el elsőként, tehát színezzük szürkére, és a mélységi számát állítsuk be 1-re.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/melysegi_1.png} + \label{fig:melysegi_pelda_1} + \end{figure} + + \noindent Az 1-es csúcsból három él vezet ki, de a kikötöttük, hogy az élek feldolgozási sorrendje legyen a szomszéd csúcsok címkéje szerint növekedően rendezett. Ekkor a 2-es csúcsot érjük el másodikként. Ezután harmadikként a 4-es csúcs, majd negyedikként a 8-as csúcs következik. Mivel a 8-as csúcsnak egyáltalán nincs szomszédja, bejárását befejeztük és a csúcsot feketére színezzük. Mivel a bejárás során a 8-as csúcs lett elsőként fekete, a befejezési száma 1-es lesz. + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/melysegi_2.png} + \label{fig:melysegi_pelda_2} + \end{figure} + + \noindent A bejárás során eddig megtett utunk $<1,2,4,8>$. Most menjünk vissza az utolsó előtti 4-es csúcsra. Mivel a 4-es csúcsnak sincs meg nem látogatott szomszédja, így ennek csúcs bejárását is befejeztük; színezzük a csúcsot feketére, és a bejárási számát állítsuk 2-re.\\ + Menjünk vissza a 2-es csúcshoz. A 2-es csúcsnak két olyan szomszédja is van, amelyet még nem látogattunk meg. Lépjünk a kisebb címkéjű csúcsba.\\ + Az 5-ös csúcs bejárását harmadikként fejezzük be. A 2-es csúcsból a bejárást a 6-os csúcs irányába folytatjuk.\\ + Tovább haladva, hetedikként elérjük a 9-es csúcsot. Nyolcadikként következik a 7-es csúcs. Mivel a 3-as csúcs még fehér, azt érjük el kilencedikként + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/melysegi_3.png} + \label{fig:melysegi_pelda_3} + \end{figure} + + \noindent A 3-as csúcsból a 6-os csúcsba vezet él, azonban a 6-os csúcsot már bejártuk, a színe már nem fehér, erre már nem folytatjuk a bejárást. \\ + Mivel a 3-as csúcsból már nem vezet él fehér csúcsba, így a 3-as csúcs bejárását is befejeztük.\\ + Visszamegyünk a 7-es csúcsba, ahol a sorrendben következő él, a $(7,8)$ mentén látjuk, hogy a 8-as csúcs színe már fekete. Mivel a 7-es csúcsnak nincs fehér szomszédja, így ötödikként befejeztük a bejárását.\\ + A 9-es csúcsnak a bejárását is befejeztük. Az úton ismét egy csúccsal visszamegyünk és befejezzük a 6-os csúcsot.\\ + A 2-es csúcsra lépve, látható, hogy minden kimenő éle mentén már próbálkoztunk, így nyolcadikként azt is elhagyjuk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/melysegi_4.png} + \label{fig:melysegi_pelda_4} + \end{figure} + + +% \noindent Legyen $G = (V,E)$ irányított vagy irányítatlan véges gráf, ahol $V = \{1, 2, \ldots, n\}$.\\ +% Továbbá, definiáljuk az alábbi tömböket: +% \begin{itemize} +% \item szín[1...n]: az ADS szintű színezés megvalósítására +% \item mszám[1...n] és bszám[1...n]: mélységi és befejezési számok +% \item $\pi[1\ldots n]$: a bejárás során, egy csúcs megelőző csúcsának a nyilvántartására. +% \end{itemize} + + \paragraph*{A mélységi bejárás algoritmusa\\\\} + + \noindent Az előző példában úgy kezdtük a bejárást, hogy kijelöltünk egy kezdőcsúcsot, amelyből kiindulva történetesen az összes csúcs elérhető volt mélységi bejárással. Egy másik példában előfordulhatna, hogy lennének olyan csúcsok, amelyeket egyáltalán nem tudnánk elérni egy kiválasztott startcsúcsból. A későbbi alkalmazások érdekében a mélységi bejárást úgy definiáljuk, hogy az a gráf minden pontjához eljusson.\\ + + \noindent Az algoritmus működésének nem feltétele egy kezdőcsúcs megadása, azt az eljárás keretében magunk tetszőlegesen választjuk meg, kívülről nézve véletlen jelleggel. Miután minden, ebből elérhető csúcsot bejártunk, visszajutottunk az említett kezdőpontba. Ha maradt olyan csúcs, amelyet a bejárás nem ért el, azaz színe fehér maradt, akkor választunk közülük egy következőt és abból kiindulva újra elvégezzük a mélységi bejárást.\\ + + \noindent Ezt az eljárást addig folytatjuk, amíg van fehér csúcsunk. Nyilván minden ilyen menetben legalább egy csúcsot átszínezünk feketére, tehát véges számú menet után elfogynak a fehér csúcsok. Elegendő a csúcsok halmazán egyszer végigmenni (a gyakorlatban a csúcsok címkéje szerinti növekedően), és ha egy csúcs színe fehér, akkor onnan indítsunk egy bejárást.\\ + + \noindent A gráf éleit a mélységi bejárás közben osztályozhatjuk. (Inicializáláskor minden értéket 0-ra állítottunk) + \begin{itemize} + \item Faél: A következő csúcs mélységi száma = 0 + \item Visszaél: A következő csúcs mélységi száma $ > 0$, és befejezési száma $= 0$\\ + (Tehát az aktuális út egy előző csúcsára kanyarodunk vissza) + \item Keresztél: A következő csúcs mélységi száma $ > 0$, és befejezési száma $ > 0$, továbbá az aktuális csúcs mélységi száma $>$ következő csúcs mélységi száma.\\ + (Ekkor egy az aktuális csúcsot megelőző csúcsból induló, már megtalált útba mutató éllel van dolgunk) + \item Előreél: A következő csúcs mélységi száma $ > 0$, és befejezési száma $ > 0$, továbbá az \\ + aktuális csúcs mélységi száma $ < $ következő csúcs mélységi száma.\\ + (Ekkor egy az aktuális csúcsból induló, már megtalált útba mutató éllel van dolgunk) + \end{itemize} + + \subsection*{DAG Topologikus rendezése\\} + + \paragraph*{Alapfogalmak} + + \begin{itemize} + \item Topologikus rendezés + Egy $G(V,E)$ gráf topologikus rendezése a csúcsok olyan sorrendje, melyben \\ + $\forall (u\rightarrow v) \in E$ élre $u$ előbb van a sorrendben, mint $v$ + \item DAG - Directed Acyclic Graph + Irányított körmentes gráf. \\ + Legtöbbször munkafolyamatok irányítására illetve függőségek analizálására használják. + + Tulajdonságok: + \begin{itemize} + \item Ha $G$ gráfra a mélységi bejárás visszaélt talál (Azaz kört talált) $\Longrightarrow$ $G$ nem DAG + \item Ha $G$ nem DAG (van benne kör) $\Longrightarrow$ Bármely mélységi bejárás talál visszaélt + \item Ha $G$-nek van topologikus rendezések $\Longrightarrow$ $G$ DAG + \item Minden DAG topologikusan rendezhető. + \end{itemize} + \end{itemize} + \paragraph*{DAG topologikus rendezése\\} + + Egy $G$ gráf mélységi bejárása során tegyük verembe azokat a csúcsokat, melyekből visszaléptünk. Az algoritmus után a verem tartalmát kiírva megkapjuk a gráf egy topologikus rendezését. + + \section*{Adattömörítések} + + \subsection*{Huffman-algoritmus} + + \noindent A Huffman-kódolás karakterek (jelek, betűk, számjegyek) olyan kódolását jelenti, ahol az egyes karakterekhez rendelt kódok nem azonos hosszúságúak (különböző számú bitből állnak), így a belőlük alkotott szöveg hosszában rövidíthetővé válik. Ez a karakterek gyakoriságának figyelembevételével történik. Maga a kódolás egy mohó stratégián alapszik, és az adattömörítésben igen hatékonyan használható.\\ + + \noindent A kódolás során egy speciális adatszerkezetet (lényegében egy bináris fát, amely most egyszerűen csak listaként ábrázolunk) építünk fel lépésről-lépésre, a következő módon: + + \begin{enumerate} + \item Kiválasztjuk a lista két legkisebb gyakoriságú elemét, amely egy háromcsúcsú bináris fa két levele (olyan csúcs, amelynek nincs gyereke) lesz (amelyeket a gyakorisággal címkézzük meg), majd ezekhez hozzárendelünk egy gyökeret, amelyet a két gyakoriság összegével címkézünk meg. + + \item Ezután a két vizsgált elemet kitöröljük a listából, és azok összegét beszúrjuk az érték szerinti megfelelő helyre, hogy a lista rendezettsége megmaradjon. + + \item Ezután folytatjuk a műveletet az 1. lépésnél mindaddig, amíg van elem a listában. + \end{enumerate} + + \noindent Az így felépített adatszerkezetben a levelek az eredeti karaktereknek (illetve azok gyakoriságának) felelnek meg.\\ + + \noindent Az eredményül kapott fában, minden csúcs esetében címkézzük meg 0-val a belőle kiinduló bal oldali élt, 1-gyel pedig a jobb oldalit.\\ + + \noindent A gyökértől egy adott levélig egyetlen út halad. Ezen út éleihez rendelt 0 és 1 címkéket sorrendben összeolvasva, megkapjuk a levélhez rendelt karakter kódját. Látható, hogy a gyakoribb karakterek kódja rövidebb, míg a kevésbé gyakoribbaké hosszabb lesz.\\ + + \noindent Megjegyzés: Attól függően, hogy a bináris fa felépítésében egy adott lépésben melyik elem kerül balra és melyik jobbra, különböző eredményt kaphatunk, de ez nem befolyásolja a kapott kód hatékonyságát, illetve a megoldás helyességét.\\ + + \noindent Példa: Legyen a következő öt betű, mely a megadott gyakorisággal fordul elő (már növekvő sorrendben):\\\\ + \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=4cm, + thick,main node/.style={circle,draw,font=\Large\bfseries}] +%Nodes + \node[main node] (E1) at (0,0) {$\textbf{1}_{_{E}}$}; + \node[main node] (D1) at (2,0) {$\textbf{2}_{_{D}}$}; + \node[main node] (C1) at (4,0) {$\textbf{3}_{_{C}}$}; + \node[main node] (B1) at (6,0) {$\textbf{4}_{_{B}}$}; + \node[main node] (A1) at (8,0) {$\textbf{5}_{_{A}}$}; +%Lines +\end{tikzpicture}\\ + + \noindent Ekkor a redukciós lépések a következők:\\ + + \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=4cm, + thick,main node/.style={circle,draw,font=\Large\bfseries}] +%Nodes + \node[main node] (E1) at (-2,-1) {$\textbf{1}_{_{E}}$}; + \node[main node] (D1) at (2,-1) {$\textbf{2}_{_{D}}$}; + \node[main node, color=coolblack, very thick] (ED1) at (0,0) {$\textbf{3}_{_{E,D}}$}; + \node[main node] (C1) at (4,-1) {$\textbf{3}_{_{C}}$}; + \node[main node] (B1) at (6,-1) {$\textbf{4}_{_{B}}$}; + \node[main node] (A1) at (8,-1) {$\textbf{5}_{_{A}}$}; + + \draw[->, color=blue(pigment), very thick] (ED1) edge node[above left] {0} (E1); + \draw[->, color=blue(pigment), very thick] (ED1) edge node {1} (D1); +\end{tikzpicture}\\\\ + + \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=4cm, + thick,main node/.style={circle,draw,font=\Large\bfseries}] +%Nodes + \node[main node] (E1) at (-2,-1) {$\textbf{1}_{_{E}}$}; + \node[main node] (D1) at (2,-1) {$\textbf{2}_{_{D}}$}; + \node[main node] (ED1) at (0,0) {$\textbf{3}_{_{E,D}}$}; + \node[main node] (C1) at (4,0) {$\textbf{3}_{_{C}}$}; + \node[main node, color=coolblack, very thick] (ECD1) at (2,1) {$\textbf{6}_{_{E,D,C}}$}; + \node[main node] (B1) at (6,-1) {$\textbf{4}_{_{B}}$}; + \node[main node] (A1) at (8,-1) {$\textbf{5}_{_{A}}$}; + + \draw[->] (ED1) edge node[above left] {0} (E1); + \draw[->] (ED1) edge node {1} (D1); + \draw[->, color=blue(pigment), very thick] (ECD1) edge node[above left] {0} (ED1); + \draw[->, color=blue(pigment), very thick] (ECD1) edge node {1} (C1); +\end{tikzpicture}\\\\ + + \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=4cm, + thick,main node/.style={circle,draw,font=\Large\bfseries}] +%Nodes + \node[main node] (E1) at (-2,-1) {$\textbf{1}_{_{E}}$}; + \node[main node] (D1) at (2,-1) {$\textbf{2}_{_{D}}$}; + \node[main node] (ED1) at (0,0) {$\textbf{3}_{_{E,D}}$}; + \node[main node] (C1) at (4,0) {$\textbf{3}_{_{C}}$}; + \node[main node] (ECD1) at (2,1) {$\textbf{6}_{_{E,D,C}}$}; + \node[main node, color=coolblack, very thick] (BA1) at (8,1) {$\textbf{9}_{_{B,A}}$}; + \node[main node] (B1) at (6,0) {$\textbf{4}_{_{B}}$}; + \node[main node] (A1) at (10,0) {$\textbf{5}_{_{A}}$}; + + \path[->] (ED1) edge node[above left] {0} (E1); + \path[->] (ED1) edge node {1} (D1); + \path[->] (ECD1) edge node[above left] {0} (ED1); + \path[->] (ECD1) edge node {1} (C1); + \path[->, color=blue(pigment), very thick] (BA1) edge node[above left] {0} (B1); + \path[->, color=blue(pigment), very thick] (BA1) edge node {1} (A1); +\end{tikzpicture}\\\\ + + \begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=4cm, + thick,main node/.style={circle,draw,font=\Large\bfseries}] +%Nodes + \node[main node] (E1) at (-2,-1) {$\textbf{1}_{_{E}}$}; + \node[main node] (D1) at (2,-1) {$\textbf{2}_{_{D}}$}; + \node[main node] (ED1) at (0,0) {$\textbf{3}_{_{E,D}}$}; + \node[main node] (C1) at (4,0) {$\textbf{3}_{_{C}}$}; + \node[main node] (ECD1) at (2,1) {$\textbf{6}_{_{E,D,C}}$}; + \node[main node] (BA1) at (8,1) {$\textbf{9}_{_{B,A}}$}; + \node[main node] (B1) at (6,0) {$\textbf{4}_{_{B}}$}; + \node[main node] (A1) at (10,0) {$\textbf{5}_{_{A}}$}; + \node[main node, color=coolblack, very thick] (ECDBA1) at (5,2) {$\textbf{15}_{_{E,D,C,B,A}}$}; + + \path[->] (ED1) edge node[above left] {0} (E1); + \path[->] (ED1) edge node {1} (D1); + \path[->] (ECD1) edge node[above left] {0} (ED1); + \path[->] (ECD1) edge node {1} (C1); + \path[->] (BA1) edge node[above left] {0} (B1); + \path[->] (BA1) edge node {1} (A1); + \path[->, color=blue(pigment), very thick] (ECDBA1) edge node[above left] {0} (ECD1); + \path[->, color=blue(pigment), very thick] (ECDBA1) edge node {1} (BA1); +\end{tikzpicture}\\ + + \noindent Tehát a kódszavak:\\ + + \begin{tabular}{|c|c|c||c|c|} + \hline A & B & C & D & E \\ + \hline 11 & 10 & 01 & 001 & 000 \\ + \hline + \end{tabular}\\ +\newpage + \subsection*{LZW-algoritmus} + + Az LZW (Lempel-Ziv-Welch) egy veszteségmentes tömörítési algoritmus. A tömörítésnek a lényege, hogy egy szótárat bővítünk folyamatosan, és az egyes kódolandó szavakhoz szótárindexeket rendelünk. + + \paragraph*{Kódolás\\\\} + + A kódolás algoritmusa a következő lépésekből áll: + \begin{enumerate} + \item A szótárt inicializáljuk az összes 1 hosszú szóval + \item \label{itm:szotar} Kikeressük a szótárból a leghosszabb, jelenlegi inputtal összeillő $W$ sztringet + \item $W$ szótárindexét kiadjuk, és $W$-t eltávolítjuk az inputról + \item A $W$ szó és az input következő szimbólumának konkatenációját felvesszük a szótárba + \item A \ref{itm:szotar}. lépéstől ismételjük + \end{enumerate} + + \noindent Példa:\\\\ + \textbf{{\color{blue(pigment)}B}}emenet: wabbawabba\\\\ + \textbf{{\color{blue(pigment)}S}}zótár: + $\begin{array}{|c|c|c||c|c|c|c|c|c|c|} + a & b & w & wa & ab & bb & ba & aw & wab & bba\\ \hline + 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 + \end{array}$\\\\ + + \small + \noindent \begin{tabular}{|c|c|c|c|c|} + \hline + % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ... + \text{\textbf{{\color{blue(pigment)}I}}ndex} & \makecell{ \text{\textbf{{\color{blue(pigment)}E}}lőző} \\ $ \left\{ + \begin{array}{lr} + \textbf{B[I-1]},\ \text{ha}\ E + J \in S \wedge I \geq 2\\ + \textbf{E} + \textbf{B[I-1]},\ \text{ha}\ K[I-1] = \varnothing \wedge I \geq 2\\ + \varnothing,\ \text{különben}\ + \end{array} \right.$ } & \makecell{ \text{\textbf{{\color{blue(pigment)}J}}elenlegi}\\ B[I] } & \makecell { \small \text{\textbf{{\color{blue(pigment)}K}}ód}\\ $ \left\{ + \begin{array}{lr} + \textbf{E} + \textbf{J},\ \text{ha}\ E + J \not\in S\\ + \varnothing,\ \text{ha}\ E + J \in S + \end{array} \right.$ } & \makecell { \text{\textbf{{\color{blue(pigment)}K}}imenet} \\ $\left\{ + \begin{array}{lr} + \textbf{E},\ \text{ha}\ \text{K} \neq \varnothing \vee J = \varnothing \\ + \varnothing,\ \text{ha}\ \text{K} = \varnothing + \end{array} \right. $ } \\ \hline + 1 & & w & & \\ \hline + 2 & w & a & wa - 4 & $\textbf{3}$ \\ \hline + 3 & a & b & ab - 5 & $\textbf{1}$ \\ \hline + 4 & b & b & bb - 6 & $\textbf{2}$ \\ \hline + 5 & b & a & ba - 7 & $\textbf{2}$ \\ \hline + 6 & a & w & aw - 8 & $\textbf{1}$ \\ \hline + 7 & w & a & & \\ \hline + 8 & wa & b & wab - 9 & $\textbf{4}$ \\ \hline + 9 & b & b & & \\ \hline + 10 & bb & a & bba - 10 & $\textbf{6}$ \\ \hline + $(11) \oslash$ & a & & & $\textbf{1}$ \\ \hline + \end{tabular}\\\\ + Kimenet: 3 1 2 2 1 4 6 1\\ + + \paragraph*{Dekódolás\\\\} + + A dekódolás során is építenünk kell a szótárat. Ezt már azonban csak a dekódolt szöveg(rész) segítségével tudjuk megtenni, mivel egy megkapott kód dekódolt szava és az utána lévő szó első karakteréből áll össze a szótár következő eleme.\\ + + \noindent Tehát a dekódolás lépései: + \begin{enumerate} + \item Kikeressük a kapott kódhoz tartozó szót a szótárból ($u$), az output-ra rakjuk + \item Kikeressük a következő szót ($v$) a szótárból, az első szimbólumát $u$-hoz konkatenálva a szótárba rakjuk a következő indexszel. + \item Amennyiben már nincs következő szó, dekódolunk, de nem írunk a szótárba. + \end{enumerate} + + \noindent Megtörténhet az az eset, hogy mégis kapunk olyan kódszót, mely még nincs benne a szótárban. Ez akkor fordulhat elő, ha a kódolásnál az aktuálisan szótárba írt szó következik.\\ +\newpage + \noindent Példa:\\ + + \noindent Szöveg: AAA\\ + \noindent Szótár: A - 1\\ + + \noindent Ekkor a kódolásnál vesszük az első karaktert, a szótárbeli indexe 1, ezt kiküldjük az outputra. A következő karakter A, így AA-t beírjuk a szótárba 2-es indexszel. Az első karaktert töröljük az inputról. Addig olvasunk, míg szótárbeli egyezést találunk, így AA-t olvassuk (amit pont az előbb raktunk be), ennek indexe 2, tehát ezt küldjük az outputra. AA-t töröljük az inputról, és ezzel végeztünk is. Az output: 1,2\\ + + \noindent Dekódoljuk az 1,2 inputot! Jelenleg a szótárban csak A van 1-es indexszel. Vegyük az input első karakterét, az 1-et, ennek szótárbeli megfelelője A. Ezt tegyük az outputra. A következő index a 2, de ilyen bejegyzés még nem szerepel a szótárban. \\ + + \noindent Ebben az esetben a dekódolásnál, egy trükköt vetünk be. A szótárba írás pillanatában még nem ismert a beírandó szó utolsó karaktere (A példában A-t találtuk, de nem volt 2-es bejegyzés). Ekkor ?-et írunk a szótárba írandó szó utolsó karakterének helyére. (Tehát A? - 2 kerül a szótárba). De mostmár tudni lehet az új bejegyzés első betűjét ( A? - 2 az új bejegyzés, ennek első betűje A). Cseréljük le a ?-et erre a betűre. (Tehát AA - 2 lesz a szótárban).\\ + + \noindent Példa:\\\\ + \textbf{{\color{blue(pigment)}B}}emenet: 3 1 2 2 1 4 6 1\\\\ + \textbf{{\color{blue(pigment)}S}}zótár: + $\begin{array}{|c|c|c|} + a & b & w \\ \hline + 1 & 2 & 3 + \end{array}$\\\\ + + \small + \noindent \begin{tabular}{|c|c|c|c|c|} + \hline + % after \\: \hline or \cline{col1-col2} \cline{col3-col4} ... + \text{\textbf{{\color{blue(pigment)}I}}nput} & \text{\textbf{{\color{blue(pigment)}E}}lőző} & \text{\textbf{{\color{blue(pigment)}K}}imenet} & \makecell{ \text{\textbf{{\color{blue(pigment)}K}}ód} \\ (Sejtés) } & \makecell{ \text{\textbf{{\color{blue(pigment)}K}}ód} \\ (Teljes) } \\ \hline + 3 & & w & w? - 4 & \\ \hline + 1 & w & a & a? - 5 & wa - 4 \\ \hline + 2 & a & b & b? - 6 & ab - 5 \\ \hline + 2 & b & b & b? - 7 & bb - 6 \\ \hline + 1 & b & a & a? - 8 & ba - 7 \\ \hline + 4 & a & wa & wa? - 9 & aw - 8 \\ \hline + 6 & w & bb & bb? - 10 & wab - 9 \\ \hline + 1 & bb & a & & bba - 10 \\ \hline + $\varnothing$ & & & & \\ \hline + \end{tabular} \\\\ + Kimenet: wabbawabba + + \section*{Mintaillesztés} + + \noindent A mintaillesztés feladata az, hogy egy szövegben egy szövegminta (szövegrészlet, string) előfordulását vagy előfordulásait megkeressük. A mintaillesztés elnevezés mellett találkozunk a stringkeresés elnevezéssel is.\\ + + \noindent A feladat általánosítható: valamely alaptípus feletti sorozatban keressük egy másik (általában jóval rövidebb) sorozat előfordulásait (például egy DNS láncban keresünk egy szakaszt).\\ + + \noindent A továbbiakban egyszerűsítjük a feladatot a minta első előfordulásának a megkeresésére, amelynek segítségével az összes előfordulás megkapható. (Keressük meg a minta első előfordulását, majd a hátralévő szövegben ismét keressük az első előfordulást stb.)\\ + + \noindent Vezessük be az alábbi jelöléseket: + \begin{itemize} + \item Legyen $H$ egy tetszőleges alaptípus feletti véges halmaz, a szöveg \emph{ábécéje}. + \item Legyen a \emph{szöveg}, amelyben a mintát keressük: $S[1 \ldots n] \in H^{*}$, azaz egy $n$ hosszú $H$ feletti véges sorozat. + \item Legyen a \emph{minta}, amelyet keresünk a szövegben: $S[1 \ldots m] \in H^{*}$, egy $m$ hosszú szintén a $H$ feletti véges sorozat. + \end{itemize} + \noindent Továbbá, tegyük fel, hogy $S$-en és $M$-en megengedett művelet az indexelés, azaz hivatkozhatunk a szöveg vagy a minta egy $i$-edik elemére $S[i]\ (i \in [1 \ldots n])$, $M[i]\ (i \in [1 \ldots m])$. + + \noindent A tárgyalt algoritmusok némelyike lényeges módosítás nélkül átírható szekvenciális fájlokra is (ahol az indexelés nem megengedett), míg a más tárgyalt algoritmusok csak puffer használatával alkalmazhatók a csak szekvenciálisan olvasható hosszabb szövegekre. + + \subsubsection*{Az illeszkedés fogalma} + + \noindent Azt mondjuk, hogy + \begin{itemize} + \item az $M$ minta a $k+1$-dik pozíción illeszkedik az $S$ szövegre (előfordul a szövegben), vagy + \item az $M$ minta $k$ eltolással illeszkedik $S$-re, illetve + \item $k$ érvényes eltolás, + \end{itemize} + ha + \[ + S[k+1 \cdots k+m]=M[1 \ldots m],\ \text{azaz}\quad \forall j \in [1 \ldots m] : S[k + j] = M [j]. + \] + + \noindent Továbbá, az $M$ mintának a $(k+1)$-edik pozíción való illeszkedése az $M$ első előfordulása az $S$ szövegben, ha + \[ + \forall i \in N,\ i \in [0 \ldots k - 1] : S[i + 1 \ldots i + m] \neq M[1 \ldots m]. + \] + \noindent Legyen például a szövegünk S="ABBABCAB", és a keresett minta pedig M="ABC". A fenti definíció szerint az $M$ minta a 4-edik pozíción, k=3 eltolással illeszkedik az $S$ szövegre (ABB\textbf{ABC}AB). + + \subsection*{Az egyszerű mintaillesztés algoritmusa} + + \noindent A stringkeresési feladat naiv megoldást nevezzük egyszerű mintaillesztésnek. Ehhez egy a nyers erő (brute force) levén működő algoritmushoz könnyen eljuthatunk a már tanult programozási tételekre való visszavezetéssel.\\ + + \noindent Tekintsük megengedett műveletnek az $S[k+1 \ldots k+m] = M[1 \ldots m]$ vizsgálatot. Ennek a kifejezésnek az eredményét megkaphatjuk karakterenkénti összehasonlítással is, amelynek során a minta minden karakterét összehasonlítjuk a szövegdarab megfelelő karakterével; és ha az összes vizsgált karakter egyezik, akkor a kifejezés értéke legyen igaz, különben hamis.\\ + + \noindent Az $S[k+1 \ldots k+m] = M[1 \ldots m]$ vizsgálat előbb említett megvalósítása javítható, ha visszavezetjük lineáris keresésre, amelynek során keressük az első olyan $j \in N,\ j\in[1 \ldots m]$ pozíciót, amelyre $S[k + j] \neq M[j]$.\\ + + \noindent Amennyiben nem találunk ilyen $j$ pozíciót, azaz $\forall j \in N, \ j \in [1 \ldots m] : S[k + j] = M[j]$, akkor az $M$ illeszkedik $S$-re $k$ eltolással, tehát $S[k+1 \ldots k+m] = M[1 \ldots m]$ vizsgálat eredménye legyen igaz, különben pedig hamis. Ezt a megoldást nevezzük az egyszerű mintaillesztés algoritmusának, amely nem más, mint egy lineáris keresésbe ágyazott lineáris keresés. + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/bruteforce.png} + \caption{Az egyszerű mintaillesztés algoritmusa} + \label{fig:bruteforce} + \end{figure} + + \subsubsection*{Műveletigény} + + \noindent A legjobb esetben a minta első karaktere egyáltalán nem szerepel a szövegben, így minden $k$ eltolásnál már $j=1$ esetben mindig elromlik az illeszkedés. Tehát minden eltolásnál csak egy összehasonlítás történik, így az összehasonlítások száma megegyezik az eltolások számával, $(n-m+1)$-gyel. Azaz $\text{MÖ}(n, m) = n - m + 1 = \Theta(n)$\\ + + \noindent A legkedvezőtlenebb esethez akkor jutunk, ha minden eltolásánál csak a minta utolsó karakterénél romlik el az illeszkedés. Ekkor minden eltolásnál $m$ összehasonlítást végzünk, így a műveletigény az eltolások számának $m$-szeresével jellemezhető. Azaz $\text{MÖ}(n, m) = (n - m + 1) * m = \Theta(n * m)$ + + \subsubsection*{Szekvenciális sorozatokra, fájlokra való alkalmazhatóság} + + \noindent A gyakorlatban az általunk szövegnek nevezett sorozat nem egyszer igen nagyméretű is lehet, emiatt csak olyan szekvenciális formában áll rendelkezésünkre, amelyen az indexelés nem megengedett művelet. Hasznos lehet annak vizsgálata, hogy az ismertetett algoritmust mennyire egyszerű átírni szekvenciális sorozatokra, illetve fájlokra. Az egyszerű mintaillesztő algoritmus szekvenciális sorozatokra történő átírásánál kénytelenek vagyunk puffert használni, mivel a szövegben időnként vissza kell "ugrani" (akkor, ha az illeszkedés nem a minta első karakterénél romlik el). + + \subsection*{Knuth-Morris-Pratt algoritmus} + + A nyers erőt használó egyszerű mintaillesztés műveletigénye legrosszabb esetben $n * m$-es volt. A Knuth-Morris-Pratt algoritmus (KMP-vel rövidítjük) egyike azon mintaillesztő eljárásoknak, amelyek ügyes észrevételek és mélyebb megfontolások alapján hatékonyabb módon oldják meg az stringkeresés feladatát. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/KMP_sample.png} + \caption{KMP algoritmus több karakter tolás estén} + \label{fig:KMP_sample} + \end{figure} + + \noindent Az ugrás megállapítását a következőképp tesszük: Az eddig megvizsgált egyező mintarész elején (prefix) és végén (suffix) olyan kartersorozatot keresünk, melyek megegyeznek. Ha találunk ilyet, akkor a mintát annyival tolhatjuk, hogy az elején lévő része ráilleszkedjen a végén levőre. + + \noindent Azt, hogy ez egyes esetekben mekkorát tolhatunk nem kell minden elromlás alkalmával vizsgálni. Ha a mintára önmagával lefuttatjuk az algoritmus egy módosított változatát (\ref{fig:KMP_initnext}. ábra), kitölthetünk egy tömböt, mely alapján a tolásokat végezni fogjuk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/KMP_init_next.png} + \caption{KMP tolásokat szabályzó tömb kitöltése} + \label{fig:KMP_initnext} + \end{figure} + + \noindent Az algoritmus (ld \ref{fig:KMP}. ábra):\\ + + \begin{itemize} + \item Két indexet $i$ és $j$ futtatunk a szövegen illetve a mintán. + \item Ha az $i+1$-edik és $j+1$-edik karakterek megegyeznek, akkor léptetjük mind a kettőt. + \item Ha nem egyeznek meg, akkor: + \begin{itemize} + \item Ha a minta első elemét vizsgáltuk, akkor egyet tolunk a mintán, magyarul a minta indexe marad az első betűn, és a szövegben lévő indexet növeljük eggyel ($i=i+1$) + \item Ha nem a minta első elemét vizsgáltuk, akkor annyit tolunk, amennyit szabad. Ez azt jelenti, hogy csak a mintán lévő indexet helyezzük egy kisebb helyre ($j = next[j]$) + \end{itemize} + \item Addig megyünk, míg vagy a minta, vagy a szöveg végére nem érünk. Ha a minta végére értünk, akkor megtaláltuk a mintát a szövegben, ha a szöveg végére értünk, akkor pedig nem. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/KMP_algo.png} + \caption{KMP algoritmus} + \label{fig:KMP} + \end{figure} + + \subsection*{Boyer-Moore | Quick search algoritmus} + + Míg a KMP algoritmus az elromlás helye előtti rész alapján döntött a tolásról, addig a QS a minta utáni karakter alapján. Tehát elromlás esetén: + \begin{itemize} + \item Ha a minta utáni karakter benne van a mintában, akkor jobbról az első előfordulására illesztjük. (\ref{fig:BoyerMoore_shift1}. ábra) + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/BoyerMoore_shift1.png} + \caption{QS - eltolás ha a minta utáni karakter benne van a mintában} + \label{fig:BoyerMoore_shift1} + \end{figure} + \item Ha a minta utáni karakter nincs benne a mintában, akkor a mintát ezen karakter után illesztjük. (\ref{fig:BoyerMoore_shift2}. ábra) + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/BoyerMoore_shift2.png} + \caption{QS - eltolás ha a minta utáni karakter nincs benne a mintában} + \label{fig:BoyerMoore_shift2} + \end{figure} + \end{itemize} + + \noindent Az eltolás kiszámítását megint elő lehet segíteni egy tömbbel, most azonban, mivel nem a minta az érdekes, és nem tudjuk pontosan mely karakterek szerepelnek a szövegben, így a tömbbe az egész abc-t fel kell vennünk (\ref{fig:BoyerMoore_initshift}. ábra) + + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/QS_Init_Shift.png} + \caption{QS - Az eltolást elősegítő tömb ($Shift['a'...'z']$) konstruálása} + \label{fig:BoyerMoore_initshift} + \end{figure} + + \noindent Az algoritmus (ld. \ref{fig:BoyerMoore}. ábra): + \begin{itemize} + \item Két indexet $k$ és $j$ futtatunk a szövegen illetve a mintán. + \item Ha a szöveg $k+j$-edik eleme megegyezik a minta $j$-edik karakterével, akkor léptetjük $j$-t (mivel a szövegben $k+j$-edik elemet nézzük, így elég $j$-t növelni). + \item Ha nem egyeznek meg, akkor: + \begin{itemize} + \item Ha a minta már a szöveg végén van ($k=n-m$), akkor csak növeljük $k$-t eggyel, ami hamissá teszi a ciklus feltételt. + \item Ha még nem vagyunk a szöveg végén $k$-t toljuk annyival, amennyivel lehet (ezt az előre beállított $Shift$ tömb határozza meg). És a $j$-t visszaállítjuk 1-re. + \end{itemize} + \item Addig megyünk, míg vagy a minta végére érünk $j$-vel, vagy a mintát továbbtoltuk a szöveg végénél. Előbbi esetben egyezést találtunk, míg az utóbbiban nem. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/QS_algo.png} + \caption{QS} + \label{fig:BoyerMoore} + \end{figure} + \subsection*{Rabin-Karp algoritmus} + + A Rabin-Karp algoritmus lényege, hogy minden betűhöz az ábécéből egy számjegyet rendelünk, és a keresést számok összehasonlításával végezzük. Világos, hogy ehhez egy ábécé méretnek megfelelő számrendszerre lesz szükségünk. A szövegből mindig a minta hosszával egyező részeket szelünk ki, és ezeket hasonlítjuk össze.\\ + + \noindent Példa:\\ + Minta: BBAC $\rightarrow$ 1102 \\ + Szöveg: DACABBAC $\rightarrow$ 30201102, amiből a következő számokat állítjuk elő: 3020, 0201, 2011, 0110, 1102\\ + + \noindent A fent látható szeletek lesznek az $s_i$-k.\\ + + \noindent Az algoritmus működéséhez azonban számos apró ötletet alkalmazunk: + \begin{enumerate} + \item A minta számokká alakítását Horner-módszer segítségével végezzük. + \begin{figure}[H] + \centering + \includegraphics[width=0.3\textwidth]{img/RK_Horner.jpg} + \caption{RK - Horner-módszer} + \label{fig:RK_Horner} + \end{figure} + Az $ord()$ függvény az egyes betűknek megfelelő számot adja vissza. A $d$ a számrendszer alapszáma. + \item A szöveg mintával megegyező hosszú szeleteinek ($s_i$) előállítása: \\ + $s_0$-t a Horner-módszerrel ki tudjuk számolni. Ezek után $s_{i+1}$ a következőképp számolandó: + \[s_{i+1} = (s_i - ord(S[i])\cdot d^{m-1})\cdot d + ord(S[i+1])\] + \textit{Magyarázat: $s_i$ elejéről levágjuk az első számjegyet ($s_i - ord(S[i])\cdot d^{m-1}$), majd a maradékot eltoljuk egy helyiértékkel (szorzás $d$-vel), végül az utolsó helyiértékre beírjuk a következő betűnek megfelelő számjegyet ($+ord(S[i+1])$)} + + Példa: + + Az előző példa szövegével és mintájával ($d=10$ elemű ábécé és $m=4$ hosszú minta): \\ + $s_0 = 3020$, ekkor: $s_{0+1} = s_1 = (3020 - ord(D) \cdot 10^3)\cdot 10 + ord(B) = (3020-3000)\cdot 10 +1 = 0201$ + \item Felmerülhet a kérdés, hogy az ilyen magas alapszámú számrendszerek nem okoznak-e gondot az ábrázolásnál? A kérdés jogos. Vegyük a következő életszerű példát: + + 4 bájton ábrázoljuk a számainkat ($2^{32}$). Az abc legyen 32 elemű ($d=32$), a minta 8 hosszú ($m=8$). Ekkor a $d^{m-1}$ kiszámítása: $32^7 = (2^5)^7 = 2^{35}$ , ami már nem ábrázolható 4 bájton.\\ + + \noindent Ennek kiküszöbölésére vezessünk be egy nagy $p$ prímet, melyre $d\cdot p$ még ábrázolható. És a műveleteket számoljuk $\mod{p}$. Ekkor természetesen a kongruencia miatt lesz olyan eset, amikor az algoritmus egyezést mutat, mikor valójában nincs. Ez nem okoz gondot, mivel ilyen esetben karakterenkénti egyezést vizsgálva ezt a problémát kezelni tudjuk. (Fordított eset nem fordul elő tehát nem lesz olyan eset, mikor karakterenkénti egyezés van, de numerikus nincs). [Ha $p$ kellően nagy, a jelenség nagyon ritkán fordul elő.] + + \item A $\mod{p}$ számítás egy másik problémát is felvet. Ugyanis a kivonás alkalmával negatív számokat is kaphatunk. + + Például: Legyen $p=7$, ekkor, ha $ord(S[i]) = 9$, akkor előző számítás után $s_i = 2...$, de ebből $ord(S[i])\cdot d^{m-1} = 9\cdot 10^3 = 9000$-et vonunk ki negatív számot kapunk. + + Megoldásként $s_{i+1}$-et két lépésben számoljuk: + \[s := (s_i+d\cdot p - ord(S[i])\cdot d^{m-1}) \mod{p} \] + \[s_{i+1} := (s\cdot d + ord(S[i+1])) \mod{p} \] + \end{enumerate} + A fentiek alapján az algoritmus a következő (ld. \ref{fig:RK}. ábra) + \begin{enumerate} + \item Kiszámoljuk $d^{m-1}$-et ($dm1$) + \item Egy iterációban meghatározzuk Horner-módszerrel a minta számait ($x$) és $s_0$-t + \item Ellenőrizzük, hogy egyeznek-e + \item Addig számolgatjuk $s_i$ értékét míg a minta nem egyezik $s_i$-vel, vagy a minta a szöveg végére nem ért. + \end{enumerate} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/Rabin_Krap_algo.png} + \caption{RK} + \label{fig:RK} + \end{figure} +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_disk.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_disk.png new file mode 100644 index 0000000..5cf4793 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_disk.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_structure.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_structure.png new file mode 100644 index 0000000..d7b5359 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/FAT_structure.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/NTFS_structure.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/NTFS_structure.png new file mode 100644 index 0000000..fb130ce Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/NTFS_structure.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/allapot.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/allapot.png new file mode 100644 index 0000000..f243882 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/allapot.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/asymmetric_communication.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/asymmetric_communication.png new file mode 100644 index 0000000..3711e16 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/asymmetric_communication.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/broadcasting_communication.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/broadcasting_communication.png new file mode 100644 index 0000000..f0bf5cd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/broadcasting_communication.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/diagram.drawio new file mode 100644 index 0000000..002ffff --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/direct_communication.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/direct_communication.png new file mode 100644 index 0000000..ebaa6b6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/direct_communication.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ext2inode.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ext2inode.png new file mode 100644 index 0000000..2a4409d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ext2inode.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/file_system_management.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/file_system_management.png new file mode 100644 index 0000000..d6edd82 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/file_system_management.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/filo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/filo.png new file mode 100644 index 0000000..11eff34 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/filo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/fogyaszto_szemafor.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/fogyaszto_szemafor.png new file mode 100644 index 0000000..cc2eb9b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/fogyaszto_szemafor.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/gyarto_szemafor.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/gyarto_szemafor.png new file mode 100644 index 0000000..f845be9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/gyarto_szemafor.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/indirect_communication.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/indirect_communication.png new file mode 100644 index 0000000..fa38b17 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/indirect_communication.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/iro.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/iro.png new file mode 100644 index 0000000..8169214 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/iro.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_individial_queue.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_individial_queue.png new file mode 100644 index 0000000..8b20615 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_individial_queue.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_single_queue.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_single_queue.png new file mode 100644 index 0000000..a07ff40 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/memory_partitioning_single_queue.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/messaging_sync.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/messaging_sync.png new file mode 100644 index 0000000..5228763 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/messaging_sync.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/mutex.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/mutex.png new file mode 100644 index 0000000..e5f0699 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/mutex.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs.png new file mode 100644 index 0000000..5e0d87a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs2.png new file mode 100644 index 0000000..85fbfbb Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/ntfs2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/olvaso.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/olvaso.png new file mode 100644 index 0000000..82df7cd Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/olvaso.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging.png new file mode 100644 index 0000000..de4d21a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion.png new file mode 100644 index 0000000..f68d406 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion_tl.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion_tl.png new file mode 100644 index 0000000..6237df0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/paging_address_conversion_tl.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/pekvasarlo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/pekvasarlo.png new file mode 100644 index 0000000..e2c4b39 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/pekvasarlo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/peterson.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/peterson.png new file mode 100644 index 0000000..d1d1536 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/peterson.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/petersonhiba.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/petersonhiba.png new file mode 100644 index 0000000..2e31a62 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/petersonhiba.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0+1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0+1.png new file mode 100644 index 0000000..a0eac17 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0+1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0.png new file mode 100644 index 0000000..daf019c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid0.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1+0.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1+0.png new file mode 100644 index 0000000..7c40156 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1+0.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1.png new file mode 100644 index 0000000..d203ac7 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid2.png new file mode 100644 index 0000000..98b8185 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid3.png new file mode 100644 index 0000000..112056d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid4.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid4.png new file mode 100644 index 0000000..b412d69 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid4.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid5.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid5.png new file mode 100644 index 0000000..932487a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid5.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid6.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid6.png new file mode 100644 index 0000000..0ad2ab9 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/raid6.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/segmentation_address_conversion.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/segmentation_address_conversion.png new file mode 100644 index 0000000..df93ece Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/segmentation_address_conversion.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/shared_memory_sync.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/shared_memory_sync.png new file mode 100644 index 0000000..7cf2a0a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/shared_memory_sync.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/szigoru.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/szigoru.png new file mode 100644 index 0000000..79c12f8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/img/szigoru.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.pdf new file mode 100644 index 0000000..b10eb59 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.tex new file mode 100644 index 0000000..e9d3234 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15.tex @@ -0,0 +1,2651 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper,bindingoffset=0.2in, + left=1.5cm,right=1.5cm,top=1.25cm,bottom=1.5cm,% + footskip=.25in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{comment} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{makecell} +\usepackage{tikz} +\usepackage{titlesec} +\usepackage[hungarian]{babel} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\titleformat*{\section}{\Large\bfseries} +\titleformat*{\subsection}{\large\bfseries} +\titleformat*{\subsubsection}{\normalsize\bfseries} +\titleformat*{\paragraph}{\small\bfseries} +\titleformat*{\subparagraph}{\footnotesize\bfseries} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{15. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +{\par +\hyphenpenalty=10000 +\exhyphenpenalty=10000 +} +{\par} + +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} + +\begin{document} + + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 15. Operációs rendszerek} \\ + \end{center} + + \section*{Folyamatok megvalósítása, ütemező algoritmusaik} + + \subsection*{Folyamatok} + + A \emph{program} egy bájthalmaz a fájlrendszerben. A \emph{folyamat} egy futó program példánya a memóriában: kód + I/O adatok + állapot. Annyiszor jön létre, ahányszor a programot elindítjuk.\\ + + \noindent Egy folyamat élettartamának vezérlése az operációs rendszer feladata: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item létrehozás + \item ütemezés (folyamatok közti váltás) + \item megszüntetés + \end{enumerate} + + \paragraph*{Folyamatok létrehozása} + + A működésre kész operációs rendszerben például interaktív kiszolgálás esetén minden terminálhoz tartozhat egy rendszerfolyamat, amelyik felhasználói parancsokat fogad és hajt végre. Kötegelt feldolgozás esetén elindulhat egy jobkészletet kezelő folyamat, amelyik jobok végrehajtását kezdi meg és jobonként egy újabb folyamatot indít. Valós idejű rendszer esetén az operációs rendszer saját felépülése után létrehozza és inicializálja a felhasználói rendszert alkotó folyamatokat.\\ + + \noindent A rendszerfolyamatok tehát újabb, felhasználói folyamatokat hoznak létre, a felhasználói folyamatok pedig – bizonyos típusú rendszerekben – maguk is létrehozhatnak további felhasználói folyamatokat a logikai processzor megfelelő utasításának végrehajtásával (például fork, create).\\ + + \paragraph*{Folyamatok befejezése} + + Egy folyamat az elindulása után a megadott időkeretben (el)végzi a feladatát. A befejezés lehet önkéntes vagy önkéntelen. + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Önkéntes befejezések: + \begin{itemize} + \item szabályos kilépés (exit, return stb.) + \item kilépés lekezelt hiba esetén (szintén pl. return utasítással) + \end{itemize} + \item Önkéntelen befejezések: + \begin{itemize} + \item illegális utasítás + \item végzetes hiba (0-val osztás, nem létező memória használat, stb) + \item egy másik folyamat által + \item felhasználói megszakítás + \end{itemize} + \end{itemize} + + \noindent A folyamatok futhatnak előtérben, illetve a háttérben (démonok).\\ + + \noindent Azokat a rendszereket, amelyek működése során – a felépülés és inicializálás kezdeti szakaszától eltekintve – nem jönnek létre és nem szűnnek meg folyamatok, \emph{statikus rendszereknek} nevezzük, szemben a \emph{dinamikus rendszerekkel}, amelyekben működés közben bármikor születhetnek és \lword{megszűnhetnek} a folyamatok.\\ + + \noindent A folyamatok eredetét szükség esetén a szülő–gyermek viszonyokkal, azaz egy fa struktúrával írhatjuk le (processzgráf). Dinamikus rendszerben a fa természetesen folyamatosan követi a folyamatok születését és halálát. Sok operációs rendszer a szülő–gyermek viszonyokra építi erőforrás-gazdálkodási és jogosultsági filozófiáját. Ennek egyik megközelítése a hierarchikus erőforrás-gazdálkodás, amikor a gyermek folyamatok csak a szülő erőforrásaiból részesülhetnek és nem létezhetnek önállóan, csak amíg szülőjük is létezik. Egy másik megközelítés a globális erőforrás-gazdálkodás, amikor a rendszer valamennyi folyamata létrejötte után egyenrangú, önálló szereplő, és versenyezhet a teljes erőforráskészletből való részesedésért. + + \subsection*{Folyamatállapotok} + + \noindent A mai modern számítógép fogalmához hozzátartozik, hogy természetesnek vesszük azt, amikor a számítógépünk egyidejűleg több tevékenységet végez. Például zenehallgatás közben böngészünk a neten.\\ + + \noindent Hogyan lehetséges ez, ha a számítógépünkben egy processzor (CPU) van, és az egyidejűleg csak egy feladatot képes végrehajtani?\\ + + \noindent Erre a kérdésre a válasz a végrehajtás sebességében van. A központi egység olyan gyorsan képes végrehajtani az utasításokat (több millió utasítást másodpercenként), hogy ha ennél a sebességnél váltogatjuk az éppen végrehajtódó feladatokat, az számunkra azt az illúziót kelti, mintha egymással párhuzamosan történnének a feladat-végrehajtások (ál-multitasking).\\ + + \noindent A folyamatok közti gyors kapcsolást, a végrehajtás váltását \emph{multiprogramozás}nak nevezzük.\\ + +\begin{comment} + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A mai számítógép egyrészt nem egy processzort, hanem több, önálló végrehajtási egységet foglal magában, másrészt egy fizikai processzor ráadásul több (kettő, négy vagy akár nyolc) magot is tartalmazhat.\\ + + \noindent A központi egységekben minden magnak saját belső memóriája van, ahova a közös fizikai memóriából betöltik az éppen végrehajtandó feladat kódját, és ekkor a magok valódi párhuzamos működést mutatnak. Ez azt jelenti, hogy egy időegység alatt (körülbelül egy óraciklus) mindegyik mag végrehajtja a saját folyamatának utasítását.\\ + + \noindent Ekkor nem látszatpárhuzamosságról beszélhetünk, de ez nem befolyásolja érdemben azt, hogy a folyamatok fogalmi modelljén (szekvenciális, egymás után végrehajtódó folyamatok sora) módosítsunk, amelynek segítségével a párhuzamosság\footnote{Programok vagy programfolyamatok egy idejű, egymás melletti futása} kezelését tudjuk végezni.\\ + + \noindent Így ebben az értelemben a számítógépen futó „program” – magával az operációs rendszer feladataival együtt – nem más, mint szekvenciális folyamatok sorozata. A folyamat egy végrehajtás alatt álló program, és ehhez a folyamathoz tartoznak természetesen más jellemzők is még, mint például a központi egység utasításszámlálója (hol tart a folyamatban a végrehajtás), a központi egység regiszterei (a végrehajtási számítások segédértékei) és a folyamat egyéb más állapotleírói. Ahhoz, hogy egyik folyamatról a másikra tudjunk váltani, az szükséges, hogy mindezen leírókat, adatokat mentsük, hiszen ezek ismerete feltétlenül szükséges a folyamat egy későbbi időpillanatban történő folytatásához. + $\triangleleft$ \faLightbulbO}\\ +\end{comment} + \noindent A folyamatok önálló egységek, a memória egy kis szeletében helyezkednek el. Ahhoz, hogy a központi egység ezeket végre tudja hajtani, a folyamatokhoz tartozzon saját utasításszámláló, verem, és legyenek egyéb állapotjelzői.\\ + + \noindent A folyamatok közül biztosan egy folyamat fut mindig, és az összes többi arra vár, hogy lehetőséget kapjon a futásra.\\ + + \noindent A folyamatok gyakran nemcsak önmagukban számolnak, végeznek feladatokat, hanem az operációs rendszer lehetőségeit is igénybe vehetjük: rendszerhívás\footnote{A rendszerhívás olyan speciális eljáráshívás, amikor a hívások egy kritikus feladat végrehajtására a kernelbe vagy más privilegizált operációs rendszerbeli komponensbe irányulnak. Ilyen rendszerhívások például egy állomány írására, olvasására, átnevezésére irányuló programhívásoké.} formájában kérhetünk segítséget ahhoz, hogy egy program vagy az operációs rendszer fennhatósága alá eső fájlokkal (eszközzel) vagy egy másik folyamattal kommunikáljunk. A folyamatok működése során gyakori feladat, hogy más alkalmazás szolgáltatását vegyük igénybe.\\ + + \noindent A várakozó folyamatokat több csoportba sorolhatjuk az operációs rendszerektől függően. Bármilyen csoportosítást is nézünk, jellemzően két lényeges csoport különböztethető meg a várakozó folyamatok között.\\ + + \noindent Ebből talán a folyamatok többségét a \textbf{futásra készen álló folyamatok} adják, melyeknek nincs semmire szükségük, csak arra, hogy újra „processzorhoz jussanak”! A másik csoportot a \textbf{blokkolt folyamatok} alkotják, melyeknek további működéséhez szükségük van egy másik folyamat eredményére vagy valamilyen adatára. Ezek nem tudnak futni még akkor sem, ha processzoridőt kapnának.\\ +\newpage + \noindent A csoportok között az alábbi négy átmenetet különböztethetjük meg: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Futó $\rightarrow$ Blokkolt + \begin{itemize} + \item Várni kell még valamire. A futó folyamat nem tudja folytatni a futását, mert valamilyen bemeneti adatra van szüksége. Ez akár egy másik folyamat eredménye is lehet. + \end{itemize} + \item Futó $\rightarrow$ Futásra kész + \begin{itemize} + \item Ez egy természetes átmenet. Egyszerűen lejárt az aktuális folyamat processzorideje, és az operációs rendszer a folyamatot a futásra kész, várakozó folyamatok csoportjába sorolja. + \end{itemize} + \item Futásra kész $\rightarrow$ Futó + \begin{itemize} + \item Az előző átmenet fordítottja. Az operációs rendszer ütemezője a futásra készen várakozó folyamatok csoportjából a soron következő folyamatot futtatja. A sorrendről az ütemező dönt, a folyamatok nem nagyon tudnak róla, hogy melyikük fog következni. + \end{itemize} + \item Blokkolt $\rightarrow$ Futásra kész + \begin{itemize} + \item A várva várt adat megérkezett, a blokkolt folyamat marad még a várakozó folyamatok csoportjában, de már futásra készen várja, hogy az ütemező döntése esetén újra futhasson. + \end{itemize} + \end{itemize} + + \noindent A folyamatok négy állapotátmenetét és a hozzájuk tartozó három állapotot szemléletesebb formában az \ref{allapotatmentek}. ábra mutatja. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/allapot.png} + \caption{Állapotátmenetek} + \label{allapotatmentek} + \end{figure} + + \noindent \textit{További állapotok}: alvó, megállított, és zombi. A zombi állapotban ha egy gyermek folyamat befejeződik, de szülője nem hív wait(\&st) hívást, akkor a gyermek bent marad a processztáblában, init folyamat törli ezeket.\\ + + \noindent Egy processzoron egyszerre egy futó folyamat lehet. Üres processzoron az \emph{Idle} folyamat fut, ami nem csinál semmit.\\ + + \noindent Az operációs rendszernek ahhoz, hogy ezeket a folyamatokat helyesen tudja kezelni, felügyelnie kell a folyamatokat. Az operációs rendszerünk így minden egyes folyamatot nyilvántart, és az operációs rendszer lelkének is nevezett ütemező (scheduler) segítségével szépen sorban minden egyes folyamatnak ad egy kis processzor- (CPU) időszeletet, amíg az adott folyamat dolgozik, azaz a processzorra kerülhet. + + \paragraph*{Folyamatok leírása és táblázata} + + \noindent Ahhoz, hogy a folyamatokat megfelelően tudja ütemezni az operációs rendszer, nyilván kell tartani minden olyan információt, ami a folyamat újraütemezéséhez szükséges. A nyilvántartáshoz az operációs rendszer egy táblázatot használ, amit \textbf{folyamattáblázatnak} vagy \textbf{folyamatvezérlő blokknak} (Process Control Block – PCB) neveznek.\\ + + \noindent Ebben a táblázatban minden olyan információ tárolva kell legyen, ami ahhoz kell, hogy a folyamatot a futó állapotából a futásra kész állapotba hozzuk át, majd ha újra futó állapotba kerül, akkor úgy folytathassa a futását, mintha semmi sem történt volna.\\ + + \noindent A teljesség igénye nélkül egy folyamathoz tartozó ilyen adatok: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a folyamat utasításszámlálója, + \item a folyamat veremmutatója, + \item a processzor regisztereinek adatai, + \item a nyitott fájlok állapotinformációja, + \item a memória (kapcsolódó) adatai, + \item stb. + \end{itemize} + +\begin{comment} + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Ez az adatmennyiség nem is olyan kevés, nagyon fontos a mentési és a visszaolvasási hatékonyság. Ha sok időt igényel, akkor az azzal jár, hogy az operációs rendszer ütemezője leköti a rendszererőforrások nagy részét. Bár ezen segít a processzorok egyre nagyobb teljesítménye, de nem lenne elég, ha nem társulna hozzá processzortámogatás. Az x486 processzorcsalád megjelenése óta a folyamatállapot szegmens (Task State Segment – TSS\footnote{Task State Segment, más néven folyamatállapot szegmens. Feladata a folyamatokkal kapcsolatos információk tárolása pl. azonosító, folyamat állapota stb.}, minden folyamatnak van ilyen) segítségével gyorsítja a váltást, illetve a folyamatregiszter (Task Register – TR) tartalmazza az aktív folyamat TSS leíróját. Ennek a cseréje gyors (általában egy-két gépi óraciklus), így ezek révén a folyamatok váltása nagyon hatékony.\\ + + \noindent A folyamattábla legfontosabb mezői (teljesség igénye nélkül): + + \begin{itemize} + \item Kernel információk: + \begin{itemize} + \item a regiszterek, az utasításszámláló, a folyamatállapot, a veremmutató, az aktuális ütemezési prioritás, a maximális ütemezési prioritás, az időzítési egység mérete, a felhasznált processzoridő (CPU idő) stb. + \end{itemize} + \item Folyamatkezelő információk: + \begin{itemize} + \item a kódszegmens-mutató, az adatszegmens-mutató, a szignálállapot, a kilépési állapot, a folyamat azonosítója (PID), a szülőfolyamat azonosítója (PPID), a gyermekfolyamatok processzorideje, a valódi felhasználói azonosító (UID), a valódi csoportazonosító (GID), a folyamat neve stb. + \end{itemize} + \item Fájlkezelő információk: + \begin{itemize} + \item az umask-érték (user mask), a gyökérkönyvtár, a munkakönyvtár, a fájlleírók, a valós felhasználói azonosító (UID), a valós csoportazonosító (GID), a TTY vezérlő stb. + \end{itemize} + \end{itemize} + + \noindent A hardvereszközök kezelésének alapja minden mai operációs rendszerben a megszakításelven működik. Adott egy táblázat, aminek sorszáma a megszakítás\footnote{Egy olyan (általában külső) esemény, amelynek hatására a program futása félbemarad. A megszakításokat egy szám (1 bájt méretű) azonosítja, az int utasításnak is ez a paramétere. A megszakítás azonosító száma alapján a processzor meg tudja állapítani, hogy milyen esemény történt.} számát jelenti, míg a táblázat eleme megadja a kiszolgálórutin címét. Ezt a táblát megszakításvektornak nevezzük. Ilyen kiszolgálási elvre épül az ütemező időzítője is. Ekkor az ütemező, az időzítő kiszolgálórutinja az aktuális folyamatot lecseréli a következőre.\\ + + \noindent Tegyük fel, hogy egy folyamat adatot vár egy lemezegységtől. Az adat hozzáférhetőségét a lemezegység egy megszakításkéréssel jelzi. Ennek kiszolgálása során a kért adatokat a folyamat rendelkezésére bocsátja (a fájlleírók területére másolja), majd a folyamatot blokkolt állapotból futásra készbe állítja, így egy következő ütemezés során a folyamat végrehajtása tovább folytatódik. + $\triangleleft$ \faLightbulbO}\\ +\end{comment} + + \section*{Szálak} + + \noindent A klasszikus operációs rendszerekben minden folyamatnak saját memóriaterülete és saját \lword{címtartománya} van, és egyetlen végrehajtási folyamata. Azaz ha elindítunk egy programot a számítógépen, akkor a program utasítássorozata a kezdetétől az utolsó utasításig egy egyszerű, egymás utáni (szekvenciális) parancssorozatnak tekinthető. Ez ma is jellemzője a legtöbb programnak.\\ + + \noindent Néha előfordul, hogy a feladatunk szempontjából célszerűbb lenne, ha több „párhuzamosan” futó vezérlési szála lenne a folyamatnak. Ilyen eset lehet akár egy számsorozat-rendezési feladat a „Quick Sort” rendezési módszerrel: a sorban keresünk egy „középső” elemet, ami előtt ennél kisebbek, mögötte nagyobb elemek vannak. Így két részre bonthatjuk a sorozatot, és rögtön felötlik bennünk: de jó lenne „párhuzamosan” rendezni az alsó és a felső részt, hiszen ekkor valószínűleg gyorsabban befejeződne a feladatmegoldás.\\ + + \noindent Az ilyen párhuzamosan futó vezérlési szálak használatakor a szálak egy közös memóriaterület foglalnak, amit az eredeti folyamat címtartományából, memóriaterületéből kapnak. A vezérlési szálakat általában egyszerűen szálnak (thread) nevezik, de sokszor találkozhatunk a könnyűsúlyú folyamat (lightweight process) elnevezéssel is.\\ + + \noindent Egy szálnak vannak regiszterei az aktuális változók tárolására, van utasításszámlálója, ami mutatja az aktuálisan következő utasítást, és tartozik hozzá verem is, hiszen a függvények hívási módja megköveteli ennek meglétét.\\ + + \noindent Ha az információkat tárolni kell, márpedig ezek minden szálra egyediek, akkor az adatokat is a folyamatokhoz hasonlóan egy táblázatban célszerű elraktározni. Ebben a táblázatban annyi bejegyzés van, ahány szálat létrehoz a folyamat.\\ +\newpage + \noindent A legjellemzőbb sajátosságok, amelyek egy folyamatban biztosan vannak, de egy szálban \lword{(száltáblában)} pedig biztosan nincsenek, a következők: + \emph{címtartomány}, \emph{globális változók}, \emph{nyitott fájlleírók}, \emph{gyermekfolyamatok}, \emph{jelzések} (szignálok\footnote{Más néven jelzés. Egy esemény bekövetkeztéről szignál küldéssel értesíthetünk egy folyamatot.}), \emph{jelzéskezelők}, \emph{függőben lévő ébresztők}.\\ + + \noindent Egy szálban is biztosan nyilván kell tartani az alábbiakat (természetesen ezek egy folyamathoz is kötődnek): + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item utasításszámláló, + \item regiszterek, + \item verem, + \item szálállapot. + \end{itemize} + + \noindent Természetesen ahogy a folyamatok, úgy a szálak is lehetnek „blokkolt”, „futásra kész” vagy éppen „futó” állapotban. + + \subsection*{Szálak megvalósítása\\} + + \noindent Vannak operációs rendszerek, amelyek nem támogatják a szálak használatát. Ekkor teljes egészében a felhasználónak és a programozási környezetének kell biztosítani a kezelésükhöz szükséges infrastruktúrát. Ilyen felhasználói szintű szálkezelő csomag például a POSIX\footnote{A Portable Operating System Interface for Unix vagy röviden POSIX egy kollektív neve azon szabványok családjának, melyeket az IEEE, a Unix operációs rendszerek meghatározásaként definiált.} P szálak csomagja. + + \paragraph*{1. verzió} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A többszálú program saját ütemezőt tartalmaz, így egyetlen folyamatként fut, a szálak rejtve maradnak az operációs rendszer elől (green thread). + \item Kommunikáció folyamaton belül történik, közös memóriaterületen, nincs szükség \lword{rendszerhívásra}. + \item Szálak közötti kapcsolás felhasználói védelmi szinten történik, nincs szükség hozzá megszakításra, kivételre vagy \lword{renszerhívásra}. + \item Egyik szál blokkolódik operációs rendszer ezt nem tudja, így az egész folyamatot blokkolja. + \end{itemize} + + \noindent A mai operációs rendszerek általában támogatják a szálak használatát, így ezekben a kernel vezérli a szálfolyamatokat is, tehát a száltáblázatot is a kernel tárolja. + + \paragraph*{2. verzió} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden szál külön folyamatként fut, az operációs rendszer nem tud róla, hogy összetartoznak (native thread). + \item Folyamatok egymástól függetlenül blokkolódhatnak vagy kerülhetnek vissza futáskész \lword{állapotba}. + \item Kommunikáció rendszerhívásokon keresztül történik. + \item Szálak közötti kapcsolás lassú. + \item Megoldás: operációs rendszernek tudnia kell a szálakról. + \end{itemize} + + \noindent Látszólag a két változat között nem igazán lehet különbség, ám például a felhasználói szálkezelés jóval hatékonyabb, gyorsabb megoldást eredményez. Ebben az esetben viszont ha egy szál blokkolt állapotba kerül, mert például adatra vár, akkor az egész folyamat blokkolt állapotba jut, hiszen az ütemező nem tud a szálakról. Ebből a meggondolásból ma mindkét rendszerrel találkozhatunk.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + + \noindent Függetlenül a szálak kezelésének módjától, a szálkezeléssel sok probléma merül fel:\\ + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A fork rendszerhívásnál a szülőfolyamat szálait a gyermekfolyamatban is hozzuk létre? + \item Ha egy gyermekszál blokkolódik, például a billentyűzetről való beolvasás miatt, akkor mindkét szálat (a szülőt és a gyermeket is) blokkolni kell? Mindegyik kap az adatokból? + \item A jelzések, szignálok egy része billentyűzetről kezdeményezhető. A SIGINT (billentyűzetkombináció: Ctrl + C) jelzést kinek kell elkapni? Mindegyik szálnak? + \item A szálaknak van saját verme. Ha nem tud az operációs rendszer a szálakról, tehát felhasználói szinten kezeljük, akkor a verem túlcsordulása esetén mit csináljon a kernel? + \end{itemize} + $\triangleleft$ \faLightbulbO}\\ + + \section*{A folyamatok ütemezése} + + \noindent A többfeladatos rendszerekben biztosítani kell azt, hogy az egyik folyamat után mikor és melyik folyamat kapja meg a processzorvezérlést. Az operációs rendszernek azt a részét, ami ennek eldöntéséért felel, \textbf{\emph{ütemező}}nek nevezzük. Azt, hogy mi alapján és hogyan végzi ezt a feladatot az ütemező pedig az \emph{\textbf{ütemezési algoritmus}}nak nevezzük.\\ + + \noindent Biztosan van folyamatváltás: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item ha befejeződik egy folyamat + \item ha egy folyamat blokkolt állapotba kerül (I/O vagy szemafor miatt) + \item ha új folyamat jön létre (újabb rendszerekben) + \item I/O megszakítás bekövetkezés (I/O megszakítás után jellemzően egy blokkolt folyamat, ami erre várt, folytathatja futását) + \item időzítő megszakítás (nem megszakítható ütemezés, megszakítható ütemezés) \\ + \end{itemize} + + \noindent A folyamatokat úgy is osztályozhatjuk, hogy számításigényes vagy input/output-igényes (avagy beviteli/kiviteli, röviden B/K vagy I/O) folyamatról van-e szó. Könnyen belátható, hogy a számításigényes folyamatoknak az a legjobb, ha az ütemező általában hosszú időperiódusra adja meg nekik a processzort, míg az input/output-igényes folyamatoknak a rövidebb periódusidő a megfelelőbb.\\ + + \noindent Az ütemezési algoritmusoktól minden környezetben elvárjuk, hogy pártatlanok, illetve a kiválasztott elveket és a rendszeregyensúlyt megtartók legyenek.\\ + + \noindent Az ütemezési algoritmusok is annak megfelelően csoportosíthatók, hogy milyen rendszerekről is van szó.\\\\ +\newpage + \noindent Ezért megkülönböztetjük az alábbi ütemezési csoportokat: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{\textbf{Kötegelt}} rendszerekben\footnote{Előre meghatározott sorrend szerint végrehajtandó feladatok együttese.} (bár ezek ma már ritkábban használatosak, és nagy, drága rendszerek), fontos a processzor- (CPU-) kihasználtság, az egységnyi idő alatt végrehajtott feladatok száma. + \begin{itemize} + \item Felhasználótól menet közben nem vár adatot + \item Futásához szükséges idő néhány másodperctől több napig terjedhet + \item Kisebb csúszásokat általában észre sem veszi a felhasználó + \item Régen lyukkártyákon voltak az elvégzendőműveletek, ma parancsállományban, amit a felhasználó egyik interaktív folyamata ad át az operációs rendszer számára (pl. időzítve) + \item \emph{Előnye}: a számítógép jó kihasználtsága. + \item \emph{Hátránya}: a feldolgozás menetének megváltoztatására kevés lehetőség van. + \item Példák: pénzintézetek éjszakai vagy hétvégi feldolgozásai (pl. kamatok könyvelése), mentések, hálózati letöltések, víruskeresés\\ + \end{itemize} + \item \emph{\textbf{Interaktív}} rendszerekben\footnote{Párbeszéden alapuló rendszer.} (ilyenek a mai operációs rendszereink), a legfontosabb a felhasználói elvárásoknak való megfelelés és a kérésekre adott gyors válasz. + \begin{itemize} + \item Futás közben állandó kommunikáció a felhasználóval + \item Interakció: felhasználóval való kommunikáció + \item Tipikus interakció: + \begin{itemize} + \item Nagygépes terminálon adatok bevitele Enter‐rel lezárva + \item Karakteres terminálon egy billentyű lenyomása + \item Grafikus felületen egér megmozdítása, gombjának megnyomása + \end{itemize} + \item Tranzakció: két interakció közötti feldolgozás + \item Ha ez lassú (hosszú válaszidő), úgy érezzük, hogy „akad” a gép + \item \emph{Előnye}: a folyamatos beavatkozás lehetősége. + \item \emph{Hátránya}: a processzor alacsony kihasználtsága. + \item Példák: munka a számítógép előtt, azaz szövegszerkesztés, rajzolás, bizonyos játékok\\ + \end{itemize} + + \item \emph{\textbf{Valós idejű}} rendszerekben (ezekből sincs olyan sok a mai hétköznapi környezetünkben), a legfontosabb követelmény az, hogy a megfelelően előírt határidőket (válaszokat, reakciókat) be kell tartani, hiszen ettől valós idejű a rendszerünk. + \begin{itemize} + \item Események történnek, melyekre megadott határidőn belül kell reagálnia egy folyamatnak + \item Lágy valós idejű rendszer: kisebb csúszások megengedettek, de az események torlódása nem + \item Szigorú valós idejű rendszer: kisebb csúszás is katasztrofális következményekkel járhat + \item Különböző fontosságú események lehetnek + \item \emph{Előnye}: azonnali beavatkozásra van lehetőség. + \item \emph{Hátránya}: a gépnek alacsony a kihasználtsága (folyamatosan adatokra vár). + \item Példák:a repülőgép robotpilótája, az üzemek vezérlő számítógépe, és a bankok automatái.\\ + \end{itemize} + + \end{itemize} + + \subsection*{Kötegelt rendszerek ütemezése} + + \noindent Kötegelt rendszerben három fontosabb ütemezést különböztetünk meg.\\ + + \noindent \textbf{Sorrendi ütemezés} [FCFS (First Come First Served)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nem preemptív. + \item Sorrendi ütemezés, nem megszakítható. + \item A legrégebben várakozó folyamatot választja ki futásra. + \item A futásra kész folyamatok egy várakozási sor végére kerülnek, az ütemező pedig a sor elején álló folyamatot kezdi futtatni. + \item Egy folyamat addig fut, amíg nem végez, vagy nem blokkolódik. + \item Ha blokkolódik, a sor végére kerül. + \item Pártatlan, egyszerű, láncolt listában tartjuk a folyamatokat. + \end{itemize} + + \noindent Hátránya: Nagy lehet az átlagos várakozási idő\footnote{Egy munka mennyi időt tölt várakozással (futásra kész állapot, várakozó állapot, felfüggesztett állapotok)}, mert egy hosszú CPU löketű\footnote{A CPU löket idő az ameddig a folyamat a CPU-t használja} folyamat feltarja a mögötte levőket és a perifériák is tétlenek. I/O igényes folyamatok nagyon lassan végeznek\\ + + \noindent Példa: $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 24 & 3 & 3 \\ \hline + \end{array}$\\\\ + + \noindent Végrehajtási sorrend: $\boldsymbol{P_1$, $P_2$, $P_3}$\\ + \noindent Várakozási idő: $P_1$ : \textbf{0} ms, $P_2$ : \textbf{24} ms, $P_3$ : \textbf{27} ms\\ + + \noindent Átlagos várakozási idő: (0+24+27)/3=17 ms\\ + \noindent Átlagos körülfordulási idő: (24+27+30)/3=27 ms \text{(konvoj hatás)} + + \noindent Végrehajtási sorrend: $\boldsymbol{P_2$, $P_3$, $P_1}$\\ + \noindent Várakozási idő: $P_1$ : \textbf{0} ms, $P_2$ : \textbf{3} ms, $P_3$ : \textbf{6} ms\\ + + \noindent Átlagos várakozási idő: (0+3+6)/3=3 ms\\ + \noindent Átlagos körülfordulási idő: (3+6+30)/3=13 ms\\\\ + + \noindent \textbf{Legrövidebb (löket)idejű} [SJF (Shortest Job First)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nem preemptív. + \item Az a program kapja meg a vezérlést, amelyik (várhatóan) a legkevesebb ideig fogja foglalni a processzort a következő perifériaműveletig. + \end{itemize} + + \noindent \textbf{Legrövidebb hátralevő (löket)idejű} [SRTF (Shortest Remaining Time First)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az SJF preemptív változata. + \item Ha új folyamat lesz futásra kész, akkor megvizsgálja hogy a futó folyamat hátralevő löketideje vagy az új folyamat löketideje a kisebb. A környezetváltás idejét is figyelembe veszi. + \end{itemize} + + \subsection*{Interaktív rendszerek ütemezése\\} + + \noindent Körbenjáró [RR: (Round Robin)]: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Preemptív\footnote{Az aktuális processztől a kernel bizonyos idő után elveszi a vezérlést, és a következő várakozó folyamatnak adja} algoritmus. + \item A programokat egy kör mentén rendezzük sorba, egy program leállásakor a körben utána lévő első futóképes program kapja meg a processzort. + \item Garantáltan minden program sorra kerül. + \item Minden folyamat, amikor futni kezd kap egy időszeletet. + \begin{itemize} + \item Ha a CPU lökete ennél nagyobb, az időszelet végén az ütemező elveszi a folyamattól a CPU-t és a futásra kész várakozási sor végére rakja. + \item Ha a CPU löket rövidebb az időszeletnél, akkor a folyamatokat újraütemezzük, és a futó folyamat időszelete újraindul. + \end{itemize} + \item Mindenkinek jut időszelet, aminek végén, vagy blokkolás esetén jön a következő folyamat. + \item Időszelet végén a körkörös listában következő lesz az aktuális folyamat. + \item Pártatlan, egyszerű. + \item Egy listában tárolhatjuk a folyamatokat (jellemzőit), és ezen megyünk körbe-körbe. + \end{itemize} + + \noindent Hátránya: Nehéz az időszelet megfelelő méretének a meghatározása, mert a processz átkapcsolás időigényes. Nagy időszelet átmegy FCFS algoritmusba és interaktív felhasználóknak lassúnak tűnhet pl a billentyűkezelés. Kis időszelet esetén egyenlő mértékben használják a CPU-t, de sok a környezetváltás, ami rontja a teljesítményt.\\ + + \noindent Példa: $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 24 & 3 & 3 \\ \hline + \end{array}$\\ + + \noindent Legyen az időszelet $T_{szelet} = 4 ms$\\ + + \noindent $ + \begin{array}{c|c|c|c|c|c|c|c} + P_{1} & P_{2} & P_{3} & P_{1} & P_{1} & P_{1} & P_{1} & P_{1} \\ \hline + 4ms & 3ms & 3ms & 4ms & 4ms & 4ms & 4ms & 4ms + \end{array}\\\\ + $ + + \noindent \textbf{Időszelet ($T_{szelet}$) hatása a környezetváltás gyakoriságára} \\ + + \noindent $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 10 & 10 & 10 \\ \hline + \end{array}$\\\\ + + \noindent $\begin{array}{c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 \\ \hline + 12 ms & 10 ms & 10 ms & 10 ms \\ + \end{array}$\\\\ + + \noindent Környezetváltások száma: \emph{0}.\\ + + \noindent $\begin{array}{c||c|c|c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 & _{KV_1} | P_1 & P_2 & P_3 \\ \hline + 6 ms & 6 ms & 6 ms & 6 ms & 4 ms & 4 ms & 4 ms \\ + \end{array}$\\\\ + + \noindent Környezetváltások száma: \emph{1}.\\ +\newpage + + \noindent $\begin{array}{c||c|c|c||c|c|c||c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 &_{KV_1} | P_1 & P_2 & P_3 & \cdots & _{KV_9} | P_1 & P_2 & P_3 \\ \hline + 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & \cdots & 1 ms & 1 ms & 1 ms \\ + \end{array}$\\\\ + + \noindent Környezetváltások száma: \emph{9}.\\ + + \subsection*{Prioritásos ütemezés} + + Az egyenlőség, futási erősség jelzésére prioritási szinteket definiálunk, és minden programhoz egy prioritási értéket rendelünk (rendszerint egy egész számot).\\ + + \noindent Például: Unix + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item 0-49 nem megszakítható (kernel) prioritás, + \item 50-127 user prioritás. + \end{itemize} + A legmagasabb prioritással rendelkező programok futnak először. \\ + + \noindent Ennek a módszernek a hátránya, hogy előfordulhat olyan eset mikor egy alacsony prioritású folyamat örökké várakozik. Ezért ezt a módszert így tisztán nem alkalmazzák, a prioritásokat bizonyos idő után korrigálják, hogy az alacsony prioritású programok is sorra kerüljenek.\\ + + \paragraph*{A prioritás meghatározása} + + \noindent A prioritás meghatározása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{belső}: Az OS határozza meg + \item \emph{külső}: Az OS-en kívüli tényező határozza meg + \end{itemize} + + \noindent A prioritás a futás során: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item statikus: végig azonos + \item dinamikus: az OS változtatja + \end{itemize} + + \noindent Prioritást sokszor a löketidő alapján határozzák meg.\\ + + \noindent A löketidő szükséglet meghatározása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a folyamat (felhasználó) bevallása alapján + \item ellőző viselkedés alapján (a korábbi löketidők alapján becsli) + \end{itemize} + + \noindent A kiéheztetés és elkerülése + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Kiéheztetés: A folyamat sokáig (esetleg soha) nem jut processzorhoz + \item Prioritásos algoritmusoknál kiéheztetés felléphet. Ennek kivédése a folyamatok öregítése: A régóta várakozó folyamatok prioritását növeljük.\\ + \end{itemize} +\newpage + \subsubsection*{Prioritásos ütemezési algoritmusok\\} + + \noindent \textbf{Legrövidebb (löket)idejű} [SJF (Shortest Job First)]\\ + + \noindent A kötegelt rendszerben használt algoritmus itt is használható. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A legrövidebb becsült löketidejű folyamatot választja ki futásra. + \item A felhasználó által megadott és az előzmények alapján becsült löketidőt veszi alapul.\\\\ + Az első futási időt jelöljük $T_1$-gyel, a következő időt $T_2$-vel, és vegyünk egy $x$-szel jelölt, egynél kisebb súlyértéket. Ekkor a következő becsült (avagy súlyozott) futási időt tételezzük fel harmadszorra: + \[ + x * T_{1} + (1 - x)T_{2} + \] + \item Legjobb válaszarány (HRR: Highest Reponse Ratio): A folyamat kiválasztásánál a löketidőt és a várakozási időt is figyelembe veszi. Öregítést alakalmaz (aging), azaz a régóta várakozó folyamatok prioritását növeli.\\ + \end{itemize} + + \paragraph*{A garantált ütemezés} + + \noindent Minden aktív folyamat arányos CPU időt kap, nyilván kell tartani, hogy egy folyamat már mennyi időt kapott, ha valaki arányosan kevesebbet akkor az kerül előre.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Ez az ütemezés egy kicsit más szemléletű a korábbiakhoz képest. Ígéretet teszünk, és garantáljuk, hogy ha mondjuk, N folyamat van a rendszerben, akkor egy folyamat körülbelül a teljes processzoridő 1/N részét kapja meg. (Egy egyfelhasználós rendszerben az N jelentse a párhuzamosan működő folyamatok számát.) Ehhez nyilván kell tartanunk a már felhasznált processzoridőt, majd ennek ismeretében kell egy felhasználónak (illetve az ő folyamatainak) rendszeridőt biztosítani. Az ütemező mindig a legkisebb arányszámú folyamatot fogja futtatni addig, amíg ez az arány meg nem haladja egyik „versenytársáét”. + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{A sorsjáték-ütemezés} + + \noindent Mint a garantált ütemezés, csak a folyamatok között „sorsjegyeket” osztunk szét és az kapja vezérlést akinél a kihúzott jegy van.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Az iménti garantált ütemezés világos és egyszerű módszerénél kicsit komplikáltabb a sorsjátéknak a megvalósítása. A sorsjáték-ütemezés annyiban módosítja a garantált ütemezés által adott processzor- (CPU-) arány biztosítását, hogy ebben a folyamatok a megfelelő arányban sorsjegyeket kapnak a processzorütemezéshez. Az időintervallum lejáratakor sorsjegyet húz az ütemező, és amelyik folyamatnál van a sorsjegy, az kapja a végrehajtási jogot. Egy húzás után az adott folyamat természetesen elveszti a húzott sorsjegyet.\\ + + \noindent Látható, hogy amilyen arányban birtokolják a folyamatok a sorsjegyeket, pontosan olyan arányban jutnak processzoridőhöz is. A fontosabb folyamatok több sorsjegyet kapnak (magasabb prioritás), így nagyobb eséllyel (hamarabb) kapnak processzoridőt. Egy új folyamat megjelenésekor könnyű kezelni a helyzetet: kap valahány sorjegyet, és megy az ütemezés tovább. A sorsjáték-ütemezéssel adott arányú erőforrás biztosítása nagyon egyszerű: például egy videokiszolgáló esetén ha egy nagy és egy kis felbontású video-adatfolyam egységnyi adataránya mondjuk 3:1, akkor az ehhez szükséges erőforrástöbbletet ilyen arányú sorsjegyosztással megoldhatjuk. + $\triangleleft$ \faLightbulbO}\\ +\newpage + \paragraph*{Az arányos ütemezés} + + \noindent Úgy működik, mint a garantált, csak felhasználókra nézve.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Egy élelmes felhasználó sok folyamatot elindít, akkor majdhogynem kisajátítja a teljes processzoridőt. Tekintve, hogy ez nem mindig szerencsés, vegyük figyelembe azt, hogy ki éppen egy adott folyamatnak a tulajdonosa. Ekkor például a sorsjáték-ütemezésnél egy felhasználó kap egy adott arányú sorsjegycsomagot, és ezen osztoznak a folyamatai. Ha sok folyamatot indít el, vagy éppen keveset, az nem számít, de azok összes sorsjegye nem változik. + $\triangleleft$ \faLightbulbO}\\ + + \subsection*{Valós idejű rendszerek ütemezése} + + A valós idejű rendszerek kulcsa az idő. Ahogy láttuk korábban, az ütemezési algoritmusok pedig pontosan arról szólnak, hogy adott idő eltelte után ki legyen a következő futó. Ezek esetében is kulcsszerepe van az időnek.\\ + + \noindent Egy operációs rendszerben, ha a feladatainknak nemcsak azt szabjuk meg, hogy hajtódjanak végre valamilyen korrekt ütemezés szerint, hanem az is egy kritérium, hogy egy adott kérést valamilyen időn belül ki kell szolgálni, akkor valós idejű operációs rendszerről beszélünk.\\ + + \noindent A valós idejű ütemezést két kategóriába sorolhatjuk. + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Hard Real Time (szigorú), abszolút, nem módosíthatóhatáridők. + \item Soft Real Time (toleráns), léteznek a határidők, de ezek kis mértékű elmulasztása tolerálható.\\ + \end{itemize} + + \noindent A megfelelő határidők betartása úgy valósítható meg, hogy egy programot több folyamatra bontunk, és ezeknek a rövid (vagy rövidebb) folyamatoknak az ütemező biztosítja a számukra előírt határidő (vagy határidők) betartását. Ha a folyamatoknak egységnyi idő alatt $N$ eseményük van, amelyek elvégzéséhez szükséges összes idő több mint egy, akkor az ilyet kezelhetetlenek tekintjük. Ha az összes idő kisebb, mint egy, akkor a valós idejű rendszer ütemezhető. + + \subsection*{Szálütemezés} + + \noindent Röviden szóljunk befejezésül a szálak ütemezéséről. Két esetről beszélhetünk a szálak ütemezésével kapcsolatban.\\ + + \noindent A felhasználói szintű szálakról az operációs rendszer nem tud, így ebben az esetben az alkalmazás tud mindenről, akár arról is, hogy egy szál elhasználja a folyamat teljes idejét, és a többi szál pedig csak várakozik. Az ilyen szál önző viselkedése nem érinti a többi folyamatot, csakis a szál folyamatát, és esetlegesen a meglévő „testvér” szálait.\\ + + \noindent A kernel rendszerhívásszintű szálakról az operációs rendszer tud, és gyakorlatilag egyenrangúan kezeli azokat a folyamatokkal, tehát minden szál részt vesz az ütemezési folyamatban. Ebben az esetben a szálak közti kapcsolás gyakorlatilag a folyamatok közti kapcsolással azonos erőforrást igényel, és pontosan az a helyzet, mint a korábbi ütemezési algoritmusoknál.\\ + + \noindent A felhasználói szálváltás, amit nem is az ütemező végez, ehhez képest gyors, hiszen nem kell környezetváltást végezni, de ezt az ütemezést az alkalmazásnak kell tartalmaznia! + +\newpage + \section*{Párhuzamosság, kritikus szekciók, kölcsönös kizárás megvalósítása} + + \subsection*{Párhuzamosság és megvalósítása} + + A mai operációs rendszerek majdnem mindegyike a többfeladatos, multiprogramozásos modellt használja. Ez azt jelenti, hogy az operációs rendszer nyilvántartja az éppen „futó” folyamatokat, és gondoskodik arról, hogy ezek szép sorban végrehajtódjanak, biztosítva azt, hogy minden folyamatról úgy érezzük: „folyamatosan” működik.\\ + + \noindent Ebben az esetben néha látszatpárhuzamosságról is beszélünk, különösen akkor, amikor egy processzor (CPU) van a rendszerben, megkülönböztetve ezt attól az esettől, amikor többmagos processzorral kiépített számítógépet használunk, netalán ebből nem is egyet. Ekkor a magok valódi párhuzamos működést mutatnak, ugyanazt a fizikai memóriát használva. Ebben a modellben a folyamatok párhuzamosságának alapja az, hogy a folyamatok egy szekvenciális végrehajtási sorrá alakulnak. Ezekbe a folyamatokba beleértjük az operációs rendszer rendszerfolyamatait is.\\ + + \subsubsection*{Valódi párhuzamosság} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Többprocesszoros rendszerek + \begin{itemize} + \item Akár processzorok százai egy számítógépben + \item Közös sín, közös órajel, akár közös memória és perifériák, gyors kommunikáció + \item Gazdaságos teljesítmény-növelés + \item A megbízhatóságot általában nem növeli! + \end{itemize} + \item Klaszterek (fürtök) + \begin{itemize} + \item Önállóan is működőképes számítógépek együttműködése + \item Egységes rendszer illúziója + \item Lassú kommunikáció (tipikusan helyi hálózat) + \item Magas rendelkezésre állás + \end{itemize} + \end{itemize} + + \subsubsection*{Versenyhelyzetek} + + Amikor a futás kimenete attól függ, hogy melyik folyamat mikor és mennyit futott, azaz a párhuzamos végrehajtás következtében előforduló nem determinisztikus viselkedést versenyhelyzetnek nevezzük.\\ + + \noindent A versenyhelyzeteket nehéz reprodukálni és debuggolni, mivel a program működése nemdeterminisztikus, és az egymással versengő szálak közötti viszonylagos időzítéstől függ. Minden beavatkozás a program működésébe azzal járhat, hogy megváltozik a viszonylagos időzítés, így lehet, hogy a naplózás vagy a debuggoló rendszer teljesen kijavítja a hibát; ezek nélkül a program azonban továbbra is néha hibásan működik.\\ + + \noindent A program bármilyen módosítása újra felszínre hozhatja a hibát, ami ismét csak néha fordul elő.\\ +\newpage + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \emph{Példák}:\\ + + \noindent \emph{Biztonság}: A versenyhelyzetnek következményei lehetnek biztonsági szempontból is. Ez lehetővé teszi, hogy a támadó hozzáférjen a megosztott erőforráshoz, így a többi aktor hibásan kezd viselkedni, ami okozhat szolgáltatásmegtagadást és a jogkör kiterjesztését eredményezheti.\\ + + \noindent \emph{Fájlrendszerek}: Ha két vagy több program egyszerre fér hozzá egy fájlhoz, akkor az adatvesztéshez vagy a jogkör kiterjesztéséhez vezethet.[7] A leggyakrabban alkalmazott módszer a fájlok zárolása. Egy másik lehetőség, hogy egy démonnak kizárólagos hozzáférése van a fájlhoz, és amelyik program hozzá akar férni, azt csak a démonnal kommunikálva teheti. Ez folyamatszintű szinkronizációt igényel.\\ + + \noindent Előfordulhat, hogy ugyan a programok nem férnek hozzá ugyanahhoz a fájlhoz, viszont versengenek egymással más erőforrásokért, tárhelyért, memóriáért, processzoridőért. A nem megfelelően tervezett programok viselkedése megjósolhatatlanná válhat. Egy nagyon megbízható rendszerben egy ilyen hiba sokáig elkerülheti a figyelmet, azonban a tárhely fogytával vagy túl sok program indításával a rendszer több része elveszti stabilitását.\\ + + \noindent \emph{Hálózat}: Egy IRC-hez hasonló elosztott chat hálózatban az a felhasználó, amelyik megnyit egy csatornát, adminisztrátori jogot szerez arra a csatornára. Versenyhelyzet fordul elő, ha két felhasználó két szerverről ugyanazzal a névvel nyit csatornát ugyanoda, akkor mindketten megkapják az adminisztrátori jogot, mivel egyik szerver sem értesült arról, hogy ez a csatorna már meg van nyitva. Ezt a problémát azóta már megoldották.\\ + + \noindent Biztonságkritikus rendszerekben a versenyhelyzet különösen nagy veszéllyel jár, hiszen nagy anyagi kárt, akár halált is okozhat.\\ + $\triangleleft$ \faLightbulbO}\\ + + \subsection*{Kölcsönös kizárás és megvalósítása} + + A megosztott változók, vagy akár a megosztott fájlok használatánál keressük az ideális módszert arra, hogy ezeket az adatokat egy időben egynél több folyamat ne tudja használni (versenyhelyzet elkerülése). Ez azt jelenti, hogy a folyamatoknak kölcsönösen ki kell zárni egymást ezen megosztott erőforrások használata során.\\ + + \noindent A programok futásuk nagy részében végzik a mindenki mástól független számolási, írási, olvasási műveleteket. Azokat az utasításokat, azt a programrészt, amelyben a programunk a közös adatokat használja, kritikus területnek, \textbf{\emph{kritikus szakasznak}} vagy kritikus blokknak nevezzük.\\ + + \noindent Annak biztosítására, hogy a párhuzamosan működő folyamataink korrekten együttműködjenek, ne alakuljon ki versenyhelyzet, az alábbi négy feltételnek kell teljesülni: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Egyszerre legfeljebb egy folyamat lehet a kritikusszakaszban. (\textbf{\emph{Kölcsönös kizárás}}) + \item Ne legyen semmilyen előfeltétel a számítógép sebességéről, a processzorok számáról vagy a memória nagyságáról. + \item A folyamat a kritikus szakaszon kívül ne blokkoljon másik folyamatot. + \begin{itemize} + \item Ha egy folyamat sincs a kritikus szakaszban, és van olyan folyamat, amely be akar lépni, akkor csak a belépni kívánó folyamatok vehetnek részt annak eldöntésében, hogy ki lépjen be, és véges időn belül dönteniük kell. (\textbf{\emph{Haladás}}) + \end{itemize} + \item Egy folyamatnak se kelljen örökké várni arra, hogy sorra kerüljön. + \begin{itemize} + \item A kritikus szakaszba belépni kívánó folyamatok közül minden folyamat előbb-utóbb kerüljön sorra. (\textbf{\emph{Korlátozott várakozás}}) + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/mutex.png} + \caption{A kölcsönös kizárás elvárt viselkedése} + \end{figure} + + \noindent A két folyamat (az „A” és a „B” folyamatok) közti kölcsönös kizárás biztosítja, hogy egyidejűleg csak az egyik lehet a kritikus szekciójában. A „B” folyamat $T_2$ időpillanatban megpróbálja a kritikus szekcióját végrehajtani, de nem teheti, mert az „A” folyamat már a saját kritikus szekciójában van. A $T_2$ és $T_3$ időpillanat között a „B” folyamatnak várakoznia kell arra, hogy be tudjon lépni a saját kritikus szekciójába. + + \subsection*{Megvalósítások} + + \subsubsection*{A kölcsönös kizárás biztosítása a megszakítások tiltásával} + + A legegyszerűbb megoldás a kölcsönös kizárás megvalósítására: a folyamat, mielőtt belépne a kritikus szakaszba, letiltja a megszakításokat, majd miután kilépett a kritikus szakaszból, újra engedélyezi a megszakításokat. Ezzel elérheti, hogy a kritikus szakasza alatt nem történik folyamatváltás, mivel az ütemező az óramegszakítás hatására cseréli le a folyamatokat. Ugyanezt éri el, ha csak az ütemezést vagy a folyamatváltást tiltja le a folyamat.\\ + + \noindent Ez a megoldási módszer valódi párhuzamos folyamatok esetén nem használható, mivel a megszakítások tiltása csak az adott processzorra vonatkozik. Továbbá nem szabad a felhasználói folyamatoknak ekkora hatalmat adni, mivel a rosszindulatú folyamatok nem kapcsolják vissza a folyamatváltást, így átveszik az uralmat a processzor (CPU) felett.\\ + + \noindent Az ismertetett megoldás a felhasználói programok esetén sem használatos, azonban a kerneleken belül gyakran alkalmazott módszer. A kernel a futása alatt tiltja a megszakításokat, így más folyamat nem futhat, amíg a kerneleljárás véget nem ért. Az egyprocesszoros rendszereknél így tudja biztosítani a kernelműveletek atomi voltát (megszakíthatatlanságát).\\ + + \subsubsection*{Szigorú váltogatás} + + A következő megoldásban egy „zálog” nevű változó tartalmazza azt, hogy melyik folyamat léphet be a kritikus szakaszba. + +\newpage + \begin{verbatim} +#define FALSE 0 +#define TRUE 1 +int zalog; + +while( TRUE ) { + while( zálog != sorszámom ); + // Tevékeny várakozás. + kritikus_szakasz(); + zálog = (zálog + 1) % folyamatok_száma; + nem_kritikus_szakasz(); +}\end{verbatim} + + \noindent A második sorban lévő ciklus azt teszteli, hogy beléphet-e a folyamat a kritikus szakaszba, azaz a zálog az ő sorszámával megegyezik-e. A ciklus magja egy üres utasítás, tehát csak a feltételt teszteljük folyamatosan. Ezt tevékeny várakozásnak nevezzük. A tevékeny várakozást általában kerülni kell, mivel nagyon pazarolja a processzor- (CPU-) időt. A másik probléma ezzel a megoldással, hogy a folyamatok sorba léphetnek csak be a kritikus szakaszba, ami megsérti a párhuzamos környezetben egy közös erőforrás használatakor javasolt feltételekből a harmadik feltételt, mivel ezáltal előfordulhat, hogy egy kritikus szakaszon kívüli folyamat sorszámával azonos a zálog, és ekkor ez a folyamat blokkolja a zálogra váró folyamatokat.\\ + + \subsubsection*{Peterson megoldása (1981)} + + G. L. Peterson javította a szigorú váltogatást. Tegyük fel most azt, hogy két folyamat verseng egymással a közös erőforrás használatáért (processz = 0 és processz = 1). Mielőtt a folyamat belépne a kritikus szakaszba, meghívja a „belepes” eljárást, a kritikus szakasz végén pedig meghívja a „kilepes” eljárást. A „belepes” eljárás biztosítja, hogy szükség esetén várakozni fog a folyamat (mindezt tevékeny várakozással). + + \begin{verbatim} +#define FALSE 0 +#define TRUE 1 +#define N 2 +int zalog; +int verseng[N]; + +while( TRUE ) { + belepes(processz); + kritikus_szakasz(); + kilepes(processz); + nem_kritikus_szakasz(); +} + +void belepes(int proc) { + int masik = 1 - proc; + verseng[proc] = TRUE; + zalog = proc; + while(zálog == proc && verseng[masik] == TRUE); + // Tevékeny várakozás. +} + +void kilepes(int process) { + verseng[process] = FALSE; +}\end{verbatim} + + \noindent A megoldás lényege az, hogy a \emph{verseng} nevű vektorban tároljuk azt, hogy mely folyamatok akarnak belépni a kritikus szakaszba. Ha csak az egyik folyamat akar belépni a kritikus szakaszba, akkor a \emph{zalog} az övé lesz, ha a másik folyamat nem verseng. Tehát a várakozó ciklust „átugorjuk”. Ha ezután a másik folyamat is belép, akkor a \emph{zalog} nála lesz, de a \emph{verseng} nevű vektorból azt látja, hogy a már belépett folyamat verseng, tehát várakozni fog addig, amíg a kritikus szakaszból ki nem lép a folyamat, és meg nem hívja a \emph{kilepes} eljárást. A \emph{kilepes} eljárás a \emph{verseng} nevű vektornak a folyamat sorszámával indexelt elemét FALSE-ra állítja.\\ + + \paragraph*{A TSL utasítás használata} + + Szoftveres megoldás helyett hardveresen biztosított a kritikus szakaszba lépés.\\ + + \noindent TSL (Test and Set Lock) utasítás, melynek működése a következő: + \begin{verbatim} +boolean TSL (boolean & zár) { + boolean érték = zár; + zár = true; + return érték; +} + \end{verbatim} + + \noindent A TSL utasítástól elvárt, hogy legyen + \begin{itemize} + \item atomi + \item megszakíthatatlan, és + \item ugyanarra a zárra egyszerre csak egy processzor hajthatja végre + \end{itemize} + + \noindent Ez által a szinkronizáció jóval egyszerűbbé válik: + \begin{itemize} + \item Belépés: + \begin{verbatim} + while (TSL(zár)) + ; /* várakozik */ + \end{verbatim} + \item Kilépés: + \begin{verbatim} + zár = false; + \end{verbatim} + \end{itemize} + + \noindent A modern processzorokban általában van ilyen utasítás, viszont a \emph{korlátozott várakozás feltétele} nem teljesül! + + \subsubsection*{TSL + korlátozott várakozás} + + A várakozó folyamatok nyilvántartásával kijavítható a megoldásunk: + + \begin{itemize} + \item Belépés: + \begin{verbatim} +#define FALSE 0 +#define TRUE 1 + +várakozik[i] = TRUE; +while (várakozik[i] && TSL (zár)) +; /* vár */ +várakozik[i] = false; + \end{verbatim} + \item Kilépés: + \begin{verbatim} +j = i + 1; +do { + j = (j + 1) % n; +} while (j != i && !várakozik[j]); +if (j == i) + zár = false; +else + várakozik[j] = false; + \end{verbatim} + \end{itemize} + + \noindent Ez már mindhárom követelménynek eleget tesz (kölcsönös kizárás, haladás, korlátozott várakozás). + + \paragraph*{Az alvás-ébredés módszere} + + Az előzőekben említett megoldások komoly problémájának róható fel az, hogy tevékeny várakozással oldották meg a problémát, azaz egy ciklusban vizsgálták, hogy beléphetnek-e a kritikus szakaszba, vagy sem. Ezzel a módszerrel feleslegesen sok processzor- (CPU-) időt pazaroltak. A tevékeny várakozás a processzoridő pazarlása mellett fordított prioritási problémának nevezett hibalehetőséget is magában rejti. Tegyük fel, hogy az operációs rendszer prioritásos ütemezőt használ. Amíg van magas prioritású futásra kész folyamat, addig alacsonyabb prioritású folyamatot nem futtat. Legyen egy alacsony prioritású folyamat, amelyik a kritikus szekciójában van; ekkor egy magas prioritású folyamat tevékeny várakozásba kezd, amit az alacsonyabb prioritású folyamat tudna feloldani, ha be tudná fejezni a kritikus szekcióját, de soha nem kerül a processzorhoz, mivel az ütemező mindig a magas prioritású tevékenyen várakozó folyamatot választja.\\ + + \noindent A tevékeny várakozás feloldására javasolt egyik eszköz a sleep-wakeup páros. A sleep egy olyan rendszerhívás, amely blokkolja a hívó folyamatot, a wakeup pedig olyan rendszerhívás, amely felébreszti a paraméterül kapott alvó folyamatot. + + \paragraph*{Példa az alvás-ébredés módszerére: a gyártó-fogyasztó probléma} + + A sleep-wakeup használatára tekintsük példaként a gyártó-fogyasztó problémát. Van egy gyártó és egy fogyasztó folyamatunk. A gyártó termel, és a termelt árut elhelyezi egy tárolóban.\\ A fogyasztó fogyaszt úgy, hogy a tárolóból kiveszi az árut. A tároló kapacitása véges + \begin{itemize} + \item ha megtelik, a gyártást le kell állítani; + \item ha kiürül, a fogyasztónak várnia kell, amíg újra áru kerül a tárolóba. + \end{itemize} + + \noindent Amikor a gyártó egy új árut rak a tárolóba, és a tároló megtelik, akkor elmegy aludni, majd amikor a fogyasztó kivesz árut a tárolóból, akkor felébreszti a gyártót. Fordítva is hasonlóan: amikor a fogyasztó szeretne kivenni árut a tárolóból, de azt látja, hogy kiürült, akkor elmegy aludni, majd amikor a gyártó árut helyez el a tárolóban, akkor felébreszti az alvó fogyasztót.\\ + + \noindent Legyen egy „DB” nevű változó, amely a tárolóban lévő elemek számát, illetve egy „KAPACITÁS” nevű változó, ami a tároló kapacitását tartalmazza. +\newpage +\begin{verbatim} +#define KAPACITAS 100 +int DB = 0 + +void gyarto() { + while(1) { + gyart(); + if(DB == KAPACITAS) // Megnézi, hogy tele van-e a tároló? + sleep(); // Ha igen, akkor elmegy aludni. + berak(); // Felébresztették, tehát berakhatja az árut. + DB = DB + 1; // A gyártó berakott egy árut a tárolóba. + if(DB == 1) // Ha üres volt a tároló, + wakeup(); // akkor felébreszti a fogyasztót. + } +} + +void fogyaszto() { + while(1) { + if(DB == 0) // Megnézi, hogy üres-e a tároló? + sleep(); // Ha igen, akkor elmegy aludni. + kivesz(); // Felébresztették, tehát kivehet egy árut. + DB = DB - 1; // A fogyasztó kivett egy árut a tárolóból. + if(DB == N - 1) // Ha tele volt a tároló, + wakeup(); // akkor felébreszti a gyártót. + feldolgozas(); + } +} +\end{verbatim} + + \noindent Versenyhelyzet előfordulhat ebben a megoldásban. Tegyük fel azt, hogy a tároló üres, és a fogyasztó kiolvassa a „DB” nevű változó értékét, majd az ütemező átadja vezérlést a gyártónak, aki betesz egy árut a tárolóba, és növeli a „DB” nevű változó értékét egyre. A gyártó látván azt, hogy a „DB” nevű változó értéke eggyel egyenlő (azaz DB==1), ébresztést küld a fogyasztónak, aki még nem alszik (tehát az ébresztés elmarad). Amikor a vezérlés visszakerül a fogyasztóra, a korábban kiolvasott „DB” nevű változó nulla értéke miatt (azaz DB==0) elmegy aludni. A gyártó szép lassan megtölti a tárolót, majd elmegy ő is aludni. Ezt követően mindkét folyamat alszik, és a másikra vár, hogy felébressze. Tehát így „örökké” aludni fognak. A probléma akkor történt, amikor a nem alvó folyamatnak küldtek ébresztést. Ez az ébresztés elveszett. Meg lehetne oldani, hogy az ilyen ébresztést elrakjuk, és amikor el akarna aludni a folyamat, akkor megnézi, van-e talonba ébresztése; ha igen, akkor nem alszik el, csak a talont felhasználja. +\newpage + \subsubsection*{Sorszámhúzásos szinkronizáció} + + A sorszámhúzós szinkronizáció tetszőleges számú folyamatra alkalmazható. Működése az ügyfélfogadó rendszerek mintájára épül. + + \noindent Implementáció: kezdetben sorszám[1..n] = 0 + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Belépés (i. folyamat): + \begin{verbatim} + sorszámot_húz[i] = TRUE; + sorszám[i] = max(sorszám[1..n]) + 1; + sorszámot_húz[i] = FALSE; + for (j = 0; j < n; j++) { + while (sorszámot_húz[j]); /* vár */ + while (sorszám[j] != 0 && (sorszám[j], j) < (sorszám[i], i)) + ; /* vár */ + } + \end{verbatim} + \item Kilépés: + \begin{verbatim} + sorszám[i] = 0; + \end{verbatim} + \end{itemize} + + \noindent Ez mindhárom követelménynek eleget tesz (kölcsönös kizárás, haladás, korlátozott várakozás). + + \section*{Szemaforok, osztott memória, üzenetküldés} + + \subsubsection*{Szemaforok} + + E.W. Dijkstra(1965) javasolta ezen új változótípus bevezetését. A szemafor egy új, egész értékű típus. Általános célú megoldás, a szinkronizáció megkönnyítésére. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Ha a szemafor értéke $> 0$, szabad a pálya, beléphetünk a kritikus szakaszra. + \item Két atomi művelet (plusz kezdőértékadás) + \begin{itemize} + \item Ha belépünk egy kritikus szekcióba, csökkentjük szemafor értékét; + \begin{itemize} + \item \emph{down}(S): Ha S értéke zérus, várakozik, míg S pozitívvá nem válik. Egyébként, ill. ezután S-t eggyel csökkenti.\\ + (Eredetileg: P(S), a holland proberen, megpróbálni szóból.) + \end{itemize} + \item Ha kilépünk egy kritikus szekcióból, növeljük a szemafor értékét. + \begin{itemize} + \item \emph{up}(S): S értékét eggyel növeli. \\ + (Eredetileg: V(S), a holland verhogen, megemelni szóból.) + \end{itemize} + \item Megengedett, hogy egyszerre több down művelet legyen várakozó állapotban + \end{itemize} + \end{itemize} + + \noindent Ha a szemafor tipikus vasutas helyzetet jelöl, azaz 1 vonat mehet át csak a jelzőn, a szemafor értéke ekkor 0 vagy 1 lehet. Ez a \textit{bináris szemafor}, vagy más néven \textbf{\emph{mutexnek}} (Mutual Exclusion) nevezzük, és kölcsönös kizárásra használjuk. \\ + + \noindent Rendszerhívással, felhasználói szinten nem biztosítható a műveletek atomiságának megvalósítása. Művelet elején például letiltunk minden megszakítást. Ha több CPU van, akkor az ilyen szemafort védeni tudjuk a TSL utasítással. Viszont ezek a szemafor műveletek kernel szintű, rendszerhívás műveletek. A fejlesztői környezetek biztosítják. + + \subsubsection*{Szemaforok alkalmazásai} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Kezdetben legyen mutex = 1. + \item Belépés: down(mutex); + \item Kilépés: up(mutex); + \begin{verbatim} +while (1) { + down(mutex); + kritikus_szekcio(); + up(mutex); + nem_kritikus_szekcio(); +} + \end{verbatim} + \item Tetszőleges számú folyamatra működik. + \item Kölcsönös kizárás és a haladás feltétele teljesül. + \item Korlátozott várakozás teljesítése az \emph{up} implementációjától függ. + \item Ha mutex értékét \emph{k}-ról indítjuk, egyszerre legfeljebb \emph{k} darab folyamat lehet a kritikus szekcióban. + \item Már két utasítás felcserélése is gondot okozhat. + \end{itemize} + + \subsection*{Szemaforok implementációja} + + Egyszerű implementáció: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item down(S): + \begin{verbatim} +while (S <= 0); /* vár */ +S = S-1; + \end{verbatim} + \item up(S): + \begin{verbatim} +S = S+1; + \end{verbatim} + \end{itemize} + \noindent Feltételezések: + \begin{itemize} + \item S értékváltoztatásai atomiak + \item A \emph{down} műveletben a ciklusfeltétel hamissá válása és az értékcsökkentés együtt is oszthatatlan művelet + \end{itemize} + + \noindent Általában processzorok speciális utasításai segítik az implementációt.\\ + + \noindent A szemafor és a mutex közti különbség: Az a különbség, hogy míg utóbbi csak kölcsönös kizárást tesz lehetővé, azaz egyszerre mindig pontosan csakis egyetlen feladat számára biztosít hozzáférést az osztott erőforráshoz, addig a szemafort olyan esetekben használják, ahol egynél több - de korlátos számú - feladat számára engedélyezett a párhuzamos hozzáférés + + \subsection*{Monitorok} + + A szemaforral ellentétben a monitor egy magasabb szintű, objektum elvű, objektumorientált művelet. Ezt a programszerkezetet C.A.R Hoare angol programfejlesztő dolgozta ki 1974-ben. \ + + \noindent A monitor objektum egy több szál által használt eljárás nem párhuzamos végrehajtását teszi lehetővé, azaz nem folyamat szintű művelet. Ötvözi az objektum orientált programozást a szinkronizációs metódusokkal.\\ + + \noindent A monitor objektuma következőkből áll: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item osztott adat + \item ezeket az adatokat feldolgozó eljárások + \item monitort inicializáló metódusok + \end{itemize} + + \noindent A megvalósításhoz három dologra van szükség: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item feltételváltozó és + \item két művelet + \begin{itemize} + \item wait(): Az állapot bekövetkeztére vár, eközben más folyamatok is beléphetnek a monitorba + \item signal(): Jelzi az állapot bekövetkeztét. Ha nincs az állapotra váró folyamat, nem csinál semmit; egyébként kiválaszt egy várakozó folyamatot, és felébreszti + \end{itemize} + \end{itemize} + + \noindent A kritikus adatokhoz csak szinkronizált műveleteken keresztül lehet hozzáférni.\\ + + \noindent Minden eljárás halmazt egy monitor kontrolál. A többszálas alkalmazás futásakor, a monitor egyetlen szálnak engedélyezi egy adott időpontban az eljárás végrehajtását. Ha egy szál éppen egy monitor által kontrolált eljárást akar futtatni akkor az lefoglalja a monitort. Abban az esetben ha a monitor már foglalt akkor a belépni szándékozó szál várakozik amíg a monitort lefoglaló szál befejezi az adott eljárás végrehajtását és felszabadítja a monitort.\\ + + \noindent Előnye, hogy a közösen használandó erőforrások és az erőforrásokon végrehajtható műveletek egyetlen szintaktikus egységben helyezkednek el.\\ + + \noindent A monitor és a szemafor összehasonlítása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A monitor magasabb szintű eszköz. Magas szintű, objektumorientált nyelvek esetében (pl. Java) roppant egyszerűen használható. + \item A szemaforok segítségével rugalmasabban kezelhetők a kritikus szakaszok, hiszen nem kell beágyazott módon, előre elkészíteni az összes kritikus szakaszt. + \item A szemaforokkal több kritikus erőforrás használatát könnyebb általában összekombinálni egy kritikus szakaszon belül. + \end{itemize} + + \noindent Ha olyan osztott, többprocesszoros rendszert használunk, ahol a központi egységeknek saját memóriájuk van, akkor ezek a módszerek nem igazán használhatóak. + + \paragraph*{Az üzenetküldéses paradigma} + + Ha a párhuzamos programot – a programfejlesztés valamilyen szintjén – egymástól független, egymással kommunikáló szekvenciális folyamatok halmazaként fogjuk fel, akkor a kommunikációt tekintve alapvetően kétfajta programozási paradigmáról beszélhetünk. + + \noindent Az első az osztott memóriás modell, amelyben a futó folyamatok ugyanahhoz a (nem feltétlenül fizikai) memóriához férnek hozzá.\\ + + \noindent A második pedig az üzenetváltásos modell, amelyben minden egyes folyamat a többi által nem elérhető memóriát használ, a kommunikációt pedig a folyamatok közötti (szinkron, aszinkron, illetve a kettő közötti átmenetnek megfelelő) üzenetek biztosítják.\\ + + \noindent Az, hogy a programfejlesztési modellünk üzenetváltásos modell, nem jelenti feltétlenül azt, hogy végül az implementált programnak is feltétlenül „üzenetváltásos” hardveren kell futnia.\\ + Természetesen igaz az, hogy az üzenetváltásos modellnek megfelelő algoritmusok, programok egyszerűbben és általában hatékonyabban implementálhatók üzenetváltásos architektúrákon. (Valamint az osztott memóriás modell alapján készült programok egyszerűbben és hatékonyabban implementálhatók osztott memóriás hardveren.) + + \subsection*{Osztott memória} + + A megosztott memória segítségével megoldható, hogy különböző folyamatok ugyanazt a \lword{memóriaterületet} közösen használják. A közösen használt memóriaterület lehetőséget ad az adatok megosztására és a gyors kommunikációra. A rendszer csak a hozzáférési jogosultságokat kezeli, tehát az egyidejű közös erőforrás-használat következményeként versenyhelyzet alakulhat ki. A versenyhelyzetek kezelése a felhasználói folyamatok feladata.\\ + + \noindent Közös memórián keresztül történő adatcsere esetén az együttműködő folyamatok mindegyike saját címtartományában lát egy közös memóriát. A közös memória elérését (a közös memória címtartományára kiadott olvasás vagy írás művelet végrehajtását) valamilyen adatátviteli rendszer (kapcsolóhálózat, sín stb.) teszi lehetővé.\\ + + \noindent A folyamatok párhuzamos futása miatt a közös memóriát egyidejűleg több folyamat is írhatja, illetve olvashatja. Ilyen esetekre a RAM-modell nem határozza meg a memória működését, ezért a közös memóriát a RAM-modell kiterjesztésével kapott PRAM (Pipelined Random Access Memory) modell szerint kell kialakítani.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/shared_memory_sync.png} + \caption{Folyamatok együttműködése PRAM szerint működő közös memórián} + \label{shared_memory_sync} + \end{figure} +\newpage + \noindent A PRAM-modell szerint működő memóriát több processzor írhatja és olvashatja egyidejűleg. Az olvas és ír műveletek egyidejű végrehajtására a RAM-modellhez képest az alábbi kiegészítések vonatkoznak: + \begin{itemize} + \item olvasás-olvasás ütközésekor mindkét olvasás ugyanazt az eredményt adja, és ez megegyezik a rekesz tartalmával, + + \item olvasás-írás ütközésekor a rekesz tartalma felülíródik a beírni szándékozott adattal, az olvasás eredménye vagy a rekesz régi, vagy az új tartalma lesz, más érték nem lehet, + + \item írás-írás ütközésekor valamelyik művelet hatása érvényesül, a két beírni szándékozott érték valamelyike írja felül a rekesz tartalmát, harmadik érték nem alakulhat ki. + \end{itemize} + + \noindent Ezek a szabályok lényegében azt jelentik, hogy az egyidejű műveletek nem interferálhatnak, azaz nem lehet közöttük zavaró kölcsönhatás. Hatásuk olyan lesz, mintha valamilyen előre nem meghatározható sorrendben hajtódnának végre (ezt tükrözi a pipelined elnevezés, arra utalva, hogy a memóriához egy sorosítást végző csővezetéken jutnak el a parancsok). Másként fogalmazva, ezek a műveletek a modell szintjén oszthatatlanok (atomiak).\\ + + \noindent A közös memória használatával történő adatcsere helyes lebonyolításához a PRAM-modell szerint működő memória mellett a folyamatok működésének összehangolása is szükséges (például az adat fogadója akkor olvassa el az adatot, ha a küldő már elhelyezte azt; összetett adatok átadásakor félig átírt rekordot ne kezdjen olvasni a fogadó stb.). Ez ismét a folyamatok szabadon futásának (aszinkronitásának) korlátozását jelenti, azaz szinkronizációt igényel. + + \subsection*{Üzenetküldés} + + Üzenetváltásos adatcsere esetén a folyamatoknak nincs közös memóriája. Az adatátviteli rendszer most a logikai processzorokat kapcsolja össze. Rajta keresztül a folyamatok üzeneteket tudnak küldeni, illetve fogadni. Az üzenetküldésre, illetve fogadásra a folyamatok logikai processzorainak utasításkészletében megfelelő utasítások állnak rendelkezésre. Legyenek ezek a Küld (Send) és a Fogad (Receive) műveletek.\\ + + \noindent A $\text{Küld}(<\text{cím}>,<\text{folyamat}>)$ művelet végrehajtásakor a műveletet végrehajtó folyamat elküldi a saját memóriájának megadott címén tárolt adatot a megadott folyamatnak,\\ a $Fogad(<\text{cím}>,<\text{folyamat}>)$ művelet pedig végrehajtásakor a megadott folyamattól érkező üzenetet a saját memória megadott címén tárolja. + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/messaging_sync.png} + \caption{Folyamatok együttműködése üzenetváltással} + \label{messaging_sync} + \end{figure} + + \noindent Míg gyakorlatilag valamennyi közös memóriás információcserét alkalmazó megoldás a PRAM-modellre alapul, az üzenetközvetítésre nincs egyetlen elfogadott modell. Ha csak a működés logikájával foglalkozunk, és olyan lényeges kérdéseket nem is érintünk, mint az átviteli sávszélesség, az összeköttetés megbízhatósága, az üzenetszerkezet, az átviteli közeg sajátosságai, a kapcsolatépítés esetleges dinamikája, akkor is számos tulajdonságot találunk, amelyekben az egyes megoldások eltérhetnek, és amelyek ismerete fontos a felhasználók (rendszertervezők, programozók, üzemeltetők) számára. A folyamatok kommunikációs műveleteinek tulajdonságaival ezért külön pontban foglalkozunk. + + \subsection*{Folyamatok kommunikációja} + + A folyamatok együttműködésének másik alapmodellje a közös memóriás együttműködés mellett az üzenetváltásos együttműködés, azaz a folyamatok közötti kommunikáció. Az üzenetváltásos együttműködés akkor került előtérbe, amikor realitássá vált több, adatátviteli vonalon, vagy hálózaton keresztül összekapcsolt számítógép együttműködése. + + \noindent Azonkívül, hogy a logikai processzor utasításkészletében szerepel \emph{Küld} és \emph{Fogad} művelet, a kommunikáció működésével, tulajdonságaival kapcsolatban számos nyitott kérdés maradt, és \lword{megállapítottuk}, hogy nincs egyetlen tiszta modell, amelyet a megoldások követnek.\\ + + \noindent Néhány a legkézenfekvőbb kérdések közül: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Milyen megnevezést használhatnak a kommunikáló partnerek, hogy egymásra találjanak? + \item Milyen szemantikai konzisztenciának kell fennállni a küldés és a fogadás között? + \item Milyen járulékos (implicit) szinkronizációs hatása van a kommunikációnak? + \end{itemize} + + \paragraph*{A partner megnevezése} + + Megnevezés tekintetében beszélhetünk közvetlen (direkt), közvetett (indirekt), valamint aszimmetrikus kommunikációról, illetve megnevezésről, továbbá csoportkijelölésről és üzenetszórásról.\\ + + \noindent A közvetlen (direkt) kommunikáció két folyamat között zajlik, mind a \emph{Küld}, mind a \emph{Fogad} művelet megnevezi a partner folyamatot (\ref{direct_communication}. ábra). $P_1$ elküldi a saját címtartományában tárolt $x$ változó értékét $P_2$-nek, aki azt saját $y$ változójába teszi el. (Ha a változók közös címtartományban lennének, egyszerűen $y:=x$ értékadást használhatnánk, így azonban kommunikációs műveletek szükségesek.) + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/direct_communication.png} + \caption{Kommunikáció direkt megnevezéssel} + \label{direct_communication} + \end{figure} + + \noindent Közvetett (indirekt) kommunikáció esetén a partnerek nem egymást nevezik meg, hanem egy közvetítő objektumot, (például postaládát, vagy csatornát). A postaládán keresztül bonyolódó kommunikációt a \ref{indirect_communication}. ábra szemlélteti. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/indirect_communication.png} + \caption{Kommunikáció indirekt megnevezéssel} + \label{indirect_communication} + \end{figure} + + \noindent A postaláda egy általában véges, de elméletileg esetleg korlátlan befogadóképességű, az üzenetek sorrendjét megtartó (FIFO) tároló, amely a \emph{Küld}-\emph{Fogad}, (betesz-kivesz) műveletpárral kezelhető. A $\text{Küld}(<\text{cím}>,<\text{postaláda}>)$ művelet a saját címtartományban elhelyezkedő üzenetet a postaláda következő szabad tárolóhelyére másolja. Ha a postaláda tele van, ürülésig várakozik. A $\text{Fogad}(<\text{cím}>,<\text{postaláda}>)$ művelet a postaládában legrégebben várakozó üzenetet kimásolja a megadott, saját címtartománybeli címre, helyét pedig felszabadítja.\\ + + \noindent A csatorna olyan kommunikációs objektum, amelyik két folyamatot kapcsol össze. A csatorna lehet egyirányú (szimplex), osztottan kétirányú, azaz egyidejűleg egyirányú, de az irány változtatható (félduplex), vagy kétirányú (duplex). Tartalmazhat 0, véges vagy végtelen kapacitású átmeneti tárolót. Egy véges tárolókapacitású duplex csatorna egyenértékű két véges befogadóképességű postaládával, amelyeket csak két folyamat használ, egyiket egyik irányú, másikat az ellenkező irányú adatcserére.\\ + + \noindent A postaláda és a csatorna lazítja a kommunikáló folyamatok közötti csatolást, lehetővé teszi, hogy olyan folyamatok is információt cseréljenek, amelyek nem ismerik egymást. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/asymmetric_communication.png} + \caption{Kommunikáció asszimetrikus megnevezéssel} + \label{asymmetric_communication} + \end{figure} + + \noindent Aszimmetrikus megnevezés esetén az egyik folyamat, az adó vagy vevő, megnevezi, hogy melyik folyamattal akar kommunikálni, a másik partner viszont egy saját be-/kimeneti kaput (port) használ, amelyiket – ha csak egy van – nem is kell megneveznie. Ha az üzenet vevője használ bemeneti kaput, akkor a műveletek alakja $\text{Küld}(<\text{cím}>,<\text{folyamat}>)$, $\text{Fogad}(<\text{cím}>)$. Ez a megoldás azokban az esetekben hasznos, amikor a fogadó folyamat nem ismeri a küldőt, de a küldő ismeri a fogadót, például egy ügyfél folyamat szolgáltatási kérelmet küld egy szolgáltató folyamatnak (kliens–szerver modell). A fordított irányú aszimmetria alkalmazására pedig egy feladat lebontását és szétosztását végző menedzser folyamat és több, munkáért versengő végrehajtó folyamat kapcsolata lehet példa. A küldő a kimeneti port­jára küldi az elvégzendő feladatot tartalmazó üzenetet, a fogadó pedig az első ráérő feldolgozó lesz (farmer–worker modell).\\ + + \noindent Csoportkommunikáció esetén az üzenet küldője folyamatok (esetleg kommunikációs objektumok) egy csoportját nevezheti meg vevőként. Ilyenkor egyetlen üzenetküldő művelet végrehajtása azt eredményezi, hogy az üzenetet a csoport valamennyi tagja megkapja. Az üzenetszórás (broadcasting) logikailag a csoportkommunikáció azon esete, amikor az egyetlen művelettel elküldött üzenet a rendszer valamennyi folyamatához eljut (\ref{broadcasting_communication}. ábra).\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/broadcasting_communication.png} + \caption{Kommunikáció üzenetszórással} + \label{broadcasting_communication} + \end{figure} + + \noindent A csoportkommunikáció lehetősége lényegesen egyszerűsíti a küldő műveleteit, ha több folyamattal akarja ugyanazt az információt közölni. Bizonyos típusú fizikai átviteli közegeken a csoportkommunikáció igen hatékonyan valósítható meg (például sín-topológiájú összeköttetések, \lword{rádiókommunikáció}). + + \paragraph*{Szemantikai konzisztencia} + + Most azt szeretnénk tisztázni, hogy mi történik a kommunikációs műveletek végrehajtásakor, milyen hatása van a műveleteknek az egyes folyamatok ál­la­­potterére (változókra, kommunikációs objektumokra), milyen minimális kon­zisztencia-feltételt kell betartani a műveletek megvalósításakor.\\ + + \noindent Az üzenetváltásos modell akkor került előtérbe, amikor több számítógépet kapcsoltak össze egy rendszerré adatátviteli vonalon, vagy hálózaton keresztül. Ilyenkor fel kell készülni olyan rendkívüli esetekre is, hogy a partner folyamatot futtató számítógépet esetleg kikapcsolták, vagy a nagyobb távolságot áthidaló átvitel közben az adatok sérülnek, hiszen a hibalehetőség lényegesen nagyobb, mint az egyetlen chipben, dobozban, esetleg egyetlen kártyán elhelyezkedő egységek közötti átvitel esetén.\\ + + \noindent Az üzenettovábbítás műveleteivel szemben ezért elvárás, hogy a műveletet végrehajtó folyamat ne fagyjon be sem átviteli hibák, sem a partner folyamatok kiesése esetén, és a kommunikációs műveletek helyes vagy hibás végrehajtásáról szerezzen tudomást.\\ + + \noindent A műveletek helyességének visszajelzésére az egyik szokásos megoldás egy állapotkód visszaadása, amelynek egyik értéke a helyes végrehajtás, további értékei pedig az előforduló hibakódok lehetnek.\\ + + \noindent Egy másik megoldás lehet a logikai processzor szintjén megvalósított hiba-megszakítás, ami a folyamat végrehajtását a hiba felderítéséhez és a folyatáshoz szükséges információk tárolását követően egy hibakezelési pontra (exception handler) irányítja. A partner folyamat kiesését szokásosan a műveletekre megszabott időkorlát (time-out) figyelésével észlelik. A kommunikációs művelet az időkorlát elérésekor hibajelzéssel akkor is befejeződik, ha a partner válaszának hiánya, vagy a kommunikációs közeg hibája miatt az adatcsere még nem történt meg. A folyamatok programozásához megfelelő rugalmasságot nyújt, ha lehetőség van a kommunikációs műveletekre vonatkozó időkorlát paraméterként történő megadására.\\ +\newpage + \noindent A hibajelzéssel és időkorláttal kiegészítve közvetlen kommunikáció esetén a műveletek a következő alakúak: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item $\text{Küld}(<\text{cím}>,<\text{folyamat}>,<\text{időkorlát}>, <\text{hibakód}>)$, illetve + \item $\text{Fogad}(<\text{cím}>,<\text{folyamat}>,<\text{időkorlát}>,<\text{hibakód}>)$.\\ + \end{itemize} + + \noindent Az időkorlát lehetséges értékei között célszerű a 0 és a értéket is megengedni. A 0 várakozás például akkor hasznos, ha egy fogadó folyamat működésének egy pontján csak akkor akar üzenetet fogadni, ha azt már elküldték, egyébként van más teendője. A $<\text{végtelen}>$ várakozás pedig az olyan folyamatok esetén szükséges, amelyiknek nincs teendője, amíg valaki egy üzenettel el nem indítja.\\ + + \noindent A Küld művelet szemantikáját tekintve elsősorban az a kérdés merül fel, hogy okozhat-e várakozást a művelet, és mi az, ami az adatcseréből a művelet befejeződésekor, azaz a folyamat továbblépésekor már megtörtént.\\ + + \noindent A lehetséges megoldásváltozatok közül az egyik véglet: a Küld művelet akkor fejeződik be, amikor az adatcsere teljes egészében befejeződött, a küldött üzenet rendben megérkezett és a helyére került. Ez a megoldás általában a \emph{Küld} művelet várakozását is okozhatja, a végrehajtás során ellenőrzések, esetleg hibajavítások is történhetnek. A megoldás ahhoz hasonló, mint amikor tértivevényes levelet küldünk valakinek, és addig nem lépünk tovább, amíg a tértivevény aláírva vissza nem érkezett.\\ + + \noindent A másik véglet az lehet, hogy a Küld befejeződésekor az üzenet csupán bekerült a kommunikációs rendszerbe, de további sorsáról semmit sem tudunk. Ilyenkor a Küld művelet általában sohasem várakozik. Ez a megoldás ahhoz hasonló, mint amikor valakinek úgy küldünk levelet, hogy egyszerűen bedobjuk a postaládába, és továbbmegyünk.\\ + + \noindent A két véglet között számos köztes megoldás létezhet (például az üzenet elhagyta azt a processzort, amelyiken a küldő folyamat fut stb.).\\ + + \noindent Valamennyi megoldás esetén be kell tartani azt a minimális konzisztencia-feltételt, hogy amennyiben nincs hibajelzés, az elküldött üzenetet tartalmazó terület a küldő folyamat saját memóriájában (a $<\text{cím}>$ tartalma) a \emph{Küld} befejeződése után – akár a következő utasítással – felülírható legyen. Ennek már nem szabad hatással lennie az elküldött üzenetre.\\ + + \noindent A \emph{Fogad} művelet megvalósításai általában várakozást okozhatnak abban az esetben, ha még nem érkezett üzenet. A művelet egyszeri végrehajtása pontosan egy üzenetet helyez el a fogadó folyamat saját memóriájába akkor is, ha esetleg több várakozó üzenet van a folyamat számára a kommunikációs rendszerben. Az üzenetek érkezési sorrendben fogadhatók, minden üzenet csak egyszer, azaz a fogadás törli az üzenetet a kommunikációs rendszerből. Postaláda, illetve bemeneti kapu használata esetén kérdés, hogy a fogadó tudomást szerez-e arról, hogy ki az üzenet küldője. Erre általában szükség van, hiszen az üzenetre gyakran választ kell küldeni. Ha a kommunikációs rendszer ezt az információt nem közli automatikusan, a folyamatoknak kell gondoskodniuk arról, hogy a küldő azonosítható legyen az üzenet tartalma alapján.\\ + + \paragraph*{Járulékos (implicit) szinkronizáció} + + \noindent A kommunikációs műveletek általában a kommunikációban résztvevő folyamatok szabadonfutásának korlátozását okozzák. Az egyes műveletekkel járó szinkronizációs mellékhatás elsősorban a kommunikációs rendszer átmeneti tárolójának (puffer) kapacitásától függ.\\ + + \noindent Tárolás nélküli átvitel esetén a kommunikációs rendszer csak közvetít, de a \emph{Küld} és \emph{Fogad} műveleteknek be kell várnia egymást ahhoz, hogy az információcsere megtörténhessen. A két folyamat ezen utasításaira egyidejűség érvényes (a \emph{Küld} és a \emph{Fogad} randevúja).\\ + + \noindent Véges kapacitású tároló alkalmazása bizonyos keretek között kiegyenlíti a küldő és fogadó folyamatok sebességingadozásait. A fogadó folyamat várakozik, ha üres az átmeneti tároló, a küldő folyamat pedig akkor, ha nincs szabad hely a tárolóban. Ugyanazon üzenet elküldésének meg kell előznie az üzenet fogadását, tehát ezen műveletekre sorrendiség (precedencia) érvényesül. Emellett egy rövid távú szinkronizációs hatás is érvényesül, magának a tárolónak a kezelése általában kölcsönös kizárással valósul meg, azaz két folyamat ugyanazon kommunikációs objektumra hivatkozó kommunikációs műveleteinek megvalósítási részleteit szemlélve egyes szakaszokra kölcsönös kizárás áll fenn.\\ + + \noindent Végtelen kapacitású tároló (csak modellben létezik) esetén a küldő folyamatnak sohasem kell várakoznia, egyébként a véges kapacitású tárolóra elmondottak érvényesek. + + \section*{Be- és kimeneti eszközök ütemezési lehetőségei, holtpontok} + + \subsection*{Be- és kimeneti eszközök ütemezési lehetőségei\\} + + Periféria kezelési módszerek: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Programozott + \begin{itemize} + \item közvetlen szoftver ütemezés + \item lekérdezéses ütemezés + \end{itemize} + \item Megszakításos + \item DMA + \end{itemize} + + \subsection*{Programozott periféria kezelés\\} + + \paragraph*{Közvetlen szoftver ütemezés} + + \noindent Egyes perifériáknál nincs szükség szinkronizálásra mert vagy nincs mihez szinkronizálódni (pl: egy kijelzőt meghajtó regiszter, egyszerű bementi port), vagy a periféria egy művelet elindítása után a következő utasítás végrehajtására már biztosan elkészül (gyors A/D konverter). Az ilyen perifériákhoz a processzor tetszőleges időpontban fordulhat. + + \paragraph*{Lekérdezéses ütemezés} + + \noindent Ha a periféria sebessége olyan, hogy egy perifériás művelet néhány utasítás végrehajtási időn belül fejeződik be, akkor a szinkronizálást státusz figyeléssel célszerű megoldani. + + \noindent Lassú periféria esetében sok várakozással jár , ami alatt a CPU nem végez érdemleges működést. Ezért csak akkor engedhető meg, ha CPU egyéb feladatait így is képes elvégezni . Az igényelt hardver tekintetében általában a lekérdezéses ütemezés a legolcsóbb megoldás. +\newpage + \paragraph*{Program megszakításos periféria kezelés} + + Ha a periféria csak viszonylag hosszú idő vagy előre kiszámíthatatlan idő múlva lesz kész az újabb adatátvitelre, a lekérdezéses ütemezés feleslegesen foglalja a processzor idejét. Ezért ilyenkor interruptos periféria kezelést célszerű alkalmazni.\\ + + \noindent A perifériához fordulást maga a periféria kezdeményezi egy logikai jellel a CPU vagy IT vezérlő interrupt kérő bemenetén. Az interruptot hardvertől függően az IT vonal szintje (szintérzékeny IT), vagy a jel valamely éle (élérzékeny IT) váltja ki.\\ + + \noindent Az IT kezdeményezés hatására valamilyen mechanizmussal előbb-utóbb egy speciális szubrutinra (interrupt rutin) adódik a vezérlés, ami elvégzi a periféria kezelését . Mivel a CPU és a periféria szinkronizálása automatikus, nem kell feleslegesen státusz figyeléssel tölteni az időt.\\ + + \noindent Az interruptos kezelés a program áttekinthetőségét is növeli . Mivel az IT rutinban nem a periféria kezelését szolgáló, ugyanakkor mindig végrehajtandó feladatok is vannak (regiszter mentés, regiszter visszaállítás, stack kezelés), túl sűrűn érkező IT-k szintén leronthatják a CPU kihasználtságát. + + \noindent IT-s periféria kezelést akkor célszerű alkalmazni, ha: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a CPU sebessége elegendő a periféria kezelésére és + \item az interruptok várhatóan nem túl sűrűn jönnek , közöttük a CPU elég sok utasítást képes végrehajtani, vagy + \item ha az interrupt bekövetkezésének időpontja véletlenszerű , de ha bekövetkezik, akkor gyorsan ki kell szolgálni, + \item az interrupt alatt elvégzendő feladatok nem vesznek túl sok időt igénybe, vagy ha igen, akkor azt egyéb IT is megszakíthatja (többszintű IT rendszer). + \item az interruptos szervezés a program strukturáltságát, áttekinthetőségét szolgálja. + \end{itemize} + + \paragraph*{A közvetlen memória hozzáférés (DMA)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Ha a processzor sebessége nem elegendő az adatátvitel lebonyolítására a periféria és memória között, DMA-s kezelést kell alkalmazni. + \item Az ún. DMA vezérlő segítségével a processzort kikerülve, közvetlen adatátvitel lehetséges a memória és a periféria között. Ezt nevezik közvetlen memória hozzáférésnek (Direct Memory Access). + \item A DMA átvitel általában gyorsabb, mintha a CPU végezné (nem kell közben a memóriából utasításokat olvasni és nem kell az adatot a CPU-n keresztül áramoltatni. + \item A DMA-s kezelést tipikusan nagy sebességű, blokkos adatátvitelt igénylő perifériáknál alkalmazzák (winchester, nagysebességű soros adatátvitel stb). + \begin{itemize} + \item \textit{Blokkos eszközök}: Adott méretű blokkban tároljuk az információt. Blokkméret 512 byte - 32768 byte között. Egymástól függetlenül írhatók vagy olvashatók. Blokkonként címezhetőek. Ilyen eszköz: HDD, szalagos egység + \end{itemize} + \end{itemize} +\newpage + \subsection*{Holtpontok (deadlock)} + + Két vagy több folyamat egy erőforrás megszerzése során olyan helyzetbe kerül, hogy egymást blokkolják a további végrehajtásban.\\ + + \noindent \textbf{Definíció}. Folyamatokból álló halmaz \emph{holtpontban van}, ha minden folyamat valamelyik másik folyamat által kiváltható eseményre várakozik.\\ + + \noindent A holtpontban lévő folyamatok tipikusan egy erőforrás felszabadítására várnak.\\ + + \noindent Erőforrások például: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Szemaforral védett memóriaterület + \item I/O eszközök + \item Fájlok, rekordok olvasásának/írásának joga + \item Processzorhasználat joga + \item Új memóriaterület igénylése + \end{itemize} + + \noindent Nem csak az I/O eszközökhöz kötődik, pl párhuzamos rendszerek, adatbázisok, stb. \\ + + \noindent Az egyes erőforrástípusokból több példány is a rendelkezésre állhat. Mindegy, hogy melyiket kapja meg egy adott folyamat.\\ + + \noindent Holtpont létrejöttéhez a következő négy feltételnek egyszerre teljesülnie kell: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textit{Kölcsönös kizárás.} Legyen legalább egy megoszthatatlan erőforrás + \item \textit{Birtoklás és várakozás.} A folyamatoknak nem kell feladniuk az eddig megszerzett erőforrásokat ahhoz, hogy újakat igényelhessenek + \item \textit{Megszakíthatatlanság.} Az erőforrások nem vehetők el a folyamatoktól a beleegyezésük (felszabadításuk) nélkül + \item \textit{Ciklikus várakozás.} Lennie kell egy két vagy több folyamatból álló ciklikus listának, amiben minden folyamat a következő egy erőforrására várakozik + \end{enumerate} + + \noindent Irányított gráffal lehet modellezni a folyamatokat és erőforrásokat. Ha van kör, akkor az holtpontot jelent. \\ + + \subsection*{A holtpontok detektálása } + + A holtpontok detektálásához (észrevételéhez) az operációs rendszernek egyfolytában nyilván kell tartania azt, hogy hogyan osztotta eddig szét az erőforrásokat, mely folyamatoknak vannak ki nem elégített igényei. Ebből a nyilvántartásból kiindulva kell az operációs rendszernek felismernie a holtpont esetleges meglétét. Ehhez egy úgynevezett holtpontdetektáló algoritmust futtat le időnként.\\ + + \noindent A holtpontdetektálás nem egyszerű feladat, mivel nem feltétlenül egy-két folyamat között alakulhat ki ilyen függőség, hanem akár jóval több folyamat is részt vehet egy holtpont kialakulásában, ami lehetséges, hogy „észre sem vehető”, mert nem befolyásol más, rendszer közeli folyamatokat. + + \subsection*{A holtpontok detektálásának stratégiája } + + A holtpontok detektálására adott lehetséges stratégia a következő: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A futó folyamatok közül pontosan azokat válogassuk ki, amely folyamatoknak van valamilyen erőforrásigényük. (Ezek lehetnek ugyanis olyan folyamatok, amelyek egy holtpont létrejöttében részt vehetnek!) + \item Ezt követően a kiválogatott folyamatok közül keressük ki azokat, amelyeknek csak olyan erőforrásigényük van, ami éppen az adott pillanatban kielégíthető, azaz az erőforrás-kezelő a folyamatnak oda tudja adni az erőforrást, mert az éppenséggel szabad. Ezeket a folyamatokat jelöljük meg. + \item Tekintsünk szabadnak minden olyan erőforrást, amit a most kijelölt folyamatunk használ. + \item A második ponttól kezdve ismételgessük az algoritmust addig, amíg el nem jutunk egy olyan állapotba, amelyben már nincsen más kiszolgálható tevékenység. + \end{itemize} + + \noindent Ha a holtpontok detektálására adott eljárás végén marad nem kiszolgálható folyamat, akkor az operációs rendszerben holtpont rejtőzik, és a hátra maradt folyamatok éppen azok a folyamatok, amelyek a holtpont kialakításában részt vesznek.\\ + + \noindent Az algoritmusról könnyen belátható, hogy a holtpontok detektálására adott stratégia végén megkapott folyamatok halmaza nem függ attól, hogy az algoritmus elején melyik folyamatot választjuk ki elsőként.\\ + + \noindent A holtpontdetektáló algoritmus egy úgynevezett „mohó” algoritmus, aminek a gyakori lefuttatása az operációs rendszer hatékonyságát csökkenti. Felmerülhet kérdésként ekkor az olvasóban: mi lehet vajon ennek az algoritmusnak az optimális aktivizálási ideje, azaz vajon milyen időközönként célszerű futtatnunk, hogy az operációs rendszer hatékonysága ne drasztikus mértékben csökkenjen?\\ + + \noindent Erre egy egyszerű meghatározást lehet adni: célszerű azt a megoldást használni, hogy a holtpontdetektáló algoritmus akkor induljon el, ha egy folyamat olyan hosszú ideig várakozik egy erőforrás használatára, hogy már túllép egy előre meghatározott időintervallumot a várakozás.\\ + + \subsection*{A holtpontok megszüntetése\\} + + \paragraph*{A drasztikus megszakítás} + + Ez a módszer úgy oldja meg a holtpont miatti konfliktust, hogy a várakozási körben található összes folyamatot megszakítja. Drasztikus módszer, mivel ebben az esetben a folyamatok eredményei is elvesznek, mivel a megszakítás miatt egyik sem fogja folytatni a tevékenységét.\\ + + \paragraph*{A kevésbé drasztikus, kompromisszumos megoldások} + + \noindent Sokszor elég csak néhány tevékenységet megszakítani, és nem az összes folyamatot. Sőt, sok esetben nem is kell megszakítani ezen kiválasztott folyamatokat sem, hanem csak elég, úgymond, visszaállítani őket egy olyan állapotba, mielőtt a már korábban lefoglalt erőforrásra megadták volna az igénylésüket, és ezzel megnövelték a holtponthelyzet létrejöttének esélyét.\\ +\newpage + \noindent A következő módszerekkel megszüntethető az operációs rendszer által felismert holtpont kevésbé drasztikusan: + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item módszer: Keressük meg azt a folyamatot, amelyik a „legaktívabban” vesz részt a holtpont kialakításában! Többnyire elegendő egyetlen egy ilyen „aktív” holtpont kialakító folyamat eltávolítása. + \item módszer: Keressünk egy olyan folyamatot, amely újraindítható bármiféle mellékhatás nélkül! Természetesen egy adatmódosító művelet nem tekinthető újraindíthatónak, mivel lehet, hogy az újraindításával inkonzisztencia lépne fel az adatok között. + \item módszer: Keressünk meg azokat a folyamatokat, amelyek újraindítása a legkevesebb költséggel jár! Tehát olyan folyamatokat, tevékenységeket keressünk ki, amelyek vagy olyan ellenőrzési pontokkal (checkpoint) rendelkeznek, amelyekre könnyen visszaállíthatóak, vagy éppen „most” kezdték meg működésüket, tevékenységüket. + \item módszer: A holtpontot előidéző folyamatokat a prioritásuk szerint vizsgáljuk meg, és válasszuk ki a legalacsonyabb prioritású folyamatot, majd távolítsuk el, szakítsuk meg a működését, vagy állítsuk vissza valamilyen korábbi megfelelő állapotba, ha lehetséges. + \end{enumerate} + + \noindent A holtpont megszüntető műveleteknél fontos, hogy a holtpont megszüntetésekor az automatikus választás mindig komoly kockázati tényezővel jár. A kockázat mellett figyelembe kell venni azt is, hogy bármilyen módszert választunk is ki a holtpont megszüntetésére, ugyanazt a folyamatot nem választhatjuk ki végtelen sokszor a holtponthoz kapcsolódó folyamatok „várakozási köréből” való eltávolítására, ugyanis ez az adott folyamat kiéheztetését okozná. Törekedni kell az optimális holtpontkezelésre, mivel a kiéheztetésen túl a holtpontkezelés legnagyobb veszélyei közé tartozik, ha az operációs rendszerünk alulszabályozott, vagy éppen túlszabályozott a holtpontdetektálással és a holtpont megszüntetéssel kapcsolatban.\\ + + \noindent Alulszabályozás alatt azt kell érteni, hogy az operációs rendszer olyan nagyfokú túlbiztosítására törekszünk, hogy holtpont sosem alakul ki a futó folyamatok közt az operációs rendszerben, de magának a rendszernek a lehetőségeit sem fogjuk tudni kihasználni. Túlszabályozottság alatt pedig azt kell érteni jelen esetben, hogy olyan bonyolult holtpontdetektáló vagy éppen holtpontmegszüntető algoritmust választunk ki, hogy magának az algoritmusnak a végrehajtása lassítja az operációs rendszert, és csökkenti a rendszer hatékonyságát. + + \subsection*{Holtpontkezelés\\} + + \subsubsection*{Holtpont-megelőzés\\} + + A holtpontokat el tudjuk kerülni, ha garantálni tudjuk, hogy a holtpont létrejöttének négy feltételének valamelyike biztosan nem áll fenn.\\ + + \noindent A holtpont kialakulásához szükséges feltételek elkerülése: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A \emph{\textbf{kölcsönös kizárás}} néhány esetben elkerülhetetlen, így ezekben az esetekben nem lehet mit csinálni, de más esetekben elkerülhető. Az egyik leggyakrabban használt technika az úgynevezett spooling technika (simultaneous peripherial operation on-line), ami annyit teszt, hogy a direkt erőforrás-használat helyett egy általában nagyméretű átmeneti tárolóba helyezzük az erőforrást. + \item Az erőforrások lefoglalása (\emph{\textbf{Birtoklás és várakozás}}) úgy kerülhető el, ha elrendeljük azt, hogy egyszerre csak egy erőforrást foglalhat le egy folyamat, tehát egy folyamat csak akkor igényelhet egy új erőforrást, ha nem birtokol már egy másik erőforrást. + + \noindent Ezt kétféle módon érhetjük el: + + \begin{enumerate} + \item Az összes szükséges erőforrást egyszerre kell igényelni, a folyamat indulásakor + \begin{itemize} + \item Néha a program indulásakor még nem tudja, milyen erőforrásra lesz szüksége + \item Pazarló erőforrás-gazdálkodást eredményez + \end{itemize} + \item Új erőforrás igényléséhez el kell engedni az eddig megszerzetteket + \begin{itemize} + \item Kiéheztetéshez vezethet + \item Kényelmetlen + \end{itemize} + \end{enumerate} + \item A \emph{\textbf{„megszakítás nem megengedett”}} (\emph{Megszakíthatatlanság}) kiküszöbölése, azaz hogy nincs erőszakos erőforrás-elvétel, a következő módon érhető el: hogyha az erőforrásaink menthető állapotúak, akkor elvehetjük az adott folyamattól az erőforrás birtoklásának jogát úgy, hogy mentjük az erőforrás állapotát, majd az erőforrást átadjuk a másik folyamatnak, és mikor a másik folyamat befejezte a működését, akkor az erőforrás régebbi állapotát visszaállítva visszaadjuk az erőforrást az előző folyamatnak. + \begin{itemize} + \item Csak néhány erőforrástípus esetén alkalmazható. Például. processzor, fizikai memória, de I/O eszközök, fájlok esetén nem! + \end{itemize} + \item A \emph{\textbf{visszatérő igények}} (\emph{Körkörös kizárás}) elkerülése úgy érhető el, hogy kialakítunk egy hierarchikus rendszert. Az erőforrásokat kategorizáljuk, és hozzájuk prioritásokat rendelünk. Ez után minden folyamat csak olyan erőforrásokat igényelhet, amelyeknek a prioritása nagyobb, mint amilyen erőforrásai már vannak. + + \begin{itemize} + \item Kizárjuk a hurkok lehetőségét + \item Lehetetlen minden folyamatnak megfelelő sorrendet kitalálni + \item Pazarló erőforrás-gazdálkodás + \end{itemize} + \end{itemize} + + \noindent A feltételek közül az első, illetve a harmadik feltétellel nem tudunk mit kezdeni, mivel az operációs rendszerünkben vagy vannak a feltételek által megállapított fajtájú erőforrások, vagy nincsenek. + + \subsubsection*{Holtpont-elkerülés} + + \paragraph*{A strucc algoritmus} + + A strucc algoritmus a „struccpolitika” elvét vallja, aminek egyszerűen a lényege az, hogy nem veszünk tudomást a holtpont létezéséről. Ha tudjuk azt, hogy egy esetleges holtpont kialakulásának valószínűsége meglehetősen kicsi, és az operációs rendszer újraindításának nincsenek kritikus következményei, akkor előfordulhat, hogy érdemes ezt a „megoldást” választani, mint holtpont „elkerülő” algoritmust. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{Előnyei}: + \begin{itemize} + \item Gyors holtpontelkerülés. + \end{itemize} + \item \emph{Hátrányai}: + \begin{itemize} + \item Adatvesztés, a folyamatok végeredményeinek elvesztése fennállhat. + \item Holtpontok megléte: mivel az algoritmus szerint csak figyelmen kívül hagyjuk a holtpontokat, azaz a holtponthelyzeteket, azok ugyanúgy ott lesznek, és maguktól nem fognak köddé válni. + \item Kritikus következmények esetleges megléte. + \item Nem ajánlott, mivel ez csak egy „struccpolitika”. + \end{itemize} + \end{itemize} + + \paragraph*{Egyetlen foglalási lehetőség stratégia (one-shot allocation strategy)} + + Az egyetlen foglalási lehetőség stratégia lényege az, hogy megtiltja a várakozás közben fellépő erőforrás-lekötést, azaz csak az a folyamat igényelhet magának erőforrást, amelyiknek egy \lword{erőforrásigénye} sincs.\\ + + \noindent A stratégia alkalmazása esetén egy folyamat csak egyetlen alkalommal, általában a folyamat induláskor foglalhatja le azokat az erőforrásokat, amelyekre szüksége van a futása során. A stratégia alkalmat ad arra ezáltal, hogy ha a folyamat indulásakor van olyan erőforrás, amelyet a folyamat nem tud lefoglalni (tehát az adott erőforrás éppen nem szabad), akkor az operációs rendszer a folyamatot várakozásra kényszeríti, és így egy úgynevezett várakozási listára kerül fel. Ezen felül a stratégia még elrendeli azt is, hogy mivel egyetlen alkalommal foglalhatja le csak a folyamat a szükséges erőforrásokat, így a futása során más alkalommal nem nyújthat már be erőforrásigényt az operációs rendszer felé, és ha van is erőforrás-igénylése, akkor az operációs rendszer elutasítja, mivel már rendelkezik erőforrásokkal.\\ + + \noindent Holtpont nem alakulhat ki az operációs rendszernek a futó folyamatai között, mivel a futó folyamatok minden erőforrást elérhetnek, amikre szükségük volt már a futásuk elején, mert ha valamilyen erőforrás megléte (birtoklása) hiányozna, akkor nem futó folyamatok lennének, hanem a várakozási listában várakoznának, illetve ezek a várakozó folyamatok nem rendelkeznek semmilyen erőforrás használatával. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Előnyök: + \begin{itemize} + \item Holtpont nem alakulhat ki a stratégia használata esetén. + \item Ha egy folyamat már megszerezte az összes olyan erőforrást, ami a futásához szükséges, akkor biztosan nem kell sohasem várakoznia a futása során esetleges erőforrás-használat megszerzésére, így a folyamat futási idejét semmilyen erőforrásra való várakozás nem fogja megzavarni, meghosszabbítani. + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item A folyamatoknak a futásuk végéig kell birtokolniuk a futásuk kezdetekor szükségessé vált erőforrásokat, tehát akkor is, ha nincsen rá semmilyen szükségük. Eszerint ez egy nagyon pazarló stratégia. + \item Nem mérhető fel minden esetnem egy folyamat erőforrásigénye már a futás kezdetekor. + \item Kiéheztetés lehetséges fennállása: ha egy folyamat nagyon sok erőforrást igényel, akkor előfordulhat, hogy nem mindegyik elérhető a futásának az elején, így lehetséges az, hogy beláthatatlan ideig várakozásra kényszeríti az operációs rendszer a folyamatot, így egyszerűen kiéheztetve az erőforrásokra vonatkozóan. + \end{itemize} + \end{itemize} + + \paragraph*{Rangsor szerinti foglalási stratégia (hierarchical allocation strategy)} + + \noindent A rangsor szerinti foglalási stratégia a ciklikus várakozási lehetőségét küszöböli ki azzal, hogy az erőforrásokat úgy kategorizálja, hogy minden egyes kategóriához egy-egy sorszámot rendel, és a leggyakrabban használt erőforráshoz a legkisebb sorszámot rendeli, míg a legritkábban használt erőforráshoz pedig a legnagyobb sorszámot, így felállítva közöttük egy úgynevezett prioritási sorrendet.\\ + + \noindent A rangsor szerinti foglalási stratégia lényege a prioritási sorrend megkonstruálása által az, hogy a különböző folyamatok mindig csak növekvő sorszámú erőforrást igényelhetnek az operációs rendszertől, azaz egy folyamat mindig csak magasabb sorszámú erőforrást igényelhet meg az operációs rendszertől, mint amilyen sorszámú prioritást már birtokol.\\ + + \noindent Továbbá, ha egy folyamatnak a meglévő erőforrásainak sorszámainál alacsonyabb sorszámú erőforrásra van szüksége, akkor fel kell szabadítania a szükséges erőforrás sorszámánál nagyobb sorszámú erőforrásokat egészen addig, míg a folyamat erőforrás-igénylési feltételei (lényegében a rangsor szerinti foglaláis stratégia feltételei) nem teljesülnek. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Előnyök: + \begin{itemize} + \item holtpont nem alakulhat ki a stratégia használata esetén. + \item Nagyon hatékony, ha a megfelelő módon történt a sorszámok kiosztása az erőforrásoknak. + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Ha nem megfelelő módon történik a sorszámok kiosztása az erőforrásoknak, akkor nem biztosítható a stratégia hatékonysága. + \item Problémás eset, ha a folyamatnak a meglévő erőforrásai sorszámainál alacsonyabb sorszámú erőforrásra van szüksége. + \end{itemize} + \end{itemize} + + \paragraph*{Bankár-algoritmus} + + Edsger Wybe Dijkstra-tól származik az egyik holtpontelkerülő ütemezési algoritmus, amit bankár algoritmusnak is nevezünk.\\ + + \noindent Az algoritmus neve onnan származik, hogy a probléma nagymértékben hasonló a bankárok munkájához, azaz általánosabban tekintve a bankok erőforrás-kihelyezési problémájához. A hitelt igénylő ügyfelek a bankárhoz fordulnak a beruházásaik finanszírozásához szükséges hitelekért. A bankár az ügyfelek egy meghatározott (a hitelt kérő ügyfeleknek) csoportjával foglalkozik, akiknek folyósít egy bizonyos mennyiségű hitelt. A hiteligénylők a bankárnak megmondják, hogy pontosan mennyi lenne az a maximális pénzmennyiség, amire szükségük lehet, és a bankár ezt folyósítja számukra.\\ + + \noindent Természetesen a bankár nem rendelkezik végtelen mennyiségű készpénzzel, így nem rendelkezik annyi pénzzel sem, ami az összes ügyfél teljes hiteligényét kielégítené egy időpontban. A hitelt csak az az ügyfél tudja visszafizetni, aki be is tudja fejezni a beruházását, amihez a hitelt igényelte eredetileg, ám a beruházás befejezéséhez szüksége van arra, hogy előbb vagy utóbb hozzáférhessen az igényelt hitel teljes pénzösszegéhez. A bankár tudja, hogy nem mindegyik ügyfélnek lesz szüksége azonnal a maximális hitelre, és feltételezi, hogy minden ügyféle a teljes hitel felvételét követően, amint csak tudja, azonnal vissza is fizeti a hitelt.\\ + + \noindent A hitelt csak az az ügyfél tudja visszafizetni, aki be tudta fejezni a beruházást; ehhez pedig szüksége van arra, hogy előbb-utóbb hozzájusson az igényelt hitel teljes összegéhez.\\ + + \noindent Ha a bankár nem elég óvatosan bánik a pénzével, akkor könnyen „megnézheti magát”, mivel kiürülhet a pénzes kasszája, és egyik ügyféle sem fejezné be a beruházását, mivel nem lenne egyiküknek sem pénze, amiből gazdálkodhatna, és folytathatná a beruházást, vagy akár törlessze a hitelt, mert nem kapná meg a hitelének a következő részét.\\ + + \noindent Az algoritmus pontosan azt adja meg, hogy hogyan kell eljárnia a bankárnak az előbb említett (holtpont) helyzetek elkerülésére, feltételezve, hogy csak önmagára számíthat, és nincsen semmilyen segítsége, amire számíthatna?\\ +\newpage + \noindent A bankár algoritmus lényege tehát az, hogy az operációs rendszert mindig egy biztonságos állapotban tartja. A biztonságos állapot a bankár algoritmus esetében azt jelenti, hogy létezik legalább egy olyan erőforrás-igénylés kielégíthetőségi sorrend, amely szerint minden egyes folyamat erőforrás-igénylése kielégíthető. Tehát létezik olyan állapotsorozat, amelynek eredményeként mindegyik ügyfél felvehet összesen annyi kölcsönt, amennyit a hitel lehetősége enged, azaz minden folyamat megkapja az összes erőforrását, majd a tevékenysége után befejeződik. Az algoritmus sohasem elégít ki egy olyan erőforrás-igénylést sem, amely által az operációs rendszer biztonságos állapota nem állna fenn.\\ + + \noindent A bankár algoritmus csak akkor működik, ha a folyamatok már az indulásukkor tudják, hogy a különböző erőforrásokból egyszerre maximálisan mennyit fognak igényelni, illetve ezt az operációs rendszernek be is jelentik.\\ + + \noindent Ha az operációs rendszer állapota nem biztonságos, még nem jelenti azt, hogy a holtpont biztosan kialakul, hanem mindössze csak annyit jelent, hogy lehetséges holtpont kialakulása az adott állapotból. A bankár algoritmus úgy garantálja a holtpontmentességet, hogy már a nem biztonságos állapot kialakulását is megakadályozza, tehát a túlzott biztonságot tartja szem előtt. A módszer legnagyobb hátrányának tekinthető, hogy léteznek olyan folyamatok, amelyeknek erőforrásigénye előre nem ismerhető fel.\\ + + \noindent A bankár algoritmus minden egyes erőforrás-igénylés megjelenésekor elemzést végez, és megnézi, hogy vajon az erőforrás-igénylés engedélyezése esetén is biztonságos marad-e a rendszer. Ha igen, akkor a kérést jóváhagyja, ha nem, akkor a kérést későbbre halasztja. Egy állapot biztonságosságának eldöntésekor a bankár azt elemzi, hogy van-e elegendő erőforrása ahhoz, hogy kielégítse néhány ügyfél hiteligényét. Ha ezt meg tudja tenni, akkor természetesen feltételezi, hogy az ügyfelek a kölcsönöket vissza fogják fizetni, és következhet annak az ügyfélnek a vizsgálata, akinek a hitelfolyósításainak összege a legközelebb van az általa igényelhető maximális hitelmennyiségnek, és így tovább. Ha az ügyfelek minden kölcsönt visszafizetnek a bankárnak, akkor az állapot biztonságos, és a kezdeti erőforrás igénylését a folyamatnak ki lehet elégíteni. + + \section*{Memóriakezelés, virtuális memória fogalma} + + Az alapvető memóriakezelési módszerek két csoportba sorolhatók: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item már a betöltéskor eldől, hogy mi hova kerül, és a futás végéig állandósul a memória, azaz a programon belüli esetleges dinamikus definíciókon kívül a memóriának a „programot” tartalmazó része állandó; + \item végrehajtás közben mozgatják az egyes programrészeket a központi tár és a lemez között (lapozás, szegmentálás); + \end{enumerate} + + \subsection*{Monoprogramozás} + + \noindent A legegyszerűbb memóriakezelési módszer, időben csak egyetlen programot futtatunk. Lényege, hogy a memóriát csak saját programunk, illetve az operációs rendszer között kell „felosztani”. \\ + + \noindent Ezt a felosztást háromféleképpen végezhetjük – a sorrend a kisebb címtől a nagyobb cím felé haladást jelenti: \\ + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item felhasználói program, operációs rendszer a RAM-ban – ezt a felosztást régi nagyszámítógépes rendszerekre, illetve miniszámítógépeken (Commodore, HT-1080Z) használták; + \item operációs rendszer a RAM-ban, felhasználói program – főleg beágyazott rendszerek használják ezt a felosztást; + \item eszközmeghajtók a ROM-ban, felhasználói program, operációs rendszer a RAM-ban – korai személyi számítógépekre jellemző. Lényegében a ROM-ba égetett rész nem más BIOS (Basic Input-Output System). + \end{enumerate} + + \subsection*{Multiprogramozás\\} + + \subsubsection*{Multiprogramozás rögzített partíciókkal} + + \noindent Főleg kötegelt rendszerek tipikus megoldása. + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item[1.] Különböző méretű partíciókat definiálunk és a megfelelő programot a hozzá méretben illeszkedő várakozási sorba rakjuk. Hátránya a megvalósításnak, hogy több várakozási sort (queue) kell nyilvántartani és menedzselni. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/memory_partitioning_individial_queue.png} + \caption{} + \label{memorymanagement_partitioning_iq} + \end{figure} + + \item[2.] Csak egy várakozási sort használunk, ekkor a megüresedett partíció helyére az a program kerül, amelyik a sorban előrébb van és bele is fér a partícióba. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/memory_partitioning_single_queue.png} + \caption{} + \label{memorymanagement_partitioning_sq} + \end{figure} + + Ebben az esetben kis módosítása lehet a kiválasztásnak, hogy nem az első beleférő programot helyezzük bele a partícióba, hanem a beleférők közül a legnagyobbat. Ezzel a módszerrel a partíció veszteséget lehet minimalizálni. \\ + + Egy-egy programválasztás során a partícióba több program fér be, a nem kiválasztottakhoz jegyezzük fel, hogy most éppen nem volt szerencséjük. Ezt a \emph{szerencsétlenség} számlálót növeljük egyel. Megadhatunk egy korlátot $k$, amit ha elér egy vagy több program, akkor a sorban első $k$-t elérő programot választjuk ki. Így nem várakozik végtelen ideig egyik program se a memóriába kerüléshez. + \end{enumerate} + + \subsubsection*{Multiprogramozás cserével} + + \noindent Főleg időosztásos rendszerek tipikus megoldása. + + \noindent Ez a technika az „azonos” időben futó programokat teljes egészében –a méretüknek megfelelően – mozgatja a lemezterület és a memória között. Mivel egy-egy folyamat működésének végeztével felszabadul a memória általa használt része, de nincs mit betölteni, a memóriában lyukak keletkeznek. Emiatt jelentősen csökkenhet a memória kihasználtsága, így szükség van a lyukak „egyesítésére”, amit memóriatömörítésnek nevezünk. Ilyenkor a rendszernek arra kell ügyelnie, hogy bent lévő processzek ne sérüljenek (az esetleges áthelyezések miatt újra kell számolni az utasítások címeit). A következő ábra ezt a csere folyamatot szemlélteti. Az \emph{A} folyamat kikerül a memóriából, a háttértáron kerül elhelyezésre, míg a \emph{B} folyamat a háttértárból a fizikai memóriába kerül.\\ + + \noindent A cserék adminisztrálására kétféle módszert dolgoztak ki. + + \paragraph*{Bittérképes cserekezelés} + + \noindent A memóriát, szónyi vagy kilobájtnyi egységekre osztjuk.(Talán leggyakrabban ma 4KB egységről beszélhetünk, de előfordulhat 2/4 MB is.) Minden egységhez hozzárendelünk egy-egy foglaltsági bitet. Ennek értéke egy, ha foglalt és nulla, ha szabad. Új processz érkezésekor olyan összefüggő szabad területet kell keresni, melyek együttes hossza elegendő az új tevékenység betöltéséhez. Az allokációs területek hosszának tervezésekor figyelembe kell venni, hogy a csere lehetőleg gyors legyen (a keresési algoritmusok is időt igényelnek), valamint ne foglaljon aránytalanul sok memóriát, hiszen akkor megint sehol sem vagyunk.\\ + + \paragraph*{Láncolt listás cserekezelés} + + \noindent Ennél a technikánál egy kétirányú listába fűzzük a memóriában szereplő allokációs elemeket, a szabad helyeket, valamint a valamilyen processz által foglalt területeket. A lista ezek után egy négy elemet tartalmazó rekord: a terület jellege (szabad, foglalt), a terület kezdőcíme, a terület hossza, illetve a következő elem címe (mutató). Célszerű a listát kezdőcím szerint rendezetten kezelni, így egyszerűbb helyet keresni egy új feladatnak, valamint egyszerűbb a lyukakat összevonni. Nézzük meg, hogy milyen módon kereshetünk helyet egy új processznek. Feltesszük, hogy a memóriakezelő tudja az igényelt hely nagyságát: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textbf{firstfit}: megkeresi az első olyan üres helyet, amiben elférünk, majd két részre osztja a területet: az egyik tartalmazza magát a processzt, a maradék rész pedig szabad listaelem lesz; + \item \textbf{nextfit}: az utolsó szabad helytől keres üres területet; + \item \textbf{bestfit}: az egész listában keresi azt a legkisebb szabad területet, ahol elfér a processz. Természetesen az eljárás általában lassabb, mint az előbbiek, viszont helyet talál olyan processzeknek is, amelyeknek az előző két módszer nem talál a nagy helyigény miatt. Azok ugyanis kis igényhez is az első szabad helyet rendelik, ami lehet, hogy nagyobb igénynek is megfelelne; +\newpage + \item \textbf{worstfit}: a legnagyobb szabad lyukat választja; + \item a módszerek javíthatóak azáltal, hogy külön listában kezeljük a foglalt, illetve a szabad területeket. Tovább javítható bizonyos előfeltételek teljesülése esetén: például ha elég egyformák a processzek méretei, akkor a leggyakoribb mérethez külön szabadlistát készítünk, és ebben keresünk. Ezt a módszert \textbf{quickfit} technikának nevezik. + + \end{itemize} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A fejlődés következő foka az volt, amikor lehetőség nyílt arra, hogy ne csak teljes „programok” legyenek a memóriában, hanem csak az éppen működő futó részek. Ehhez a programokat úgynevezett rétegekre kell darabolni az overlay technika révén. Mivel a mozgatást eleve az operációs rendszer végzi, azzal nincsen gond. A technika kezdeti használatakor azonban a darabolást még a programok készítői végezték. Az operációs rendszerrel való megoldás a virtuális memória (1961, Fotheringham). A modern operációs rendszerek képesek arra, hogy látszólag több memóriát biztosítsanak a programoknak, mint amennyi fizikailag a rendelkezésükre áll. A módszert virtuális memóriakezelésnek hívják. + $\triangleleft$ \faLightbulbO}\\ + + \subsection*{Virtuális memória fogalma} + + \noindent A számítógépek korai időszakában a véletlen elérésű memória (RAM) hozzávetőlegesen ezerszer drágább volt, mint a mechanikai tárolók, azaz a mai merevlemezeknek megfelelő tárolók.\\ + + \noindent Jó megoldásnak tűnt, hogy a drága – ezért viszonylag kis tárolókapacitású – gyors memóriába csak az éppen szükséges programrész kerüljön be, a „nem használt” programrészek pedig külső, mechanikus tárolókon helyezkedjenek el. Különösen a több felhasználós (időosztásos) rendszerek esetében látszott előnyösnek ez a megoldás, amikor a program- és felhasználóváltás amúgy is jó alkalmat szolgáltatott arra, hogy a programot cseréljék.\\ + + \noindent A program megállítása helyett több számítógéprendszer a kevéssé használt memóriaterületeket másolja ki mechanikai tárolóra.\\ + + \noindent A mozgatás a háttértár és a memória között viszont nagyon időigényes feladat. A programok rövid idő alatt csak kis részét használják a tárterületnek, valamint az operációs rendszer felelőssége nagy (biztosítania kell, hogy a program ne nyúljon ki a partícióból; ha a partíció túl kicsi, akkor dinamikusan „hozzá kell foglalni”, stb.).\\ + + \noindent A virtuális memória a számítógép RAM memóriáját a merevlemezen egy ideiglenes használatú területtel kombinálja. Ha nincs elegendő RAM memória, a virtuális memória az adatokat a RAM memóriából a lapozófájlnak nevezett területre mozgatja. Az adatok lapozófájlba mozgatása RAM memória területet szabadít fel, mellyel befejezhetők a feladatok.\\ + + \noindent Általánosan elmondható, hogy minél több RAM memória van a számítógépben, annál gyorsabban futnak a programok. Ha a számítógép működését a kevés RAM memória lelassítja, akkor ellensúlyozásként a virtuális memória növelése látszik megoldásnak. Azonban a számítógép az adatokat a RAM memóriából sokkal gyorsabban tudja olvasni, mint a merevlemezről, ezért a RAM memória bővítése jobb megoldás.\\ + + \noindent Az operációs rendszer úgy szabadít fel operatív memóriát az éppen futó program számára, hogy a memóriában tárolt, de éppen nem használt blokkokat (lapokat) kiírja a külső tárolóra, amikor pedig ismét szükség van rájuk, visszaolvassa őket. Mivel a merevlemez sebessége töredéke a memória sebességének, nagyon sok múlik azon, hogy a virtuálismemória-kezelő milyen stratégiát alkalmaz az operatív memóriából kimozgatandó lapok kiválasztásakor. A memóriakezelésnek két fajtája létezik. Az egyik az úgy nevezett lapozás, a másik pedig a szegmentálás.\\ +\newpage + \noindent A virtuális memóriaval szemben támasztott követelmények: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden program saját memóriaterületet lásson (mintha minden memória az övé volna) + \item Bármely címre lehessen hivatkozni, ahol is az adatok permanens tárolódjanak (akárcsak a fizikai memóriában) + \item A program ne tudjon semmit arról, hogy hogyan van ez megvalósítva + \item A hatékonyság ne romoljon drasztikusan a fizikai memóriához képest\\ + \end{itemize} + + \paragraph*{A virtuális memória megvalósítása} + + \noindent A virtuális és a fizikai memóriát is felosztjuk részekre, ezeket egymáshoz rendelhetjük. Ha a folyamat olyan memóriaterületre hivatkozik, amihez még nincs fizikai memória rendelve, akkor kivétel keletkezik $\rightarrow$ ennek kezelését az operációs rendszer végzi, amely folyamán hozzárendel egy fizikai memória részt.\\ + + \noindent Minden program saját címtárral rendelkezik, az ő címei nem hivatkozhatnak másik folyamat fizikai memóriájára, kivéve bizonyos speciális eseteket (pl.: operációs rendszerkódja, adatai; kommunikációs adatok, stb.). \\ + + \noindent A leképezés során a címpárokat tárolni kell, ezt tehetjük: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item byte-onként: rugalmas, de a címtáblázat nagy + \item rögzített méretű darabonként: \emph{lapozás} + \item változó méretű darabonként: \emph{szegmentálás} + \end{itemize} + + \section*{Lapozás és szegmentálás} + + \subsection*{Lapozás} + + A virtuális és a fizikai memóriát is egyenlő méretű darabokra osztjuk: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item virtuális memória $\rightarrow$ lapok, + \item fizikai memória $\rightarrow$ lapkeretek. + \end{itemize} + + \noindent Egy lappal csak akkor dolgozhatunk, ha keretbe foglaltuk, de a keretek száma kevesebb, mint a lapoké. Egy lapon belüli címek egy lapkereten belüli címekké "fordítódnak". A felhasználói programok csak a lapokat látják, mint ha az lenne a fizikai memória.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/paging.png} + \caption{} + \label{paging} + \end{figure} + + \noindent A lapok mérete általában kettő hatványa ($2^k$).\\ + + \paragraph*{Laptábla} + + \noindent A lapok és lapkeretek egymáshoz rendeléseit tartalmazza. Minden folyamatnak külön laptáblája van. A laptábla alapcím szerint indexelt, mezői üresek vagy a lapkeret címét tartalmazzák. Mezői tartalmazzák, hogy a laphoz tartozik-e lapkeret a fizikai memóriában, és ha van ilyen, akkor mi annak a címe. Hivatkozás esetén ez a lapcím keret a táblázatból a lapcím helyére másolódik. Ha nem tartozik hozzá lapkeret: laphiba kivétel történik és a kivételkezelő feladat a lapot valamelyik lapkeretbe elhelyezni. A laphiba kivétel mindig hiba (fault), azaz a végén a kivételt okozó utasítás a kivétel kezelése után újra végrehajtódik. A gyakori lapcím–lapkeret párokat egy gyorsítótárban tároljuk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/paging_address_conversion.png} + \caption{Címfordítás egy lapozó rendszerben} + \label{paging_address_transformation} + \end{figure} + + \paragraph*{A lapméret problematikája} + + \noindent Ha nagy a lapméretünk, akkor kicsit a laptábla, de belső elaprózódás lép fel (a kisebb folyamatok több memóriát kapnak, mint amire szükségük lenne).\\ + + \noindent Ha kicsi a lapméret, akkor kevés memória veszik kárba, ellenben nagy a laptábla, ami viszont sok memóriát eszik. Erre megoldás a két szintű laptáblázat. + + \section*{Lapcserélési algoritmusok} + + Akkor válik szükségessé lapcsere, ha a használni kívánt programrész nincs a memóriában. Ezt az eseményt laphibának nevezik, ami kiváltja a lapcserélési eljárás megindítását.\\ + + \noindent A hiányzó lapot be kell töltenünk vagy létre kell hoznunk egy üres lapot. Ha van üres lapkeret, ezt megtehetjük, ha nincs, akkor „ki kell dobnunk” egy lapot, a kérdés, hogy melyiket. Mivel a laphibakezelése sok erőforrást igényel, a cél a minél kevesebb laphiba.\\ + + \noindent Fontos elemei a virtuális memóriakezelésnek a lapcserélési algoritmusok. Ezek többfélesége egyrészt a fejlődésüket, hatékonyabbá válásukat mutatja, másrészt esetleg ismerve a feladat milyenségét, egyikük valamilyen szempontból jobb lehet egy másiknál. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textbf{Optimális} – egyben megvalósíthatatlan – \emph{lapcserélési algoritmus}. Ennek lényege, hogy a memóriában levő minden lapot megcímkézünk azzal a számmal, amelyik azt jelzi, hogy hány utasítás végrehajtása után kerül erre a lapra „sor”. Nyilván a legnagyobb számú lapot kellene kidobni, de az operációs rendszerek nem tudják megmondani a számot. Ehhez ugyanis először „virtuálisan” le kellene futtatni a programot, ami nyilvánvalóan abszurditás. + + \item \textbf{NRU} (Not Recently Used, nem mostanában használt) algoritmus: + \begin{itemize} + \item Minden laphoz, ami a memóriába kerül, hozzárendelünk még két bitet: egy R bitet, amely minden hivatkozáskor (akár olvasás, akár írás) egyesre állítódik, és egy M bitet, ami módosításkor kap 1-es értéket. Ennek alapján a memóriába lévő lapok négy osztályba sorolhatóak: + \begin{itemize} + \item 0.osztály: 00 (nem hivatkozott, nem módosított) + \item 1.osztály: 01 (nem hivatkozott, módosított) + \item 2.osztály: 10 (hivatkozott, nem módosított) + \item 3.osztály: 11 (hivatkozott, módosított) + \end{itemize} + \item A módszer az, hogy véletlenszerűen kiválaszt a legalacsonyabb sorszámú osztályból egyet, és azt kidobja. Egyszerű módszer, könnyen megvalósítható. + \end{itemize} + \item \textbf{FIFO} (First-In First-Out) \emph{lapcserélési algoritmus}. A sor-adatszerkezet műveleteinek megfelelően lapcsere esetén a legrégebben bent lévő lapot eldobja, és a sor végére teszi az újonnan érkezőt. + \item \textbf{Second chance} (második lehetőség) \emph{lapcserélési algoritmus}. A FIFO olyan módosítása, amelyben a legrégebbi egyes hivatkozású lapot nullás bittel a sor végére teszi, és keresi tovább a megfelelőt. + \item \textbf{Az óra} \emph{lapcserélési algoritmus}: A bent lévő lapokat egy láncnak képzeljük, azaz nincs első és utolsó, eleje meg vége elem, hanem egy aktuális elem, amellyel utoljára volt dolgunk laphiba esetén. Innen indulva szintén az R bitet vizsgáljuk: amennyiben ez egyes, akkor nullára állítjuk, és megyünk tovább. Lényegében az előző algoritmus, csak a kitüntetett elem – ahonnan a keresés indul – az utolsónak hivatkozott változásra mutat. + vizsgáljuk. Ha vizsgált lap hivatkozás bitje 0, akkor kitesszük. + \item \textbf{LRU} (Least Recently Used) \emph{lapcserélési algoritmus}: Talán ez közelíti legjobban az optimális lapcserélést. Statisztikai megfontolásokra támaszkodik: az utoljára használt néhány utasítás által gyakran használt lap valószínűleg továbbra is szükséges lehet; viszont amit régen nem használtunk, valószínűleg még egy darabig nem is kell. Így azt dobjuk el, amelyiket a legrégebben nem használtunk. Az okozhat implementációs nehézséget, hogy minden hivatkozáskor aktualizálni kell a laphivatkozásokat. Ehhez minden lapbejegyzéshez felveszünk egy újabb bejegyzést, amely a lapra hivatkozáskor annak a számlálónak az értékét tartalmazza, amely minden memóriahivatkozás esetén eggyel nő. + HW vagy SW megvalósítás. + \begin{itemize} + \item HW1: Vegyünk egy számlálót, ami minden memória hivatkozásnál 1-gyel nő. Minden laptáblában tudjuk ezt a számlálót tárolni. Minden memóriahivatkozásnál ezt a számlálót beírjuk a lapba. Laphibánál megkeressük a legkisebb számlálóértékű lapot. + \item HW2: LRU bitmátrix használattal, n lap, n x n bitmátrix. Egy k. lapkeret hivatkozásnál állítsuk a mátrix k. sorát 1-re, míg a k. oszlopát 0-ra. Laphibánál a legkisebb értékű sor a legrégebbi. + \end{itemize} + \item \textbf{NFU} (Not Frequently Used) algoritmus: + \begin{itemize} + \item Minden laphoz tegyünk egy számlálót. Minden óramegszakításnál ehhez adjuk hozzá a lap hivatkozás (R) bitjét. + \item Laphibánál a legkisebb számlálóértékű lapot dobjuk ki. (A leginkább nem használt lap) + \item Hiba, hogy az NFU nem felejt, egy program elején gyakran használt lapok megőrzik nagy értéküket. + \item Módosítsuk: Minden óramegszakításnál csináljunk jobbra egy biteltolást a számlálón, balról pedig hivatkozás bitet tegyük be (shr).(Öregítő algoritmus) + \item Ez jól közelíti az \emph{LRU} algoritmust. + \item Ez a lapszámláló véges bitszámú (n), így n időegység előtti eseményeket biztosan nem tud megkülönböztetni. + \end{itemize} + \end{itemize} + + \subsection*{Szegmentálás} + + A memóriát logikailag részekre un. szegmensekre osztják, és minden résznek megvan a saját, 0-tól kezdődő címtartománya. Egy memóriacím így két részből áll, egy szegmenscímből és egy eltolási- (offset) címből, azaz a memória kétdimenziós. Két szinten valósul meg, hardver és operációs rendszer szinten. A lapozással ellentétben ez nem marad rejtve a felhasználó (programozó) előtt.\\ + + \noindent Szegmentálás nélkül egyetlen egydimenziós címterünk lenne, pl.:0-100 címig. Tegyük fel, hogy a programunk két folyamatosan növekvő méretű memóriaterületet használ. Előfordulhat, hogy az első a 0-49. címig tart, a második az 50-től 80-ig. Az első memóriaterületet nem tudjuk tovább növelni, pedig még lenne szabad memória a 81-től kezdődően. A megoldás a szegmentálás. Létrehozunk egy-egy szegmenst a két memóriaterület számára, mindkettő a 0. címtől kezdődik, így mindkét memóriaterületet addig tudjuk növelni amíg a memória el nem fogy.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/segmentation_address_conversion.png} + \caption{Címfordítás egy szegmentációval működő rendszerben} + \label{segmentation_address_transformation} + \end{figure} + + \noindent A szegmensekhez elérési jogok tartoznak: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item írható, + \item olvasható, + \item futtatható. + \end{itemize} + + \noindent Így például a programunk nem írhatja felül saját magát, mert a programkódot egy olyan szegmensben tároljuk, amely csak futtatható.\\ + + \noindent A szegmentálás hasznos osztott programkönyvtárak használata esetén is. Ha a függvények külön-külön szegmensben helyezkednek el, akkor a programkönyvtár újabb verziójával a függvények kezdőcíme nem fog megváltozni, még akkor sem, ha a méretük megváltozik.\\ + + \noindent Kétféleképp lehet megvalósítani: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item cseréléssel + \item lapozással. + \end{itemize} + + \noindent Cserélésnél a rendszer a memóriában csak néhány szegmenst tárol. Kezdetben a szegmensek folyamatosan helyezkednek el. Ha a memória betelt, és egy olyan szegmensre van szükség, amely nincs benn a memóriában, helyet kell neki csinálni, azaz ki kell egyet írni a lemezre. Mivel egy szegmenst csak a vele legalább egyenlő méretű helyre tudunk beilleszteni, a memória előbb-utóbb lyukacsossá válik -mivel a pontos illeszkedés valószínűsége csekély- , ezt hívják külső elaprózódásnak. Ennek elkerülésére több módszer lehetséges. Az egyik, hogy a szegmenseket a memória eleje felé tolják, így a sok apró lyuk helyett a memória végén egy nagy lyuk keletkezik. Egy másik, hatékonyabb módszer, hogy olyan szegmenseket írnak ki a lemezre, amelyek két lyuk közé esnek, így a lyukak mérete nő.\\ + + \noindent Lapozásnál nem teljes szegmensek cserélődnek, hanem ezeket a rendszer fix méretű részekre -lapokra- osztja. Ezeket a lapokat írja ki, vagy olvassa be. A klasszikus lapozáshoz képest, a különbség csak annyi, hogy minden szegmensnek külön laptábla kell. + + \section*{Lemezterület-szervezés, redundáns tömbök, fájlrendszerek szolgáltatásai és jellemző megvalósításaik} + + \subsubsection*{Partíciók} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A partícionálással a lemezt független szeletekre osztjuk. + \item A partíciók az alkalmazások és az OS magasabb rétegei számára általában a lemezegységekhez hasonló eszközként látszanak. + \item Az egyes partíciókat különböző célokra használhatjuk: + \begin{itemize} + \item Nyers partíciók (pl. adatbáziskezelőknek) + \item Virtuális memóriaterület (swap) + \item Fájlrendszer + \end{itemize} + \end{itemize} + + \subsection*{Redundáns tömbök} + + \textbf{RAID} -- Redundant Array of Inexpensive Disks. (olcsó lemezegységek redundáns tömbje)\\ + + \noindent Szoftverből és hardverből is megvalósítható + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Hardver-RAID esetén általában egész diszkeket kötünk össze egy külső vezérlőegységgel, az OS szemszögéből az eredmény egy szokásos lemezegységnek látszik (RAID diszkrendszer) + \item Szoftver-RAID-et az OS valósítja meg, így partíciók felett is működhet + \item A hardver megvalósítás drágább, de hatékonyabb + \end{itemize} + + \noindent Bár nevében szerepel az olcsó (Inexpensive), valójában inkább nem az. Több lemezt fog össze, és egy logikai egységként látja az operációs rendszer.\\ + Többféle ,,összefogási" elv létezik: RAID 0-6 (7).\\ + + \paragraph*{RAID 0 (összefűzés vagy síkozás)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Néhány diszk tárterületének összefűzésével megsokszorozhatjuk az összefüggő(nek látszó) tárkapacitást + \item A logikai diszk blokkjait általában felváltva osztjuk szét a fizikai diszkek szektorai között (striping) + \item Az IO műveletek párhuzamosításával nő a teljesítmény + \item Nincs redundancia + \item Nő az adatvesztés esélye + \item Általában a blokknál nagyobb egységeket kezelünk (stripe), de akár bitszintű szétosztás is lehetséges + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.325\textwidth]{img/raid0.png} + \caption{RAID 0} + \label{ref:raid0} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 0 az egyes lemezek egyszerű összefűzését jelenti, viszont semmilyen redundanciát nem ad, így nem biztosít hibatűrést, azaz egyetlen meghajtó meghibásodása az egész tömb hibáját okozza. Mind az írási, mind az olvasási műveletek párhuzamosítva történnek, ideális esetben a sebesség az egyes lemezek sebességének összege lesz, így a módszer a RAID szintek közül a legjobb teljesítményt nyújtja. A megoldás lehetővé teszi különböző kapacitású lemezek összekapcsolását is, viszont a nagyobb kapacitású lemezeken is csak a tömb legkisebb kapacitású lemezének méretét lehet használni. + $\triangleleft$ \faLightbulbO}\\ + + \noindent A RAID 0 főleg olyan helyeken alkalmazható, ahol nem szempont az adatbiztonság vagy kevés merevlemez csatolható fel az operációs rendszer korlátozása miatt. A másik pozitív tulajdonsága viszont továbbra is csábító lehet olyan, kifejezetten csak játékra épített rendszereknél, ahol ezzel tetemes teljesítménynövekedést érhetünk el. Ilyen célú alkalmazásra mégsem túl ajánlott, mivel az egyszer már összekapcsolt diszkek különálló alkalmazása csak újraszervezés után, a teljes adattartalom eltávolításával és újraformázással lehetséges.\\ + + \noindent A RAID 0 legfontosabb paraméterei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item olvasás: nincs overhead (elemszám * olvasási sebesség) + \item írás: nincs overhead (elemszám * írási sebesség) + \item tárolókapacitás: egyenesen arányos (elemszám * tárolókapacitás) + \item meghibásodási tolerancia: nincs + \end{itemize} + + \paragraph*{RAID 1 (tükrözés)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden adatot két független diszken tárolunk + \item A tárolókapacitás a felére csökken + \item Olvasási teljesítmény nőhet, írás nem változik, vagy kissé csökken + \item Diszkhibából eredő adatvesztés esélye jelentősen csökken + \item Egyszerű, de drága megoldás + \item Nagyon kicsi processzorigény + \item 1 GB adat tárolásához 2 GB diszkterület szükséges + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.325\textwidth]{img/raid1.png} + \caption{RAID 1} + \label{ref:raid1} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 1 eljárás alapja az adatok tükrözése (disk mirroring), azaz az információk egyidejű tárolása a tömb minden elemén. A kapott logikai lemez a tömb legkisebb elemével lesz egyenlő méretű. Az adatok olvasása párhuzamosan történik a diszkekről, felgyorsítva az olvasás sebességét; az írás normál sebességgel, párhuzamosan történik a meghajtókon. Az eljárás igen jó hibavédelmet biztosít, bármely meghajtó meghibásodása esetén folytatódhat a működés. A RAID 1 önmagában nem használja a csíkokra bontás módszerét. + + \noindent A RAID 1 legfontosabb paraméterei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item olvasás: nincs overhead (elemszám * olvasási sebesség) + \item írás: overhead - a tükrözés kétszer annyi írási művelettel jár (elemszám * írási sebesség / 2) + \item tárolókapacitás: a tükrözött elemek fele (elemszám * tárolókapacitás / 2) + \item meghibásodási tolerancia: (elemek száma - 1) elem + \end{itemize} + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{RAID 2 (ECC)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A gépi memóriánál megszokott hibajavító kódok használata (ECC memória) + \item Az adatbitek mellett néhány extra bitet is tárolunk (lásd Hamming kódok) + \item A bájt bitjeit és a hibajavító biteket tároljuk különböző diszkeken + \item Az egyik diszk meghibásodása esetén a paritásbitekből helyreállítható a hiányzó bit + \item pl. 4 diszk kapacitáshoz elég 7 fizikai diszk + \item A gyakorlatban ritkán használt + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/raid2.png} + \caption{RAID 2} + \label{ref:raid2} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 2 használja a csíkokra bontás módszerét, emellett egyes meghajtókat hibajavító kód (ECC: Error Correcting Code) tárolására tartanak fenn. A hibajavító kód lényege, hogy az adatbitekből valamilyen matematikai művelet segítségével redundáns biteket képeznek. A használt eljárástól függően a kapott kód akár több bithiba észlelésére, illetve javítására (ez utóbbi persze több redundanciát igényel) alkalmas. A védelem ára a megnövekedett adatmennyiség. Ezen meghajtók egy-egy csíkjában a különböző lemezeken azonos pozícióban elhelyezkedő csíkokból képzett hibajavító kódot tárolnak. A módszer esetleges lemezhiba esetén képes annak detektálására, illetve kijavítására. Manapság nem használják, mivel a SCSI meghajtókban már minden egyes szektorban az adott szektorhoz tartozó ECC is eltárolódik. + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{RAID 3 (paritásbitek)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A memóriával ellentétben a P lemezegységek jelzik, ha hiba történik + \item Nincs szükség a teljes hibajavító kódra, elég egyszerűen a paritásbitet tárolni (XOR) + \item Az ismert pozíciójú hibás bit ebből helyreállítható + \item Előnyök: + \begin{itemize} + \item Olcsó: n diszk kapacitáshoz elég n+1 diszk + \item Egy blokk írása/olvasása szétosztódik a diszkek között, tehát felgyorsul + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Magasabb CPU igény + \item I/O műveletekben az összes diszk részt vesz, a párhuzamos teljesítmény romlik + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid3.png} + \caption{RAID 3} + \label{ref:raid3} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 3 felépítése hasonlít a RAID 2-re, viszont nem a teljes hibajavító kód, hanem csak egy lemeznyi paritásinformáció tárolódik. Egy adott paritáscsík a különböző lemezeken azonos pozícióban elhelyezkedő csíkokból XOR művelet segítségével kapható meg. A rendszerben egy meghajtó kiesése nem okoz problémát, mivel a rajta lévő információ a többi meghajtó (a paritást tároló meghajtót is beleértve) XOR-aként megkapható. Az alapvető különbség a RAID 2-ben alkalmazott hibajavító kóddal szemben, hogy itt feltesszük, hogy a meghajtó meghibásodását valamilyen módon (például többszöri sikertelen olvasás hatására) észleljük, majd a meghibásodott diszken lévő információt a többi diszken lévő adatok segítségével állítjuk elő. A RAID 2 a diszkhibák ellen is védelmet nyújt, például egyes bájtok megsérülése esetén. (Vegyük észre, hogy csak az XOR-os paritásbit technikát használva az egyik meghajtón egy adott bájt megsérülése esetén csak azt vennénk észre, hogy a különböző meghajtókon az azonos csíkba tartozó részek XOR-a nem nullát adna, de nem tudnánk sem azt, hogy melyik meghajtón van a hiba, sem azt, hogy hogyan javítsuk ki. Ezért van szükség a szektoronkénti hibajavító kód alkalmazására.) + + \noindent A RAID 3-nál kisméretű csíkokat definiálnak, így az egyes fájlok olvasása és írása párhuzamosan történhet az egyes meghajtókon, viszont a módszer nem támogatja egyszerre több kérés párhuzamos kiszolgálását (single-user mode). (Természetesen a paritáscsíkot minden egyes íráskor módosítani kell, amihez szükséges a korábbi tartalom kiolvasása. Viszont például fájltranszfer esetén, pont a kisméretű csíkok miatt, az azonos pozícióban lévő csíkokat általában az összes diszken felülírják, így ez esetben a probléma kevésbé jelentkezik.) + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{RAID 4 (paritásblokkok)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A RAID 0 megoldást egészítsük ki egy P paritásdiszkkel + \item Nincs szükség a bájtok felszabdalására, a paritás független blokkokra is számolható + \item Egy diszk kiesése esetén a paritásdiszk és a többi diszk blokkjaiból helyreállíthatók az adatok + \item Előnyök: + \begin{itemize} + \item A RAID 3-hoz hasonlóan olcsó + \item Egy blokk beolvasásához elég egyetlen diszk, így a független olvasások párhuzamosíthatók + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Az egyedi olvasásműveletek sebessége csökken + \item Az írások nem párhuzamosíthatóak (a paritásdiszket minden írás használja) + \item A diszkek igénybevétele nem egyforma + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid4.png} + \caption{RAID 4} + \label{ref:raid4} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 4 felépítése a RAID 3-mal megegyezik. Az egyetlen különbség, hogy itt nagyméretű csíkokat definiálnak, így egy rekord egy meghajtón helyezkedik el, lehetővé téve egyszerre több (különböző meghajtókon elhelyezkedő) rekord párhuzamos írását, illetve olvasását (multi-user mode). Problémát okoz viszont, hogy a paritás-meghajtó adott csíkját minden egyes íráskor frissíteni kell (plusz egy olvasás és írás), aminek következtében párhuzamos íráskor a paritásmeghajtó a rendszer szűk keresztmetszetévé válik. Ezenkívül valamely meghajtó kiesése esetén a rendszer olvasási teljesítménye is lecsökken, a paritás-meghajtó jelentette szűk keresztmetszet miatt. + $\triangleleft$ \faLightbulbO}\\ + + \noindent Ma ezen megoldások (RAID 2,3,4) nem gyakran használatosak.\\ +\newpage + \paragraph*{RAID 5 (elosztott paritásblokkok)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A RAID 4 javítása: a paritásblokkokat keverjük az adatblokkok közé + \item Például egy 5 diszkből álló tömbben az n. blokkhoz tartozó paritásblokkot tároljuk az (n mod 5)+1. diszken, a többi diszk n. blokkjai tárolják az adatokat + \item A diszkek igénybevétele kiegyenlítődik + \item Az írások némileg párhuzamosíthatók, azonban még mindig jóval lassabbak az egyszerű tükrözésnél + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid5.png} + \caption{RAID 5} + \label{ref:raid5} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 5 a paritás információt nem egy kitüntetett meghajtón, hanem „körbeforgó paritás” (rotating parity) használatával, egyenletesen az összes meghajtón elosztva tárolja, kiküszöbölve a paritás-meghajtó jelentette szűk keresztmetszetet. Minimális meghajtószám: 3, de az írási sebesség csökkenésének elkerülése érdekében 4 elemnél kevesebb nem ajánlott. Mind az írási, mind az olvasási műveletek párhuzamosan végezhetőek. Egy meghajtó meghibásodása esetén az adatok sértetlenül visszaolvashatóak, a hibás meghajtó adatait a vezérlő a többi meghajtóról ki tudja számolni. A csíkméret változtatható; kis méretű csíkok esetén a RAID 3-hoz hasonló működést, míg nagy méretű csíkok alkalmazása esetén a RAID 4-hez hasonló működést kapunk. A hibás meghajtót ajánlott azonnal cserélni, mert két meghajtó meghibásodása esetén az adatok elvesznek!\\ + + \noindent Az írási sebességnél fontos figyelembe venni a paritás adatok előállítására szükséges számítási kapacitás igényt! Szoftveres megoldásnál ez jelentős processzorterhelést, illetve az írási sebesség csökkenését eredményezheti, ezért ajánlott a hardveres megoldás, ahol a célhardver látja el ezeket a feladatokat.\\ + + \noindent A RAID 5 vezérlők a hibás meghajtó helyére betett új, üres meghajtót automatikusan fel tudják tölteni az eredeti adatokkal.\\ + + \noindent A hibás meghajtó egy-egy blokkját a következőképpen lehet visszaolvasni: Ah=(Aj1 XOR Aj2) XOR Aj3, ahol Ah: a fizikailag hibás meghajtó része és Aj1, Aj2, Aj3: a jó meghajtó része.\\ + + \noindent A tömb egyetlen meghajtójáról nem állítható vissza a teljes adattartalom, viszont egy-egy adatblokknyi igen. Mivel akár ez is tartalmazhat értékes információt, így a már nem használt vagy hibás adathordozót érdemes megsemmisíttetni.\\\\ + + \noindent A RAID 5 legfontosabb paraméterei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item olvasás: nincs overhead (elemszám * olvasási sebesség) + \item írás: jelentős overhead + \begin{enumerate} + \item adat olvasása, + \item paritás olvasása, + \item adat írása, + \item paritás írása + \end{enumerate} + (elemszám * írási sebesség / 4) + \item tárolókapacitás: az elosztott paritás miatt kiesik 1 elem (elemszám-1 * tárolókapacitás) + \item meghibásodási tolerancia: 1 elem + \end{itemize} + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{RAID 6 (P+Q)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Paritásblokk (P) mellett hibajavító kódok (Q, Reed-Solomon) + \item n+2 diszk költséggel n diszknyi kapacitást nyújt, és bármely két diszk kiesését elviseli + \item Matematikai háttér: Galois-terek + \item Jelentős, a RAID 5-nél is magasabb CPU igény + \item Elvileg általánosítható kettőnél több diszk kiesésére, a gyakorlatban általában nem éri meg + \item A P és Q blokkokat célszerű itt is az adatblokkok közé keverni + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid6.png} + \caption{RAID 6} + \label{ref:raid6} + \end{figure} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A RAID 6 tekinthető a RAID 5 kibővítésének. Itt nemcsak soronként, hanem oszloponként is kiszámítják a paritást. A módszer segítségével kétszeres meghajtómeghibásodás is kiküszöbölhetővé válik. A paritáscsíkokat itt is az egyes meghajtók között, egyenletesen elosztva tárolják, de ezek természetesen kétszer annyi helyet foglalnak el, mint a RAID 5 esetében, valamint még nagyobb az írási műveletek overheadje. Ennek ellenére, nagy elemszám esetén a RAID 6 lényegesen biztonságosabb alternatívája a RAID 5-nek, valamint arányaiban kevesebb tárkapacitás veszteséggel jár.\\ + + \noindent Egy RAID 6 tömb legalább 4 elemből kell álljon, de az írási sebesség csökkenésének elkerülése érdekében 6 elemnél kevesebb nem ajánlott.\\\\ + + \noindent A RAID 6 legfontosabb paraméterei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item olvasás: nincs overhead (elemszám * olvasási sebesség) + \item írás: jelentős overhead + \begin{enumerate} + \item adat olvasása, + \item vízszintes paritás olvasása, + \item függőleges paritás olvasása, + \item adat írása, + \item vízszintes paritás írása, + \item függőleges paritás írása, + \end{enumerate} + (elemszám * írási sebesség / 6) + \item tárolókapacitás: a kétféle elosztott paritás miatt kiesik 2 elem (elemszám-2 * tárolókapacitás) + \item meghibásodási tolerancia: 2 elem + \end{itemize} + $\triangleleft$ \faLightbulbO}\\ + + \paragraph*{RAID 1+0 (RAID 10)} + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Hasonlít a RAID 01 megoldáshoz, annyi különbséggel, hogy itt a lemezeket először tükrözzük, majd a kapott tömböket fűzzük össze. Ez biztonság szempontjából jobb megoldás, mint a RAID 01, mivel egy diszk kiesése csak az adott tükrözött tömböt érinti, a rá épült RAID 0-t nem; sebességben pedig megegyezik vele.\\ + + \noindent Hátránya, hogy legalább 4 adathordozóra van szükség, ahol 1-1 tükrözött adathordozó kerül összefűzésre, ezért az egyes adathordozók összes tárkapacitásának mindössze a fele felhasználható a tömbben. Előnye azonban az összefűzésből fakadó írási sebesség növekedés, valamint egy sajátos, több elemre is kiterjedő redundancia.\\\\ + + \noindent A RAID 10 legfontosabb paraméterei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item olvasás: nincs overhead (elemszám * olvasási sebesség) + \item írás: overhead - a tükrözés kétszer annyi írási művelettel jár (elemszám * írási sebesség / 2) + \item tárolókapacitás: a tükrözött elemek fele (elemszám * tárolókapacitás / 2) + \item meghibásodási tolerancia: legalább 1 elem, de legfeljebb a tömb elemszámának fele (amennyiben kizárólag független kettőzött elemek hibásodnak meg) + \end{itemize} + } + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid1+0.png} + \caption{RAID 1+0} + \label{ref:raid10} + \end{figure} + + \paragraph*{RAID 0+1 (RAID 01)} + + \noindent Ez egy olyan hibrid megoldás, amelyben a RAID 0 által hordozott sebességet a RAID 1-et jellemző biztonsággal ötvözhetjük. Hátránya, hogy minimálisan 4 eszközre van szükségünk, melyekből 1-1-et összefűzve, majd páronként tükrözve építhetjük fel a tömbünket, ezért a teljes kinyerhető kapacitásnak mindössze a felét tudjuk használni. Mivel a tükrözés (RAID 1) a két összefűzött (RAID 0) tömbre épül, ezért egy lemez meghibásodása esetén az egyik összefűzött tömb mindenképp kiesik, így a tükrözés is megszűnik. Fontos megjegyeznünk, hogy ez a megoldás legalább négy darab merevlemezt igényel. + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/raid0+1.png} + \caption{RAID 0+1} + \label{ref:raid01} + \end{figure} + + \noindent A vezérlők gyakran nyújtják egyiket, másikat, mivel így is, úgy is tükrözés van, azaz drága, így ritkán használt.\\ + + \paragraph*{RAID összefoglalás\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A gyakorlatban csak a 0., 1., 5. és 6. szinteket alkalmazzák, illetve az 1+0, 0+1 kombinált megoldásokat + \item A komponens diszkek méretének egyformának kell lennie + \item Új diszkek menet közbeni hozzáadásával nem lehet növelni a tárkapacitást, újra létre kell hozni a tömböt + \item A 6. illetve szerencsés esetben az 1+0, 0+1 kivételével valamennyi szint csak egyetlen diszk kiesését viseli el + \item Választási szempontok: + \begin{itemize} + \item Magas megbízhatóság: 1, 5, 6, 1+0, 0+1 + \item Nagy teljesítmény: 0, 1, 1+0, 0+1 + \item Alacsony költség: 0, 5, 6 + \item Ezek közül bármelyik kettőt teljesíthetjük + \end{itemize} + \item Minden rendszernél külön kell mérlegelni, melyik a legmegfelelőbb megoldás; gyakran több különböző RAID szintű és méretű tömböt definiálunk + \item Általában lehetőség van készenléti diszkek definiálására, melyeket a rendszer automatikusan üzembe állít, ha egy diszk kiesik + \begin{itemize} + \item Az új diszk szinkronizációja időbe telik, ezalatt a tömb teljesítménye csökken + \item A szinkronizáció közbeni új diszkhiba végzetes (a RAID-6 ez ellen védelmet nyújt) + \end{itemize} + \item A redundáns tömbök nem nyújtanak védelmet minden hibalehetőség ellen + \begin{itemize} + \item Emberi tévedések + \item Programhibák + \item Az egész rendszert érintő hibák + \end{itemize} + \item Váratlan leállások + \item Túlfeszültség + \item Természeti katasztrófák + \item A fejlett operációs rendszerek kötetkezelő rendszerekkel (volume manager) könnyítik meg a hibatűrő logikai diszkek létrehozását és üzemeltetését + \begin{itemize} + \item Új indirekciós szint a logikai blokkok és a RAID tömbök fizikai blokkjai között + \item A kötetkezelő rendszertől a partíciókhoz hasonló, de rugalmasan átméretezhető, \\ + hibatűrő logikai tárterületek (kötetek) igényelhetők + \item A rábízott fizikai partíciók tárterületével a kötetkezelő automatikusan gazdálkodik + \end{itemize} + \end{itemize} + + \subsection*{Fájlrendszerek szolgáltatásai} + + \noindent Az adatállományok a rendelkezésre álló lemezterületen történő tárolásának és elrendezésének módszere a fájlrendszer.\\ + + \noindent \textbf{Fájl}\\ + + \noindent Olyan bitsorozat, melyek tartalma a folyamat befejeződése vagy a rendszer újraindítása után sem veszik el. \\ + \noindent A fájlok logikai szerkezete lehet + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item bájtsorozat + \item fix méretű rekordok sorozata + \item változó méretű rekordok sorozata (szövegsorok) + \item egyéb (például szegmensekre osztott programfájlok stb.) + \end{itemize} + + \noindent Fizikai szerkezetét tekintve egy blokksorozat, amely nem feltétlenül egymást követő blokkokból áll (töredezés). És az utolsó blokkja általában töredékblokk (nem tölti ki feltétlenül a teljes blokkot). + + \noindent A fájl az információtartalmán túl a fájlt leíró ún. meta-adatokat vagy attribútumokat is tárolunk: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item neve + \item elhelyezkedése a lemezen + \item mérete + \item tulajdonosai, elérési jogosultságok + \item elérési és egyéb időbélyegek + \item $\ldots$ + \end{itemize} + + \noindent A meta-adatokat a fájl tartalmától elkülönítve önálló fájlleíró blokkokban tároljuk a lemezen.\\ + + \noindent A fájl típusa közli, hogy a fájl tartalma hogyan értelmezhető + \begin{itemize} + \item Expilict meta-attributumokban (pl MAC) + \item A fájlnévbe építve, kiterjesztés formájában (Windows) + \item A fájl tartalmában elhelyezett speciális kódokkal (UNIX) + \end{itemize} + + \noindent A fájl műveletei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új, üres fájl létrehozása + \item Egy létező fájl törlése + \item Írás (felülírás, beszúrás, hozzáfűzés) + \item Olvasás (szekvenciális vagy közvetlen) + \item Újrapozíciónálás (szekvenciális írás/olvasás) + \item Meta-adatok lekérdezése, módosítása (például: Átnevezés) + \item Zárolás + \item $\ldots$ + \end{itemize} + + \noindent A fájlrendszer feladata a fenti műveletek hatékony implementációja.\\ + + \noindent A könyvtár a fájlrendszerben tárolt fájlokról tárolt jegyzék. Egy könyvtár alá tartozhatnak további könyvtárak ún. alkönyvtárak (egymásba ágyazás). Ez esetben minden könyvtárnak pontosan egy szülője lehet, kivéve a gyökér könyvtár, aminek nincs szülője. A könyvtárak hierarchiája fa szerkezetű.\\ + + \noindent Egy fájl útvonala a gyökérkönyvtár a fájlt tartalmazó könyvtárral összekötő út a könyvtárszerkezetben.\\ + + \noindent A rendszer a folyamatokhoz aktuális könyvtárat rendel. Ehhez az aktuális könyvtárhoz képest egy fájl vagy könyvtár hivatkozható relatív elérési úttal is.\\ + + \noindent A könyvtáraknak is vannak meta-adatai: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item neve, + \item tulajdonos, elérési jogosultságok + \item időbélyegzők + \end{itemize} + + \noindent A könyvtár műveletei: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új, üres könyvtár létrehozása + \item Egy létező könyvtár törlése + \item Listázás + \item Bejárás + \item Keresés + \item Meta-adatok lekérdezése, módosítása (például: Átnevezés) + \item $\ldots$ + \end{itemize} + + \noindent A fájlkezelés alrendszerét rétegekre oszthatjuk. Az egyes rétegek csak a közvetlenül alattuk és fölöttük lévő rétegekkel kommunikálnak. Az alsó réteg szolgáltatásait használják, és a felső réteg számára szolgáltatásokat nyújtanak. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\textwidth]{img/file_system_management.png} + \caption{Fájl-kezelés} + \label{file_system_management} + \end{figure} + + \noindent Fájlrendszer típusok: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Merevlemezen alkalmazott fájlrendszer: FAT, NTFS, EXT2FS, XFS, stb + \item Szalagos rendszereken (elsősorban backup) alkalmazott fájlrendszer: Tartalomjegyzék, majd a tartalom szekvenciálisan + \item CD, DVD, Magneto-opto Disc fájlrendszer: CDFS, UDF (Universal Disc Format) + \item RAM lemezek (ma már kevésbé használtak) + \item FLASH memória meghajtó (FAT32) + \item Hálózati meghajtó: NFS + \item Egyéb pszeudó fájlrendszerek: Zip, tar.gz, ISO + \end{itemize} + + \noindent A kezdeti UNIX és UNIX-szerű operációs rendszerek (így pl. a GNU/LINUX operációs rendszer is) csak egyfajta fájlrendszert támogattak, a saját formátumukat. A modern operációs rendszerek viszont többféle fájlrendszert is támogatnak, és vannak olyan fájlrendszerek is, amelyeket több operációs rendszer is támogat. + + \subsection*{Fájlrendszerek szolgáltatásainak jellemző megvalósításai\\} + + \paragraph*{A lemezen tárolt adatszerkezetek\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Boot blokk + \item Fájlrendszer-leíró blokk vagy blokkok (superblock) + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Fájlok száma + \item Blokkok száma és mérete + \item Szabad blokkok száma + \item A fájlrendszer állapota (tiszta, gyanús, hibás) + \item Időbélyegzők + \begin{itemize} + \item Utolsó csatolás + \item Utolsó ellenőrzés + \item Utolsó modosítás + \end{itemize} + \item Fájlrendszer címkéje + \end{itemize} + \item Könyvtárszerezet a fájlok szervezéséhez + \item Fájlleíró blokkok (i-node) a fájlok metaadatainak tárolására + \end{itemize} + + \noindent Superblock nélkül a fájlrendszer nem használható, ezért több példányban is eltárolják általában. + + \paragraph*{A memóriában tárolt adatszerkezetek\\} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Csatolt fájlrendszerek táblázata + \item Nemrégiben használt könyvtárak táblázata + \item Rendszerben megnyitott összes fájl leírása + \item Folyamatonkénti táblázat a folyamat megnyitott fájlairól + \item Blokk gyorsítótár + \end{itemize} + + \noindent A könyvtárakat általában speciális tartalmú adatállományokkal reprezentálják. Hasonló a fájlok tárolásához.\\ + + \subsection*{Blokkfoglalás} + + \noindent A fájlok tartalmát adatblokkokban tárolja + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nyilvántartja mely blokkok tartoznak egy fájlhoz és milyen sorrendben + \item Tudnia kell egy új blokkok hozzáadását egy már létező fájlhoz + \end{itemize} + + \noindent A blokkok nyilvántartását metaadatok között tárolja magában az i-node-ban, vagy a lemez egy erre a célra elkülönített területén. + + \paragraph*{Folytonos blokkfoglalás} + + Legyenek a fájlok blokkjai együtt egy folytonos lemezterületen + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Dinamikus partíciók használhatók + \item Egy fájl blokkjainak nyilvántartásához elég a kezdőblokkot és a fájl hosszát tárolni. + \item Nagyon hatékony, mivel kizárja a fájl töredezettségéből eredő fejmozgásokat + \item \emph{Hátrányai:} + \begin{itemize} + \item A szabad terület elaprozódása miatt külső töredezettség + \item Mivel a végső fájlméretet előre meg kell adni, a lassan növő fájlok jelentős belső töredezettséget eredményeznek + \item A fájlméret utólag nehezen növelhető + \end{itemize} + \item Csak olvasható háttértárakon (CD, DVD, stb.), illetve nagy I/O teljesítmény esetén (nagyszámítógépek) éri meg használni + \end{itemize} + + \paragraph*{Láncolt listás blokkfoglalás} + + Minden adatblokk végén megtalálható a következő adatblokk száma + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az i-node csak az első adatblokk számát tartalmazza + \item Láncolt lista adatszerkezet + \item \emph{Hátrányai:} + \begin{itemize} + \item Csak szekvenciális I/O műveletek esetén elfogadható + \item A blokkmutatók tárolása miatt a használható tárkapacítás százalékokban kifejezhető mértékben csökken + \item Ha a blokkmutatók elromlanak jelentős lesz lehet az adatvesztés + \end{itemize} + \item A tisztán ezt a módszert a gyakorlatban ritkán használják + \begin{itemize} + \item Több blokkot fürtbe (cluster) fogva javítható a viselkedés, de nő a belső töredezettség + \item Jellemzően a blokkmutatók kigyűjtése egy külön táblázatba: FAT + \end{itemize} + \end{itemize} + + \paragraph*{Indexelt blokkfoglalás} + + A fájl adatblokkjainak sorszámát sorojuk fel egy külön erre a célra fenntartott indexblokkban + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az i-node-ban erre az indexblokkra hivatkozunk + \item Minden fájlhoz külön indexblokkot rendelünk + \item A szekvenciális és közvetlen elérést egyaránt jól támogatja + \item Rövid fájlok esetén az utolsó adatblokk mellett az indexblokk is csak részlegesen lesz kihasználva + \item Az indexblokkokat általában a memóriában megőrizzük + \end{itemize} + + \noindent Mi történik, ha betelik az indexblokk? + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új blokkot láncolhatunk hozzá (láncolt listás index) + \item Második szintű indexblokkot definiálhatunk + \begin{itemize} + \item Követlen indexblokkok számait sorolja fel + \item Tetszőlegese szintig kiterjeszthető + \end{itemize} + \item A két megoldást kombináljuk + \begin{itemize} + \item Az i-node-ban felsorolunk néhány adatblokkot, néhány közvetlen indexblokkot, és egy-egy második és harmadik szintű indexet + \item Hatékony és gazdaságos megoldás + \item Elterjedt (klasszikus UNIX UFS, Linux ext2, stb.) + \end{itemize} + \end{itemize} + + \section*{Fájlrendszerek megvalósításai} + + \subsubsection*{FAT} + + \paragraph*{Egy FAT partíció létrehozása} + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/FAT_disk.png} + \caption{FAT partíció} + \label{fat_partition} + \end{figure} + + \noindent Egy partíció formázásakor és a FAT fájlrendszer beállításakor egy úgynevezett Master Boot Record (MBR) jön létre a háttértárolón.\\ + + \noindent A Master Boot Record, vagy más néven a partíciós szektor a merevlemez legelső szektorának (azaz az első lemezfelület első sávja első szektorának) elnevezése. \\ + + \noindent Csak a particionált merevlemezeknek van Master Boot Recordjuk. \\ + + \noindent A Master Boot Record a merevlemez legelején, az első partíció előtt található meg.\\ + + \noindent A Master Boot Record egy kisebb végrehajtható kódot, amit Master Boot Code-nak hívunk, és egy partíciós táblát tartalmaz. \\ + + \noindent Egy új partíció becsatolásakor a Master Boot Record végrehajtja a Master Boot Code-ot, és átadja a vezérlést a lemez boot szektorának.\\ + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{8cm}|} \hline + Hard disk & Háttértároló, ami egy vagy két partíciót tartalmaz. \\ \hline + Boot szektor & Összesen: Bootolható partíció, amely információkat tartalmaz a lemez kialakításáról, a fájlrendszer struktúrájáról. Itt tárolódik a boot code is, amely az Ntdlr-t tölti be. \\ \hline + Master Boot Record & Olyan végrehajtható kódot tartalmaz, amit a rendszer BIOS (Basic Input/Output System) tölt be a memóriába. A kód a partíciós tábla alapján eldönti, hogy melyik partíció aktív vagy bootolható. \\ \hline + Ntldlr.dll & A processzort (CPU) védett módba állítja, elindítja a fájlrendszert, majd kiolvassa a Boot.ini fájl tartalmát. Ezek az információk meghatározzák a kezdeti beállításokat és a kezdeti „boot menu” opciókat. + +Az Ntldr Windows NT alapú operációs rendszerek betöltőprogramja, amelynek feladata az alapvető hardverkonfigurációs jellemzők felderítése és az ezeknek megfelelő rendszermagváltozat betöltése és elindítása. \\ \hline + Fastfat.sys & System file driver a FAT 16-hoz és a FAT 32-höz. \\ \hline + Ntoskrnl.exe & Információt ad arról, hogy melyik system device drivert kell betölteni, és hogy mi a megfelelő betöltési sorrend. \\ \hline + Kernel mód & Az a végrehajtó mód, amely lehetőséget biztosít a kódoknak, hogy közvetlen hozzáférjenek az összes hardverhez és a memóriához a rendszerben. \\ \hline + Felhasználói mód & Az a végrehajtó mód, ahol az alkalmazások futnak. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{A FAT fájlrendszer fizikai szerkezete, lemezkezelése} + + \noindent A klaszter a legkisebb egység a lemezen, amit le lehet foglalni egy fájl tárolásához. A szektor a tárolás egysége a háttértárolón. Ha például egy háttértároló 512 bájtos szektorméretet használ, akkor az 512 bájtos klaszter egy szektort, míg a 4 kilobájtos klaszter nyolc szektort foglal magában.\\ + + \noindent A klaszterek a partíció kezdetétől sorban vannak megszámozva. Mivel a FAT fájlrendszer adatklaszterei a BIOS Parameter Block, a fenntartott szektorok és két FAT struktúra után találhatók, így a FAT formázás nem garantálja, hogy az adatklaszterek illeszkednek a klaszterhatárokra.\\ + + \noindent Mivel a FAT 16 és a FAT 32 különböző méretű klaszterekkel dolgozik, a kötet méretétől függően, így az összes fájlrendszernek megvan a maximálisan támogatott klaszterszáma. Minél kisebb a klaszter mérete, annál hatékonyabb az adattárolás a lemezen.\\ + + \noindent A nevekben elhelyezkedő számok utalnak arra, hogy hány bit szükséges a FAT tábla egy bejegyzésének tárolására: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item FAT16: + \begin{itemize} + \item 16 bites bejegyzések + \item (Ez 216 klasztert jelent.) + \end{itemize} + \item FAT32: + \begin{itemize} + \item 32 bites bejegyzések, amiből 4 bit a FAT bejegyzésre van félretéve. + \item (Tehát maximum 228 klaszter lehetséges.)\\ + \end{itemize} + \end{itemize} + + \noindent A \textbf{FAT16} fájlrendszer méretkorlátai\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} \hline + Leírás & Maximális fájlméret \\ \hline \hline + Maximális fájlméret & Összesen: 4 GB - 1 bájt (azaz 232 bájt - 1 bájt). \\ \hline + Maximális kötetméret & Összesen: 4 GB. \\ \hline + Fájlok maximális száma kötetenként & Megközelítően 65 536 (azaz 216 darab fájl). \\ \hline + Maximum hány fájl vagy könyvtár lehet a gyökérkönyvtárban? & 512 db \\ \hline + \end{tabular}\\ + } + \renewcommand{\arraystretch}{1}\\ + + \noindent A \textbf{FAT32} fájlrendszer méretkorlátai\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} \hline + Leírás & Maximális fájlméret \\ \hline \hline + Maximális fájlméret & Összesen: 4 GB - 1 bájt (azaz 232 bájt - 1 bájt). \\ \hline + Maximális kötetméret & 32 GB (implementációfüggő). \\ \hline + Fájlok maximális száma kötetenként & 4 194 304 darab. \\ \hline + Maximum hány fájl vagy könyvtár lehet a gyökérkönyvtárban? & 65 536 db \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{A FAT fájlrendszer kötetszervezése, felépítése} + + {\footnotesize + \begin{centering} + \noindent \renewcommand{\arraystretch}{2} + \begin{tabular}{|c|c|c|c|c|c|} \hline + \textbf{Boot sector} & \makecell{Reserved \\ sectors} & \textbf{FAT} (1) & \makecell{\textbf{FAT (2)}\\Copy of FAT (1)} & \textbf{Root folder} & \textbf{Files and folders} \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\ + \end{centering} + } + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + Elemek & Leírás \\ \hline \hline + Boot sector & Bootolható partíció, amely információkat tartalmaz a lemez kialakításáról, a fájlrendszer struktúrájáról. Itt tárolódik a boot code is. \\ \hline + Reserved sectors & A szektorok száma, ami megelőzi az első FAT köteget, és tartalmazza a boot szektort. \\ \hline + FAT 1 & Eredeti FAT kötet. \\ \hline + FAT 2 & Biztonsági mentés a FAT kötetről. \\ \hline + Root folder & Leírja a fájlokat és a mappákat, amelyek a partíció gyökerében találhatóak. \\ \hline + Files and folders & A fájlok és mappák adatait tartalmazza, amelyek a fájlrendszerben találhatóak. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\\\ + + \noindent A FAT fájlrendszer az elnevezését a benne megvalósított fájlláncolási eljárásról kapta. Ebben a fájlláncolási eljárásban nemes egyszerűséggel felvettek egy táblázatot, ami megmondja, hogy az n.-ik klaszteren elhelyezkedő fájl következő darabja pontosan hol található. A FAT táblában szerepelhet a valós értékek mellett egy-két extrém érték is, amelyek a fájl végét, hibás klasztert vagy üres blokkot jelölhetnek.\\ + + \noindent A FAT tábla összesen két példányban került a lemezre, így ha az egyik megsérült valamilyen oknál fogva, akkor az a másikból helyreállítható volt. Sajnálatos módon a tervezésnél a két FAT tábla (az eredeti és a duplikátum) pontosan egymás mögött helyezkedik el, így egy szerencsétlen hardverhiba esetén mind a kettő akár egyszerre is megsérülhet. A dupla hibalehetőségre viszont az informatikában nem lehet tervezni, mivel elég költséges.\\ + + \noindent A FAT fájlrendszeren egy fájl neve nyolc (8) ASCII karakter lehetett, amelyet egy háromkarakteres (3) kiterjesztés követett. Az MS-DOS és a Microsoft Windows operációs rendszerek a kiterjesztés alapján döntötték el (és ez alapján döntik el a mai napig is) egy fájl típusát.\\ + + \noindent A könyvtárak és a kötetazonosítók attribútumokkal voltak jelölve. A FAT fájlrendszer egyéb attribútumai (mint például a rendszerattribútum, a rejtett attribútum, az archív attribútum és a csak olvasható attribútum) eléggé „gyengére” sikerültek, mivel alkalmazásfüggő volt, hogy a fájlrendszer figyelembe vette-e őket, vagy sem. A FAT fájlrendszer eredetileg csak az utolsó módosítás dátumát tárolta, azt is csak két másodperces felbontással.\\ + + \noindent A Microsoft Windows 95 operációs rendszerben bevezették az úgynevezett LFN-t, azaz a hosszú fájlnév támogatást.\\ + + \noindent Minden egyes könyvtárbejegyzés tárolja a fájl első darabjának helyét (a kezdő klasztert), és a FAT fájlrendszerben a fájl végigolvasásához innen indulva kell végigjárni a FAT táblát. + + \paragraph*{A fragmentáció a FAT fájlrendszerekben} + + \noindent A FAT fájlrendszernek sosem voltak különféle mechanizmusai, eljárásai a fájlok töredezettségének a megakadályozására, illetve kezelésére. A fájltöredezettség azt jelenti, hogy a fájl egyes darabkái egymástól messze található klaszterekbe kerülnek (ez az úgynevezett first-fit allokációs módszer). Így a fájlok beolvasásakor a merevlemez olvasófejének rendkívül sokat kell ide-oda mozognia, ezáltal nagyon lassú lett a fájlok beolvasása, a merevlemez pedig folyamatosan „berregett”.\\ + + \noindent A FAT fájlrendszerhez mellékeltek emiatt egy úgynevezett defragmentáló (töredezettségmentesítő) programot, amellyel „on-demand”, azaz azonnal sorba lehetett rendezni a fájlrendszeren található állományokat. Így könnyen megtörténhetett az, hogy egy akkoriban lassan bootoló 486-os számítógép szinte „szárnyakat kapott” egy egyszerű defragmentálástól.\\ + + \noindent A defragmentálás mindenesetre akkoriban egy rendkívül időigényes és veszélyes folyamat volt. A veszélyesség abban az értelemben nyilvánult meg, hogy egy pillanatnyi áramszünet komoly adatvesztéses károkat okozhatott a fájlrendszerben.\\ + + \paragraph*{A FAT fájlrendszer napjainkban} + + \noindent A FAT fájlrendszer az MS-DOS, a Microsoft Windows 95 és a Microsoft Windows 98 operációs rendszerek natív fájlrendszere. Manapság az MP3 és az MP4 lejátszókon, a flash-drive-okon, a memóriakártyákon és a digitális kamerákon is használnak FAT fájlrendszert, mert kompatibilis szinte minden operációs rendszerrel.\\ + + \noindent A FAT eredeti változatai a nagyobb meghajtók esetében a rendelkezésre álló helyet nagyon rosszul kezelték, éppen ezért hozta létre a Microsoft a FAT fájlrendszer bővített 32-bites változatát, amit FAT 32-nek neveztek el. Az „eredeti merevlemezes” FAT változatra FAT 16-osként szokás hivatkozni, mert az allokációs egységek számát 16 biten tárolja. A FAT fájlrendszernek ezen a két változatán kívül (FAT16, FAT32) létezett még 12 bites változata is, amit FAT 12-nek nevezünk. Utóbbi azonban kizárólag hajlékonylemezes egységeken volt használatban.\\ + + \noindent A FAT fájlrendszer napjainkban elavult fájlrendszernek tekinthető, mert sem naplózási, sem biztonsági jogosultságok tárolására nem alkalmas.\\ + + \paragraph*{NTFS} + + \noindent Az NTFS fájlrendszer (avagy New Technology File System, magyarul az új technológiájú fájlrendszer) a Microsoft korábbi FAT fájlrendszerét váltotta le.\\ + + \noindent A Microsoft Windows NT operációs rendszerben jelent meg először az NTFS fájlrendszer.\\ + + \noindent Manapság széles körben elterjedt az NTFS fájlrendszer, ugyanis rengeteg újítás, újdonság és extra funkció érhető el benne, ami az elavult FAT fájlrendszerben nem volt elérhető, és emiatt a FAT fájlrendszer hiányosságaként soroltuk fel az előző pontban. Ilyenek például + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item metaadatok támogatása, + \item fejlettebb adatstruktúrák támogatása, + \item sebesség és a megbízhatóság növekedése, + \item lemezterület optimálisabb felhasználás, + \item rendelkezik hozzáférés-védelmi listával + \item naplózás + \end{itemize} + + \noindent Elterjedése a Microsoft operációs rendszereken kívül akadályozott, mivel az NTFS fájlrendszer pontos speciikációja a Microsoft szabadalma.\\ + + \noindent Az NTFS fájlrendszer 64 bites indexeket használ a klaszterek kiválasztásához, így nem pazarol az amúgy is szűkös hellyel. A 64 bites indexelési módszernek köszönhetően az NTFS fájlrendszernek az elvileg elérhető maximális partíciómérete 16 exabájt (16 EB), ám a gyakorlatban 2 terabájtnál (2 TB) nagyobb partíciókat már nem kezel.\\ + + \noindent Az NTFS fájlrendszer teljesen a Microsoft Windows NT operációs rendszer biztonsági modelljére épül. Pontosabban a DACL (Discretionary Access Control List) és SACL (System Access Control List, magyarul hozzáférési listák) biztonsági megfontolásaira épül, így az NTFS fájlrendszeren belül megadható, hogy melyik felhasználó mikor és mit végezhet egy-egy fájllal, továbbá minden elvégzett művelet visszakövethető benne. Ez a biztonsági modell az, amivel az NTFS fájlrendszer valóban hatalmas előrelépés volt a FAT fájlrendszerhez képest. Az NTFS fájlrendszer mellett szól még az is, hogy egy többfelhasználós környezetben, mint amilyen a Microsoft Windows NT operációs rendszer szerver verziója, feltétlenül szükséges egy ilyenfajta biztonsági modell követése.\\ + + \noindent A FAT fájlrendszerrel ellentétben az NTFS fájlrendszer volt az első olyan Microsoft Windows platformú fájlrendszer, ami natívan (bármiféle „hack” nélkül) támogatta a hosszú fájlneveket.\\ + + \noindent A FAT fájlrendszer legnagyobb hibáját, miszerint a FAT fájlrendszerben nincs semmilyen hibatűrő\footnote{A hibatűrő megoldás alatt azt értjük, hogy ha a nyitott fájlok módosítása, szerkesztése során fellép egy esetleges rendszerhiba, például a számítógép „lefagy”, akkor a fájlrendszer -partíción tárolt adatok nem vállnak inkonzisztenssé.} megoldás, az NTFS fájlrendszer ügyesen megoldotta.\\ + + \noindent Az NTFS fájlrendszer megoldása az lett, hogy vezet egy beépített fájlművelet-végzési nyilvántartást (azaz egy úgynevezett log fájlt). Ebbe a speciális log fájlba minden egyes fájlművelet során egy bejegyzést tesz. Így amikor egy esetleges rendszerhiba következik be (pl. a fentebb említett „lefagyás”), akkor az újrabootolás során a log fájlok alapján azonnal meg lehet állapítani, hogy a rendszerhiba bekövetkezésekor történt-e bármiféle adatvesztés, vagy sem. Amennyiben a log fájlok alapján megállapítható az adatvesztés megtörténte (a log fájlban benne lesz, hogy a fájlmódosító művelet félbemaradt), akkor el kell indítani az úgynevezett CHKDSK (lemezellenőrző) programot. A CHKDSK program a log fájlt felhasználva megpróbálja visszaállítani az eredeti konzisztens állapotot. A log fájl minden bejegyzése két típusú lehet: vagy ismétlő (redo), vagy visszavonó (undo) parancsot tartalmazhat.\\ + + \noindent A log fájl mérete a merevlemeztől függően két és négy megabájt között (2 MB – 4 MB) mozoghat. Ha az NTFS fájlrendszer nem vizsgálná meg mindig, hogy az ismétlő (redo) és a visszavonó (undo) információk szükségesek-e hibajavítás esetére, akkor a log fájl mérete gyorsan megnőne, és így hamar be is telne. Ennek az elkerülése végett az összes módosított adatot lemezre menti az NTFS fájlrendszer, és törli a log fájl tartalmát. Ez a vizsgálat az úgynevezett checkpoint- (határpont-) képzés. A vizsgálat körülbelül minden 4. vagy 5. másodpercben megtörténik. + + \paragraph*{Az NTFS fájlrendszer maximális fájlmérete} + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Elemek} & \textbf{Határ} \\ \hline \hline + Maximális fájlméret & Elvi megvalósíthatóság: 16 exabájt – 1 kB (264 bájt – 1 kB) + Megvalósított: 16 terabájt – 64 kB (244 bájt – 64 kB) \\ \hline + Maximális kötetméret & Elvi megvalósíthatóság: 264 klaszter – 1 klaszter + Megvalósított: 256 terabájt – 64 kB (azaz 232 klaszter – 1 klaszter) \\ \hline + Fájlok maximális száma kötetenként & 4 294 967 295 (azaz 232 – 1 fájl) \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer maximális kötetmérete} + + \noindent Elméletben a maximális NTFS kötetméret 264 - 1 klaszter (foglalási egység). Ennek ellenére a maximális NTFS kötetméret a Windows XP Professional megvalósításának megfelelően 232 - 1 klaszter.\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Partíció méret} & \textbf{NTFS klaszterméret} \\ \hline \hline + 7 megabájt (MB) – 512 megabájt (MB) & 512 bájt (B) \\ \hline + 513 megabájt (MB) – 1,024 megabájt (MB) & 1 kilobájt (kB) \\ \hline + 1,025 megabájt (MB) – 2 gigabájt (GB) & 2 kilobájt (kB) \\ \hline + 2 gigabájt (GB) – 2 terabájt (TB) & 4 kilobájt (kB) \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer kötetszervezése, felépítése} + + \begin{centering} + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|c|c|c|c|} \hline + \textbf{NTFS Boot sector} & \makecell{\textbf{MFT} \\ Master File Table} & \textbf{File System Data} & \textbf{Copy of MFT} \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + \end{centering} + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Elemek} & \textbf{Leírás} \\ \hline \hline + NTFS Boot Sector & Tartalmazza a BIOS paraméterblokkot, ami információkat tárol a lemez kialakításáról és a fájlrendszer struktúrájáról; a „boot code” is itt tárolódik. \\ \hline + MFT Master File Table & A fájlok eléréséhez szükséges információkat tartalmazza, amelyek az NTFS fájlrendszerű partíción találhatók. \\ \hline + File System Data & Minden más olyan adatot tárol, amelyeket a Master File Table már nem. \\ \hline + Master File Table Copy & Biztonsági mentés a Master File Table-ről, ha az eredetin tárolt adatokhoz nem lehet hozzáférni. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer fizikai szerkezete, lemezkezelése} + + \noindent Az NTFS fájlrendszer a fájlok és a könyvtárak adatai mellett egy sereg egyéb fájlt is használ a lemezkezeléssel összefüggő adatok tárolása végett. Ezekben a fájlokban és más, az NTFS fájlrendszerrel kapcsolatos fájlban, illetve könyvtárban tárolt adatok összességét úgynevezett metaadatnak (metadata) nevezzük. Egy NTFS fájlrendszerbeli partíció formázása során 11 metaadatfájl jön létre. A metaadatfájlok nem láthatóak egyszerűen semmilyen felsorolásban, viszont ha tudjuk, mi az általunk keresett a metaadatfájl neve, akkor kilistáztathatjuk.\\ + + \noindent Az NTFS fájlrendszer legfeljebb 32 000 Unicode karakter hosszúságú elérési útvonalakat támogat, amelyeknek minden komponense (ami egy könyvtár vagy egy fájlnév) legfeljebb 255 Unicode karakter hosszúságú lehet. Bizonyos azonosító neveket a rendszer azonban fenntart a saját használatra. Ennek az az oka, hogy az NTFS fájlrendszer metaadatai szabályos (ámbár rejtett és általában nem hozzáférhető) fájlokban tárolódnak; emiatt a felhasználói adatállományok nem használhatják fel a neveiket. Ezek a rendszerfájlok mindig az NTFS fájlrendszerű kötet gyökerében tárolódnak, és kizárólag a gyökérkönyvtárban vannak fenntartva.\\ + + \subsection*{Ext fájlrendszer} + + \noindent Az „ext” kifejezés a fájlrendszerek neveiben az extended (magyarul kiterjesztett) kifejezést takarja. \\ + + \noindent Az extended fájlrendszer volt az első kifejezetten a UNIX-szerű GNU/LINUX operációs rendszerekhez készített fájlrendszer, amely örökölte az UFS (UNIX File System) fájlrendszer metaadat-szerkezetét, és arra készült, hogy a Minix operációs rendszer fájlrendszerének a hibáit kiküszöbölje.\\ + + \noindent A hibák kiküszöbölése többek között a Minix operációs rendszer fájlrendszer-határainak kiterjesztése, például: + \begin{itemize} + \item a maximális méret, amely a 16 bites offszet miatt csak maximálisan 64 megabájt (64 MB) lehetett, illetve + \item a maximális fájlnévhosszúság, amely csak 14 karakter lehetett. + \end{itemize} + Ennek megoldásához egy virtuális fájlrendszerréteget tettek a Linux-kernelbe\footnote{Az operációs rendszer magja. Ez a rész tartalmazza a hardver eszközöket kezelő programot is.}, mellyel a maximális méret két gigabájtra (2 GB), a fájlnevek hosszúsága pedig 255 karakteresre növekedhetett.\\ + + \noindent Hiányossága volt azonban az, hogy mindezek ellenére nem biztosította a fájlok egyenkénti elérését, és nem rögzítette a fájlok módosításának idejét! + + \subsection*{Ext2 fájlrendszer} + + \noindent Az extended fájlrendszer következő verziója az „ext2” fájlrendszer lett (second extended filesystem – második kiterjesztett fájlrendszer).\\ + + \noindent Az ext2 fájlrendszer, amely a GNU/LINUX operációs rendszereken kívül más rendszereken is megjelent, több Linux disztribúció alapértelmezett fájlrendszere volt, amíg az utódja, az „ext3” fájlrendszer el nem készült.\\ + + \noindent Az ext2 fájlrendszer nagy előnye a többi más fájlrendszerekhez képest, hogy már a tervezésénél készültek a folytatására, továbbfejlesztésére úgy, hogy a még meg nem valósított, azaz nem implementált funkcióknak meghagyták benne a helyet. + + \paragraph*{Az ext2 fájlrendszer adatszerkezete} + + \noindent A szabad területet az ext2 fájlrendszer blokkokra osztja, a blokkokat pedig további csoportokra osztja tovább. \\ + + \noindent Egy-egy fájl – amennyire csak lehet – egy csoportba tartozik, hogy a csökkentse a fájlrendszer szabad területének töredezését, és hogy csökkentse a keresést nagyméretű folytonos elérésű fájlok esetén.\\ + + \noindent Minden csoport tartalmazza a saját leírótábláját és a szuperblokk leírójának másolatát, egy blokktérképet, amely számon tartja, hogy mely fizikai részek foglaltak, és melyek nem.\\ + + \noindent Ezeken kívül tartalmaz még egy úgynevezett \textbf{i-node}-ot\footnote{A UNIX fájlrendszerének megszervezésében használatos, a fájllal kapcsolatos információkat tárolja}, melynek szintén van blokktérképe és leírótáblája. Ezek címeit a csoportleíró tartalmazza. + + \paragraph*{Az i-node-ok használata az ext2 fájlrendszerben} + + Minden egyes fájlt és könyvtárat egy-egy i-node ír le (\ref{ref:ex2inode}. ábra).\\ + Ez tartalmazza a fájlok tulajdonságait: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item hozzáférési jogok, + \item engedélyek, + \item fájlméret és + \item a fájl helye a merevlemezen + \end{itemize} + + \noindent Az i-node struktúra 15 mutatót tartalmaz, melyből 12 fix, és a 13-astól kezdve pedig újabb i-node-okra mutathat, amennyiben a fájl nem fér bele egy i-node-ba. + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/ext2inode.png} + \caption{i-node szerkezete} + \label{ref:ex2inode} + \end{figure} + + \paragraph*{A könyvtárak az ext2 fájlrendszerben} + + Minden egyes könyvtár további könyvtárbejegyzéseket tartalmazhat. Ezek a bejegyzések azonosítják az egyes fájlokat az egyes i-node-okhoz. + Tartalmazhatják az + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item i-node számát, + \item a fájlnév hosszúságát és + \item a fájl nevét. + \end{itemize} + + \noindent Egy megadott keresés során a kereső ezeken az adatokon megy végig, ezeket az adatokat vizsgálja meg. A gyökérkönyvtár mindig az i-node második eleme, így a rendszer a felcsatlakoztatás (mount) során rögtön megtalálja. Az alkönyvtárak a fájlokhoz hasonlóan szerepelhetnek a táblában, egy saját i-node számmal és egy saját névvel. A hivatkozások pedig ugyancsak egy i-node azonosítóhoz rendelnek több nevet, így végül mindegyik hivatkozás ugyanarra a fizikai helyre mutat.\\ + + \noindent Az aktuális munkakönyvtár [. (a pont)] és a szülő munkakönyvtár [.. (a dupla pont)] ugyanígy tárolódik a fájlrendszeren belül, vagyis minden egyes könyvtár tartalmazza a saját és a szülőjének a nevét és az ő azonosítóját. Ezek a könyvtárak létrehozásakor automatikusan létrejönnek, és csak a könyvtárral együtt törölhetők! + + \paragraph*{Az ext2 fájlrendszer határai} + + \noindent A fájl méretének és a meghajtó méretének határait a blokkok mérete határozza meg az ext2 fájlrendszerben, amelyet az adott architektúra lapmérete határoz meg a legfőképpen. Ezek a határok a fájlrendszer felépítése során rögzülnek, és még számos felhasználói programnak is lehetnek határai [például a két gigabájtnál (2GB) nagyobb fájlok esetében].\\ + + \noindent Az ext2 fájlrendszer maga nem tartalmazza a lehetőséget az adatok tömörített tárolására. + + \subsection*{Ext3 fájlrendszer} + + \noindent Az ext3 fájlrendszer (third extended filesystem – harmadik kiterjesztett fájlrendszer) az ext2 fájlrendszer utódja. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az ext2 fájlrendszerhez képest naplózást is tartalmaz.\\\\ + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + A naplózás elsősorban a biztonságot növeli, és lehetővé teszi azt, hogy szabálytalan leállás bekövetkezése után ne kelljen az egész fájlrendszert újra ellenőrizni. + $\triangleleft$ \faLightbulbO} + \item Visszafelé irányú kompatibilitása lehetővé teszi, hogy bármiféle adatmentés nélkül átalakítható legyen az ext2 fájlrendszerből. + \item Tesztek azt mutatják, hogy a hasonló fájlrendszerekhez képest kevesebb processzor- (CPU-) erőforrást használ, és egyszerűsége. + \item A nagy felhasználói bázisa miatt biztonságosabb. + \item A naplózáson kívül az ext3 fájlrendszer lehetővé tette a kikapcsolás nélküli növelés és a sok fájlt tartalmazó könyvtárak H-fával való indexelését. + \item Az ext2 fájlrendszerre írt diagnosztikai és javító eszközök kisebb módosítással használhatók az ext3 fájlrendszerrel. + \end{itemize} + + \noindent Ezek nélkül az ext3 fájlrendszer teljesen azonos lett volna az ext2 fájlrendszerrel.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent \textbf{Az ext3 fájlrendszer háromszintű naplózása} + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Ezen a naplózási szinten a metaadat és a fájl is egy az egyben a naplóba íródik. Abban az esetben, ha folyamatosan nagy fájlokkal dolgozunk, akkor ez a fajta naplózás gyorsíthat is, de alapvetően inkább lassít a dupla írás miatt. + + \item Ezen a naplózási szinten egy rendezett naplózás található, azaz csak a metaadat. íródik a naplóba, de garantált az, hogy az aktuális metaadat. csak akkor kerül elfogadásra (commitálásra), ha a teljes fájl már a fizikai helyére került. A legtöbb GNU/LINUX disztribúcióban ezt használják. Tegyük fel, hogy egy fájl kiíródása közben baj történik (áramkimaradás vagy kernelpánik). Ekkor a napló jelzi, hogy a fájl írása nem fejeződött be, ezért következő indításkor a módosítások megsemmisülnek. A módosított fájlokban azonban így könnyen sérülések keletkezhetnek, ugyanis a fájl eredeti változata nem tárolódik, ezáltal sem az eredeti, sem az új verzió nem állítható vissza. + + \item Ezen a naplózási szinten egy visszaírás található, azaz csak a metaadat. íródik ki a naplóba, de a naplóba írás a tényleges írás előtt és után is egyaránt megtörténhet. Ebben az esetben egy hirtelen leálláskor az írás alatt lévő fájlok könnyebben sérülhetnek. Például egy hozzáfűzés megszakadásakor a fájl nagyobb, mint ahogy az a naplóban található, ellenben ez a fajta aszinkron működés gyakran gyorsabbá teszi a fájlrendszert. + \end{enumerate} + $\triangleleft$ \faLightbulbO}\\ + + \noindent \textbf{Az ext3 fájlrendszer hátrányai\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az ext2 fájlrendszerrel való visszafelé kompatibilitás miatt számos modern fájlrendszerre jellemző tulajdonság kimaradt az ext3 fájlrendszerből.\\\\ + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + A könyvtárankénti fájlok száma is összesen 31 998 darab fájlra korlátozódik az i-node mutatók maximális számából adódóan.} + \item Az ext3 fájlrendszer nem ellenőrizhető addig, amíg az csatlakoztatva van az operációs rendszerhez.\\\\ + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Az ext3 fájlrendszer fájlrendszer szintjén töredezettségmentesítés sem végezhető el addig, amíg az csatlakoztatva van az operációs rendszerhez, tehát felcsatolt állapotban van. Ellenben a felhasználói szinten vannak erre megfelelő eszközök, amelyek a legnagyobb folyamatos szabad helyeket keresve, fájlokat ide-oda másolgatva működnek, de ehhez viszonylag nagyméretű szabad hely szükséges. Erre általában viszont nincs is nagy szükség, mert az ext3 fájlrendszer igyekszik az egymás után következő fájlokat eleve egymáshoz a lehető legközelebb másolni. + $\triangleleft$ \faLightbulbO}\\ + \item Törlésnél a fájlrendszer aktívan távolítja el az i-node -okban tárolt adatokat, főleg biztonsági okokból, ezért nincs sok lehetőség a fájlok helyreállítására. + \item A tömörítést, mint az ext2 fájlrendszer esetén, csak egy kiegészítő program biztosíthatja. + \item Nincs támogatás egy aktuális állapotkép készítésére, mely időnként mentené a fájlrendszer állapotát. + \item Nem számol ellenőrző összegeket a naplóbejegyzésekhez.\\\\ + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Ez akkor jelenthet igazán gondot, ha a merevlemez nem sorrendben írja az adatokat annak érdekében, hogy csökkentse az olvasófej mozgását és ezáltal a meghajtó elhasználódását. Ekkor előfordulhat, hogy egy esetleges leállás pontosan akkor következik be, amikor egy fájlnak az eleje még nem, de egy másik része már a merevlemezre íródott. Ekkor a naplóból való visszaállítás során a kiírt adatok hibás adatokkal íródnak felül, mert a napló nem tudja eldönteni, hogy a fájl melyik része íródott ki. + $\triangleleft$ \faLightbulbO}\\ + \end{itemize} + + \subsection*{ReiserFS fájlrendszer\\} + + \noindent A ReiserFS fájlrendszer lehetővé teszi egy blokkos eszközön (block device) változó méretű fájlok tárolását és könyvtárstruktúrába rendezését.\\ + + \noindent A ReiserFS fájlrendszer egy olyan fájlrendszer, amely csak és kizárólag a GNU/LINUX operációs rendszer alatt használható jelenleg korlátozás nélkül.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A ReiserFS fájlrendszerről a GNU/ Linux operációs rendszer indítása lehetséges, például a GRUB vagy a LILO segítségével (A GRUB képes a ReiserFS fájlrendszert olvasni, a LILO pedig fájlrendszer-független.) + + \noindent A ReiserFS fájlrendszert tartalmazó partíció \emph{\textbf{írására}} nem ismert semmilyen szoftver Microsoft Windows és Mac OS operációs rendszerek alatt.\\ + + \noindent Mac OS X operációs rendszer alatt a virtualizáción kívül nincs ismert megoldás a ReiserFS fájlrendszer írására és olvasására.\\ + + \noindent A Microsoft Windows operációs rendszerek alatt olvashatjuk a ReiserFS fájlrendszert a megfelelő third-party alkalmazás (például: RFSTool) segítségével. + $\triangleleft$ \faLightbulbO} + + \paragraph*{A ReiserFS előnyei\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Jobb lemezterület-kihasználás.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A ReiserFS fájlrendszerben az összes adat kiegyensúlyozott B*-fastruktúrába van szervezve. A fastruktúra jobban ki tudja használni a lemezterületet, mivel a kis fájlok közvetlenül a B*-fa levélcsomópontjaiban kerülnek tárolásra, nem pedig egy másik helyen és csak egy mutató mutat a tényleges tárolási helyre. Ezen felül a tárterület nem 1 vagy 4 kilobájtos egységekben kerül lefoglalásra, hanem az adatok pontosan a szükséges méretet foglalják el. Másik előnye az inode-ok dinamikus lefoglalása. Így a rendszer rendkívül rugalmas, szemben például az Ext2-vel, ahol az inode-ok sűrűségét a fájlrendszer létrehozásakor kell megadnunk. + $\triangleleft$ \faLightbulbO}\\ + + \item Jobb lemezhozzáférési teljesítmény. + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Kis fájlok esetén az adatok és a (inode) információ általában egymás mellett kerül tárolásra. Ez az információ egyetlen lemez I/O-művelettel kiolvasható, azaz csak egy lemezhozzáférés szükséges a kívánt információ lekéréséhez. + $\triangleleft$ \faLightbulbO} + + \item Gyors visszaállítás rendszerösszeomlás után. + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A legutolsó metaadat-módosításokat nyomkövető napló segítségével a fájlrendszer ellenőrzése nagyon nagy fájlrendszerek esetén is csak néhány másodpercet vesz igénybe. + $\triangleleft$ \faLightbulbO} + + \item Megbízhatóság az adatnaplózás használatával. + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A ReiserFS az adatnaplózást és a sorbarendezett adatmódokat is támogatja, hasonló elven, mint ahogy az Ext3-nál. Az alapértelmezett mód a data=ordered, amely az adatok és metaadatok integritását egyaránt biztosítja, de naplózást csak a metaadatokhoz használ. + $\triangleleft$ \faLightbulbO}\\ + \end{itemize} + + \paragraph*{A ReiserFS fájlrendszer jellemzői\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A ReiserFS fájlrendszer a metaadatokat, sőt a négy kilobájtnál nem rövidebb fájltartalmak kivételével mindent egyetlen B+ fában tárol.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Ez teszi lehetővé a korlátlan számú i-node létrehozását és a nagy könyvtárak tartalmának elérését. + $\triangleleft$ \faLightbulbO}\\ + + \item Több fájl utolsó blokkjait egyetlen lemezblokkban is képes tárolni.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Tárolás szempontjából a legtöbb fájlrendszer a fájlokat blokkokra osztva tárolja. A tipikus blokkméret az NTFS fájlrendszer esetén a négy kilobájt (4 kB), és ha az utolsó blokk rövidebb, akkor a különbség elpazarlódik. Ezen javít a ReiserFS fájlrendszer, mert több fájl utolsó blokkjait egyetlen lemezblokkban is képes tárolni. Ez különösen előnyös az UNIX operációs rendszerbeli apró fájlok esetén, például egy /etc könyvtárban. A technológia neve: tail packing. + $\triangleleft$ \faLightbulbO}\\ + + \item A ReiserFS fájlrendszer – a többi UNIX fájlrendszerhez hasonlóan – egyszerűen az i-node-okat a könyvtárstruktúrán kívül tárolja.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + Tehát például egy négy kilobájtos (4 kB) fájl beolvasásához tipikusan hétszer kell „seekelni”: háromszor, hogy a B+ fában a fájlnév alapján megtaláljuk az i-node számát, és háromszor azért, hogy a B+ fában az i-node száma alapján megtaláljuk az adatblokk kezdőcímét, és egyszer még, mielőtt beolvassuk az adatblokkot. + \noindent A további olvasások már gyorsabbak, mert a B+ fa gyökere és gyökérhez közeli csúcsai ekkor már a cache-ben (cache memory, magyarul belső gyorsítótár) vannak.\\ + \noindent Egy 10000 fájlt tartalmazó könyvtárban a könyvtár tartalmának listázásához szintén körülbelül hét „seekelés” kell, így a könyvtár adatblokkja a benne levő fájlok neveit tartalmazza. Az attribútumokat is tartalmazó listázáshoz („ls –l” parancs) viszont fájlonként további három „seekelés” szükséges, hogy fájlnév alapján megtaláljuk az i-node-ot a B+ fában. Így 10000 fájl esetén 30 007 „seekelésre” van szükség.\\ + \noindent A Reiser4 ezzel szemben közel teszi egymáshoz az összetartozó i-node-okat, emiatt jóval kevesebb „seekelés” kell az „ls –l” parancshoz, és ez sokkal gyorsabbá teszi. + $\triangleleft$ \faLightbulbO}\\ + + \item Hiba esetén, ha az lemezellenőrzés a B+ fában hibát érzékel, azt a jelenlegi ReiserFS fájlrendszer implementáció csak a teljes B+ fa újraépítésével tudja javítani.\\ + + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Az újraépítés nemcsak lassú művelet (mert az egész lemez újraolvasását igényli), hanem sajnos ad hoc is, tehát olyan blokkokat is csúcsnak érzékelhet, amelyek nem azok. Ha tehát a faújraépítés egy fájladatblokkot tévesen csúcsnak érzékel, és ezután néhány bájt módosításával „megjavítja”, akkor épp emiatt az újraépítés okoz további adatvesztést. Nemcsak az a néhány bájt vész el, amit módosítottunk, hanem az egész korábbi fájl is. Ez a nagymértékű adatvesztés a fájlrendszer-ellenőrzés hatására más elven működő fájlrendszerekre nem jellemző, ez tehát ReiserFS fájlrendszer egyik hátránya például az ext2 fájlrendszerhez képest.\\ + \noindent Hardverhiba ellen naplózással sajnálatosan nem lehet védekezni, és ha a lemezen egyes blokkok meghibásodnak, akkor inkonzisztenssé válhat az egész fájlrendszer is, melyre az ellenőrzés deríthet csak fényt (vagy nagyon súlyos hiba esetén már nem is lehet csatolni a fájlrendszert). + $\triangleleft$ \faLightbulbO}\\ + + \end{itemize} + + \paragraph*{A ReiserFS fájlrendszer összehasonlítása más fájlrendszerekkel\\} + + \noindent A ReiserFS fájlrendszer előnyei az ext2 és egyéb korábbi fájlrendszerekhez képest: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item nagyobb maximális fájlméret és fájlrendszer méret + \item a fájlrendszer mérete lecsatolás nélkül is növelhető (ezt az ext3 fájlrendszer is tudja) + \item journaling, azaz naplózás (az ext3 és ext4 fájlrendszerben már van naplózás) + \item nagy könyvtárak gyorsabb elérése + \item nem kell az i-node-ok számát létrehozáskor megadni + \item a négy kilobájtnál kisebb fájlok, fájlblokkok pazarlásmentes tárolása (tail packing) + \end{itemize} + + \noindent A ReiserFS fájlrendszer hátrányai az ext2 és egyéb korábbi fájlrendszerekhez képest: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item globálisan lockolja (zárolja) a Linux-kernelt + \item hardverhiba esetén nagymértékű adatvesztés történhet + \end{itemize} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.pdf new file mode 100644 index 0000000..5fc30e1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.tex new file mode 100644 index 0000000..1c5606f --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/15.Operációs rendszerek/tetel15_short.tex @@ -0,0 +1,2284 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper,bindingoffset=0.2in, + left=1.5cm,right=1.5cm,top=1.25cm,bottom=1.5cm,% + footskip=.25in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{comment} +\usepackage{enumitem} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{makecell} +\usepackage{tikz} +\usepackage{titlesec} +\usepackage[magyar]{babel} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\titleformat*{\section}{\Large\bfseries} +\titleformat*{\subsection}{\large\bfseries} +\titleformat*{\subsubsection}{\normalsize\bfseries} +\titleformat*{\paragraph}{\small\bfseries} +\titleformat*{\subparagraph}{\footnotesize\bfseries} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{15. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +{\par +\hyphenpenalty=10000 +\exhyphenpenalty=10000 +} +{\par} + +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} + +\begin{document} + + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 15. Operációs rendszerek} \\ + \end{center} + + \section*{Folyamatok megvalósítása, ütemező algoritmusaik} + + \subsection*{Folyamatok} + + A \emph{program} egy bájthalmaz a fájlrendszerben. A \emph{\textbf{folyamat}} egy futó program példánya a memóriában: kód + I/O adatok + állapot. Annyiszor jön létre, ahányszor a programot elindítjuk.\\ + + \noindent Egy folyamat élettartamának vezérlése az operációs rendszer feladata: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item létrehozás + \item ütemezés (folyamatok közti váltás) + \item megszüntetés + \end{enumerate} + + \paragraph*{Folyamatok létrehozása} + + A működésre kész operációs rendszerben például \emph{interaktív} kiszolgálás esetén minden terminálhoz tartozhat egy rendszerfolyamat, amelyik felhasználói parancsokat fogad és hajt végre.\\ + + \noindent \emph{Kötegelt} feldolgozás esetén elindulhat egy jobkészletet kezelő folyamat, amelyik jobok végrehajtását kezdi meg és jobonként egy újabb folyamatot indít.\\ + + \noindent \emph{Valós idejű} rendszer esetén az operációs rendszer saját felépülése után létrehozza és inicializálja a felhasználói rendszert alkotó folyamatokat.\\ + + \noindent A rendszerfolyamatok tehát újabb, felhasználói folyamatokat hoznak létre, a felhasználói folyamatok pedig – bizonyos típusú rendszerekben – maguk is létrehozhatnak további felhasználói folyamatokat a logikai processzor megfelelő utasításának végrehajtásával (például fork, create). + + \paragraph*{Folyamatok befejezése} + + Egy folyamat befejezése lehet: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Önkéntes befejezések: + \begin{itemize} + \item szabályos kilépés (exit, return stb.) + \item kilépés lekezelt hiba esetén (szintén pl. return utasítással) + \end{itemize} + \item Önkéntelen befejezések: + \begin{itemize} + \item illegális utasítás + \item végzetes hiba (0-val osztás, nem létező memória használat, stb) + \item egy másik folyamat által + \item felhasználói megszakítás + \end{itemize} + \end{itemize} + + \noindent A folyamatok futhatnak előtérben, illetve a háttérben (démonok).\\ + + \noindent Azokat a rendszereket, amelyek működése során – a felépülés és inicializálás kezdeti szakaszától eltekintve – nem jönnek létre és nem szűnnek meg folyamatok, \emph{\textbf{statikus rendszerek}nek} nevezzük. + \emph{\textbf{Dinamikus rendszerek}ben} működés közben bármikor születhetnek és megszűnhetnek a folyamatok.\\ + + \noindent A folyamatok eredetét szükség esetén a szülő–gyermek viszonyokkal, azaz egy fa struktúrával írhatjuk le (processzgráf). Dinamikus rendszerben a fa természetesen folyamatosan követi a folyamatok születését és halálát. Sok operációs rendszer a szülő–gyermek viszonyokra építi erőforrás-gazdálkodási és jogosultsági filozófiáját.\\ + \emph{\textbf{Hierarchikus erőforrás-gazdálkodás}}, amikor a gyermek folyamatok csak a szülő erőforrásaiból részesülhetnek és nem létezhetnek önállóan, csak amíg szülőjük is létezik. \\ + \emph{\textbf{Globális erőforrás-gazdálkodás}}, amikor a rendszer valamennyi folyamata létrejötte után egyenrangú, önálló szereplő, és versenyezhet a teljes erőforráskészletből való részesedésért. + + \subsection*{Folyamatállapotok} + + \noindent A mai modern számítógép fogalmához hozzátartozik, hogy természetesnek vesszük azt, amikor a számítógépünk egyidejűleg több tevékenységet végez. Például zenehallgatás közben böngészünk a neten.\\ + + \noindent A központi egység olyan gyorsan képes végrehajtani az utasításokat, hogy ha ennél a sebességnél váltogatjuk az éppen végrehajtódó feladatokat, az számunkra azt az illúziót kelti, mintha egymással párhuzamosan történnének a feladat-végrehajtások (ál-multitasking).\\ + + \noindent A folyamatok közti gyors kapcsolást, a végrehajtás váltását \emph{\textbf{multiprogramozás}}nak nevezzük.\\ + +\begin{comment} + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent A mai számítógép egyrészt nem egy processzort, hanem több, önálló végrehajtási egységet foglal magában, másrészt egy fizikai processzor ráadásul több (kettő, négy vagy akár nyolc) magot is tartalmazhat.\\ + + \noindent A központi egységekben minden magnak saját belső memóriája van, ahova a közös fizikai memóriából betöltik az éppen végrehajtandó feladat kódját, és ekkor a magok valódi párhuzamos működést mutatnak. Ez azt jelenti, hogy egy időegység alatt (körülbelül egy óraciklus) mindegyik mag végrehajtja a saját folyamatának utasítását.\\ + + \noindent Ekkor nem látszatpárhuzamosságról beszélhetünk, de ez nem befolyásolja érdemben azt, hogy a folyamatok fogalmi modelljén (szekvenciális, egymás után végrehajtódó folyamatok sora) módosítsunk, amelynek segítségével a párhuzamosság\footnote{Programok vagy programfolyamatok egy idejű, egymás melletti futása} kezelését tudjuk végezni.\\ + + \noindent Így ebben az értelemben a számítógépen futó „program” – magával az operációs rendszer feladataival együtt – nem más, mint szekvenciális folyamatok sorozata. A folyamat egy végrehajtás alatt álló program, és ehhez a folyamathoz tartoznak természetesen más jellemzők is még, mint például a központi egység utasításszámlálója (hol tart a folyamatban a végrehajtás), a központi egység regiszterei (a végrehajtási számítások segédértékei) és a folyamat egyéb más állapotleírói. Ahhoz, hogy egyik folyamatról a másikra tudjunk váltani, az szükséges, hogy mindezen leírókat, adatokat mentsük, hiszen ezek ismerete feltétlenül szükséges a folyamat egy későbbi időpillanatban történő folytatásához. + $\triangleleft$ \faLightbulbO}\\ +\end{comment} + \noindent A folyamatok önálló egységek, a memória egy kis szeletében helyezkednek el. Ahhoz, hogy a központi egység ezeket végre tudja hajtani, a folyamatokhoz tartozzon saját utasításszámláló, verem, és legyenek egyéb állapotjelzői.\\ + + \noindent A folyamatok közül biztosan egy folyamat fut mindig, és az összes többi arra vár, hogy lehetőséget kapjon a futásra.\\ + + \noindent A folyamatok gyakran nemcsak önmagukban számolnak, végeznek feladatokat, hanem az operációs rendszer lehetőségeit is igénybe vehetjük: rendszerhívás\footnote{A rendszerhívás olyan speciális eljáráshívás, amikor a hívások egy kritikus feladat végrehajtására a kernelbe vagy más privilegizált operációs rendszerbeli komponensbe irányulnak. Ilyen rendszerhívások például egy állomány írására, olvasására, átnevezésére irányuló programhívásoké.} formájában kérhetünk segítséget ahhoz, hogy egy program vagy az operációs rendszer fennhatósága alá eső fájlokkal (eszközzel) vagy egy másik folyamattal kommunikáljunk. A folyamatok működése során gyakori feladat, hogy más alkalmazás szolgáltatását vegyük igénybe.\\ + + \noindent A várakozó folyamatokat több csoportba sorolhatjuk az operációs rendszerektől függően. + + \noindent A csoportok között az alábbi négy átmenetet különböztethetjük meg: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textbf{Futó} $\rightarrow$ \textbf{Blokkolt}: {\small Várni kell még valamire. A futó folyamat nem tudja folytatni a futását, mert valamilyen bemeneti adatra van szüksége. Ez akár egy másik folyamat eredménye is lehet.} + \item \textbf{Futó} $\rightarrow$ \textbf{Futásra kész}: {\small Ez egy természetes átmenet. Egyszerűen lejárt az aktuális folyamat processzorideje, és az operációs rendszer a folyamatot a futásra kész, várakozó folyamatok csoportjába sorolja.} + \item \textbf{Futásra kész} $\rightarrow$ \textbf{Futó}: {\small Az előző átmenet fordítottja. Az operációs rendszer ütemezője a futásra készen várakozó folyamatok csoportjából a soron következő folyamatot futtatja. A sorrendről az ütemező dönt, a folyamatok nem nagyon tudnak róla, hogy melyikük fog következni.} + \item \textbf{Blokkolt} $\rightarrow$ \textbf{Futásra kész}: {\small A várva várt adat megérkezett, a blokkolt folyamat marad még a várakozó folyamatok csoportjában, de már futásra készen várja, hogy az ütemező döntése esetén újra futhasson.} + \end{itemize} + + \noindent A folyamatok négy állapotátmenetét és a hozzájuk tartozó három állapotot szemléletesebb formában az \ref{allapotatmentek}. ábra mutatja. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/allapot.png} + \caption{Állapotátmenetek} + \label{allapotatmentek} + \end{figure} + + \noindent \textit{További állapotok}: alvó, megállított, és zombi.\\ + + \noindent Egy processzoron egyszerre egy futó folyamat lehet. Üres processzoron az \emph{Idle} folyamat fut, ami nem csinál semmit.\\ + + \noindent Az operációs rendszernek ahhoz, hogy ezeket a folyamatokat helyesen tudja kezelni, felügyelnie kell a folyamatokat. Az operációs rendszerünk így minden egyes folyamatot nyilvántart, és az operációs rendszer lelkének is nevezett ütemező (scheduler) segítségével szépen sorban minden egyes folyamatnak ad egy kis processzor- (CPU) időszeletet, amíg az adott folyamat dolgozik, azaz a processzorra kerülhet. + + \paragraph*{Folyamatok leírása és táblázata} + + \noindent Ahhoz, hogy a folyamatokat megfelelően tudja ütemezni az operációs rendszer, nyilván kell tartani minden olyan információt, ami a folyamat újraütemezéséhez szükséges. A nyilvántartáshoz az operációs rendszer egy táblázatot használ, amit \textbf{folyamattáblázatnak} vagy \textbf{folyamatvezérlő blokknak} (Process Control Block – PCB) neveznek.\\ + + \noindent Ebben a táblázatban minden olyan információ tárolva kell legyen, ami ahhoz kell, hogy a folyamatot a futó állapotából a futásra kész állapotba hozzuk át, majd ha újra futó állapotba kerül, akkor úgy folytathassa a futását, mintha semmi sem történt volna.\\ + + \noindent A teljesség igénye nélkül egy folyamathoz tartozó ilyen adatok: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a folyamat utasításszámlálója, + \item a folyamat veremmutatója, + \item a processzor regisztereinek adatai, + \item a nyitott fájlok állapotinformációja, + \item a memória (kapcsolódó) adatai, + \item stb. + \end{itemize} + +\begin{comment} + {\footnotesize \noindent {\color{blue} \faLightbulbO\ $\triangleright$ } } + {\footnotesize + \noindent Ez az adatmennyiség nem is olyan kevés, nagyon fontos a mentési és a visszaolvasási hatékonyság. Ha sok időt igényel, akkor az azzal jár, hogy az operációs rendszer ütemezője leköti a rendszererőforrások nagy részét. Bár ezen segít a processzorok egyre nagyobb teljesítménye, de nem lenne elég, ha nem társulna hozzá processzortámogatás. Az x486 processzorcsalád megjelenése óta a folyamatállapot szegmens (Task State Segment – TSS\footnote{Task State Segment, más néven folyamatállapot szegmens. Feladata a folyamatokkal kapcsolatos információk tárolása pl. azonosító, folyamat állapota stb.}, minden folyamatnak van ilyen) segítségével gyorsítja a váltást, illetve a folyamatregiszter (Task Register – TR) tartalmazza az aktív folyamat TSS leíróját. Ennek a cseréje gyors (általában egy-két gépi óraciklus), így ezek révén a folyamatok váltása nagyon hatékony.\\ + + \noindent A folyamattábla legfontosabb mezői (teljesség igénye nélkül): + + \begin{itemize} + \item Kernel információk: + \begin{itemize} + \item a regiszterek, az utasításszámláló, a folyamatállapot, a veremmutató, az aktuális ütemezési prioritás, a maximális ütemezési prioritás, az időzítési egység mérete, a felhasznált processzoridő (CPU idő) stb. + \end{itemize} + \item Folyamatkezelő információk: + \begin{itemize} + \item a kódszegmens-mutató, az adatszegmens-mutató, a szignálállapot, a kilépési állapot, a folyamat azonosítója (PID), a szülőfolyamat azonosítója (PPID), a gyermekfolyamatok processzorideje, a valódi felhasználói azonosító (UID), a valódi csoportazonosító (GID), a folyamat neve stb. + \end{itemize} + \item Fájlkezelő információk: + \begin{itemize} + \item az umask-érték (user mask), a gyökérkönyvtár, a munkakönyvtár, a fájlleírók, a valós felhasználói azonosító (UID), a valós csoportazonosító (GID), a TTY vezérlő stb. + \end{itemize} + \end{itemize} + + \noindent A hardvereszközök kezelésének alapja minden mai operációs rendszerben a megszakításelven működik. Adott egy táblázat, aminek sorszáma a megszakítás\footnote{Egy olyan (általában külső) esemény, amelynek hatására a program futása félbemarad. A megszakításokat egy szám (1 bájt méretű) azonosítja, az int utasításnak is ez a paramétere. A megszakítás azonosító száma alapján a processzor meg tudja állapítani, hogy milyen esemény történt.} számát jelenti, míg a táblázat eleme megadja a kiszolgálórutin címét. Ezt a táblát megszakításvektornak nevezzük. Ilyen kiszolgálási elvre épül az ütemező időzítője is. Ekkor az ütemező, az időzítő kiszolgálórutinja az aktuális folyamatot lecseréli a következőre.\\ + + \noindent Tegyük fel, hogy egy folyamat adatot vár egy lemezegységtől. Az adat hozzáférhetőségét a lemezegység egy megszakításkéréssel jelzi. Ennek kiszolgálása során a kért adatokat a folyamat rendelkezésére bocsátja (a fájlleírók területére másolja), majd a folyamatot blokkolt állapotból futásra készbe állítja, így egy következő ütemezés során a folyamat végrehajtása tovább folytatódik. + $\triangleleft$ \faLightbulbO}\\ +\end{comment} + + \section*{Szálak} + + \noindent A klasszikus operációs rendszerekben minden folyamatnak saját memóriaterülete és saját \lword{címtartománya} van, és egyetlen végrehajtási folyamata. Azaz ha elindítunk egy programot a számítógépen, akkor a program utasítássorozata a kezdetétől az utolsó utasításig egy egyszerű, egymás utáni (szekvenciális) parancssorozatnak tekinthető. Ez ma is jellemzője a legtöbb programnak.\\ + + \noindent Néha előfordul, hogy a feladatunk szempontjából célszerűbb lenne, ha több „párhuzamosan” futó vezérlési szála lenne a folyamatnak. Ilyen eset lehet akár egy számsorozat-rendezési feladat a „Quick Sort” rendezési módszerrel: a sorban keresünk egy „középső” elemet, ami előtt ennél kisebbek, mögötte nagyobb elemek vannak. Így két részre bonthatjuk a sorozatot, és rögtön felötlik bennünk: de jó lenne „párhuzamosan” rendezni az alsó és a felső részt, hiszen ekkor valószínűleg gyorsabban befejeződne a feladatmegoldás.\\ + + \noindent Az ilyen párhuzamosan futó vezérlési szálak használatakor a szálak egy közös memóriaterület foglalnak, amit az eredeti folyamat címtartományából, memóriaterületéből kapnak. A vezérlési szálakat általában egyszerűen szálnak (thread) nevezik, de sokszor találkozhatunk a könnyűsúlyú folyamat (lightweight process) elnevezéssel is.\\ + + \noindent Egy szálnak vannak regiszterei az aktuális változók tárolására, van utasításszámlálója, ami mutatja az aktuálisan következő utasítást, és tartozik hozzá verem is, hiszen a függvények hívási módja megköveteli ennek meglétét.\\ + + \noindent Ha az információkat tárolni kell, márpedig ezek minden szálra egyediek, akkor az adatokat is a folyamatokhoz hasonlóan egy táblázatban célszerű elraktározni. Ebben a táblázatban annyi bejegyzés van, ahány szálat létrehoz a folyamat.\\ + + \noindent A legjellemzőbb sajátosságok, amelyek egy folyamatban biztosan vannak, de egy szálban \lword{(száltáblában)} pedig biztosan nincsenek, a következők: + \emph{címtartomány}, \emph{globális változók}, \emph{nyitott fájlleírók}, \emph{gyermekfolyamatok}, \emph{jelzések} (szignálok\footnote{Más néven jelzés. Egy esemény bekövetkeztéről szignál küldéssel értesíthetünk egy folyamatot.}), \emph{jelzéskezelők}, \emph{függőben lévő ébresztők}.\\ + + \noindent Egy szálban is biztosan nyilván kell tartani az alábbiakat (természetesen ezek egy folyamathoz is kötődnek): + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item utasításszámláló, + \item regiszterek, + \item verem, + \item szálállapot. + \end{itemize} + + \noindent Természetesen ahogy a folyamatok, úgy a szálak is lehetnek „blokkolt”, „futásra kész” vagy éppen „futó” állapotban. +\newpage + \subsection*{Szálak megvalósítása\\} + + \paragraph*{1. verzió} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A többszálú program saját ütemezőt tartalmaz, így egyetlen folyamatként fut, a szálak rejtve maradnak az operációs rendszer elől (green thread). + \item Kommunikáció folyamaton belül történik, közös memóriaterületen, nincs szükség \lword{rendszerhívásra}. + \item Szálak közötti kapcsolás felhasználói védelmi szinten történik, nincs szükség hozzá megszakításra, kivételre vagy \lword{renszerhívásra}. + \item Egyik szál blokkolódik operációs rendszer ezt nem tudja, így az egész folyamatot blokkolja. + \end{itemize} + + \noindent A mai operációs rendszerek általában támogatják a szálak használatát, így ezekben a kernel vezérli a szálfolyamatokat is, tehát a száltáblázatot is a kernel tárolja. + + \paragraph*{2. verzió} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden szál külön folyamatként fut, az operációs rendszer nem tud róla, hogy összetartoznak (native thread). + \item Folyamatok egymástól függetlenül blokkolódhatnak vagy kerülhetnek vissza futáskész \lword{állapotba}. + \item Kommunikáció rendszerhívásokon keresztül történik. + \item Szálak közötti kapcsolás lassú. + \item Megoldás: operációs rendszernek tudnia kell a szálakról. + \end{itemize} + + \noindent Látszólag a két változat között nem igazán lehet különbség, ám például a felhasználói szálkezelés jóval hatékonyabb, gyorsabb megoldást eredményez. Ebben az esetben viszont ha egy szál blokkolt állapotba kerül, mert például adatra vár, akkor az egész folyamat blokkolt állapotba jut, hiszen az ütemező nem tud a szálakról. Ebből a meggondolásból ma mindkét rendszerrel találkozhatunk. + + \section*{A folyamatok ütemezése} + + \noindent A többfeladatos rendszerekben biztosítani kell azt, hogy az egyik folyamat után mikor és melyik folyamat kapja meg a processzorvezérlést. Az operációs rendszernek azt a részét, ami ennek eldöntéséért felel, \textbf{\emph{ütemező}}nek nevezzük. Azt, hogy mi alapján és hogyan végzi ezt a feladatot az ütemező pedig az \emph{\textbf{ütemezési algoritmus}}nak nevezzük.\\ + + \noindent Biztosan van folyamatváltás: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item ha befejeződik egy folyamat + \item ha egy folyamat blokkolt állapotba kerül (I/O vagy szemafor miatt) + \item ha új folyamat jön létre (újabb rendszerekben) + \item I/O megszakítás bekövetkezés + \item időzítő megszakítás (nem megszakítható ütemezés, megszakítható ütemezés) \\ + \end{itemize} + + \noindent Az ütemezési algoritmusoktól minden környezetben elvárjuk, hogy pártatlanok, illetve a kiválasztott elveket és a rendszeregyensúlyt megtartók legyenek. Az ütemezési algoritmusok is annak megfelelően csoportosíthatók, hogy milyen rendszerekről is van szó.\\ + + \noindent Ezért megkülönböztetjük az alábbi ütemezési csoportokat: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{\textbf{Kötegelt}} rendszerekben\footnote{Előre meghatározott sorrend szerint végrehajtandó feladatok együttese.} fontos a processzor- (CPU-) kihasználtság, az egységnyi idő alatt végrehajtott feladatok száma. + \begin{itemize} + \small + \item Példák: pénzintézetek éjszakai vagy hétvégi feldolgozásai (pl. kamatok könyvelése), mentések, hálózati letöltések, víruskeresés + \end{itemize} + \item \emph{\textbf{Interaktív}} rendszerekben\footnote{Párbeszéden alapuló rendszer.} (pl. mai operációs rendszereink), a legfontosabb a felhasználói elvárásoknak való megfelelés és a kérésekre adott gyors válasz. + \begin{itemize} + \small + \item Példák: munka a számítógép előtt, azaz szövegszerkesztés, rajzolás, bizonyos játékok + \end{itemize} + + \item \emph{\textbf{Valós idejű}} rendszerekben, a legfontosabb követelmény az, hogy a megfelelően előírt határidőket (válaszokat, reakciókat) be kell tartani, hiszen ettől valós idejű a rendszerünk. + \begin{itemize} + \small + \item Példák:a repülőgép robotpilótája, az üzemek vezérlő számítógépe, és a bankok automatái. + \end{itemize} + + \end{itemize} + + \subsection*{Kötegelt rendszerek ütemezése} + + \noindent Kötegelt rendszerben három fontosabb ütemezést különböztetünk meg.\\ + + \noindent \textbf{Sorrendi ütemezés} [FCFS (First Come First Served)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nem preemptív. + \item Sorrendi ütemezés, nem megszakítható. + \item A legrégebben várakozó folyamatot választja ki futásra. + \item A futásra kész folyamatok egy várakozási sor végére kerülnek, az ütemező pedig a sor elején álló folyamatot kezdi futtatni. + \item Egy folyamat addig fut, amíg nem végez, vagy nem blokkolódik. + \item Ha blokkolódik, a sor végére kerül. + \item Pártatlan, egyszerű, láncolt listában tartjuk a folyamatokat. + \end{itemize} + + \noindent Hátránya: Nagy lehet az átlagos várakozási idő\footnote{Egy munka mennyi időt tölt várakozással (futásra kész állapot, várakozó állapot, felfüggesztett állapotok)}, mert egy hosszú CPU löketű\footnote{A CPU löket idő az ameddig a folyamat a CPU-t használja} folyamat feltarja a mögötte levőket és a perifériák is tétlenek. I/O igényes folyamatok nagyon lassan végeznek\\ + + {\small + \noindent Példa: $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 24 & 3 & 3 \\ \hline + \end{array}$\\\\ + + \noindent Végrehajtási sorrend: $\boldsymbol{P_1$, $P_2$, $P_3}$\\ + \noindent Várakozási idő: $P_1$ : \textbf{0} ms, $P_2$ : \textbf{24} ms, $P_3$ : \textbf{27} ms\\ + + \noindent Végrehajtási sorrend: $\boldsymbol{P_2$, $P_3$, $P_1}$\\ + \noindent Várakozási idő: $P_1$ : \textbf{0} ms, $P_2$ : \textbf{3} ms, $P_3$ : \textbf{6} ms\\ + } + + \noindent \textbf{Legrövidebb (löket)idejű} [SJF (Shortest Job First)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nem preemptív. + \item Az a program kapja meg a vezérlést, amelyik (várhatóan) a legkevesebb ideig fogja foglalni a processzort a következő perifériaműveletig. + \end{itemize} + + \noindent \textbf{Legrövidebb hátralevő (löket)idejű} [SRTF (Shortest Remaining Time First)] + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az SJF preemptív változata. + \item Ha új folyamat lesz futásra kész, akkor megvizsgálja hogy a futó folyamat hátralevő löketideje vagy az új folyamat löketideje a kisebb. A környezetváltás idejét is figyelembe veszi. + \end{itemize} + + \subsection*{Interaktív rendszerek ütemezése\\} + + \noindent Körbenjáró [RR: (\textbf{Round Robin})]: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Preemptív\footnote{Az aktuális processztől a kernel bizonyos idő után elveszi a vezérlést, és a következő várakozó folyamatnak adja} algoritmus. + \item A programokat egy kör mentén rendezzük sorba, egy program leállásakor a körben utána lévő első futóképes program kapja meg a processzort. + \item Garantáltan minden program sorra kerül. + \item Minden folyamat, amikor futni kezd kap egy időszeletet. + \begin{itemize} + \item Ha a CPU lökete ennél nagyobb, az időszelet végén az ütemező elveszi a folyamattól a CPU-t és a futásra kész várakozási sor végére rakja. + \item Ha a CPU löket rövidebb az időszeletnél, akkor a folyamatokat újraütemezzük, és a futó folyamat időszelete újraindul. + \end{itemize} + \item Időszelet végén a körkörös listában következő lesz az aktuális folyamat. + \item Pártatlan, egyszerű. + \end{itemize} + + \noindent Hátránya: Nehéz az időszelet megfelelő méretének a meghatározása, mert a processz átkapcsolás időigényes. Nagy időszelet átmegy FCFS algoritmusba és interaktív felhasználóknak lassúnak tűnhet pl a billentyűkezelés. Kis időszelet esetén egyenlő mértékben használják a CPU-t, de sok a környezetváltás, ami rontja a teljesítményt.\\ + + {\small + \noindent Példa: $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 24 & 3 & 3 \\ \hline + \end{array}$\\ + } + + {\small + \noindent Legyen az időszelet $T_{szelet} = 4 ms$\\ + + \noindent $ + \begin{array}{c|c|c||c|c|c|c|c} + P_{1} & P_{2} & P_{3} & P_{1} & P_{1} & P_{1} & P_{1} & P_{1} \\ \hline + 4ms & 3ms & 3ms & 4ms & 4ms & 4ms & 4ms & 4ms + \end{array}\\ + $ + } +\newpage + \noindent \textbf{Időszelet ($T_{szelet}$) hatása a környezetváltás gyakoriságára} \\ + + {\small + \noindent $\begin{array}{|c|c|c|c|} + \hline + P_{i} & P_{1} & P_{2} & P_{3} \\ \hline + C_{i}(ms) & 10 & 10 & 10 \\ \hline + \end{array}$\\\\ + + \noindent $\begin{array}{c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 \\ \hline + 12 ms & 10 ms & 10 ms & 10 ms \\ + \end{array}$\\ + + \noindent Környezetváltások száma: \emph{\textbf{0}}.\\ + + \noindent $\begin{array}{c||c|c|c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 & _{KV_1} | P_1 & P_2 & P_3 \\ \hline + 6 ms & 6 ms & 6 ms & 6 ms & 4 ms & 4 ms & 4 ms \\ + \end{array}$\\ + + \noindent Környezetváltások száma: \emph{\textbf{1}}.\\ + + \noindent $\begin{array}{c||c|c|c||c|c|c||c||c|c|c} + T_{szelet} & P_1 & P_2 & P_3 &_{KV_1} | P_1 & P_2 & P_3 & \cdots & _{KV_9} | P_1 & P_2 & P_3 \\ \hline + 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & 1 ms & \cdots & 1 ms & 1 ms & 1 ms \\ + \end{array}$\\ + + \noindent Környezetváltások száma: \emph{\textbf{9}}.\\ + } + + \subsection*{Prioritásos ütemezés} + + Az egyenlőség, futási erősség jelzésére prioritási szinteket definiálunk, és minden programhoz egy prioritási értéket rendelünk (rendszerint egy egész számot).\\ + + \noindent Például: Unix + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item 0-49 nem megszakítható (kernel) prioritás, + \item 50-127 user prioritás. + \end{itemize} + A legmagasabb prioritással rendelkező programok futnak először. \\ + + \noindent Ennek a módszernek a hátránya, hogy előfordulhat olyan eset mikor egy alacsony prioritású folyamat örökké várakozik. Ezért ezt a módszert így tisztán nem alkalmazzák, a prioritásokat bizonyos idő után korrigálják, hogy az alacsony prioritású programok is sorra kerüljenek.\\ + + \paragraph*{A prioritás meghatározása} + + \noindent A prioritás meghatározása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{belső}: Az OS határozza meg + \item \emph{külső}: Az OS-en kívüli tényező határozza meg + \end{itemize} + + \noindent A prioritás a futás során: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item statikus: végig azonos + \item dinamikus: az OS változtatja + \end{itemize} + + \noindent Prioritást sokszor a löketidő alapján határozzák meg.\\ + + \noindent A löketidő szükséglet meghatározása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a folyamat (felhasználó) bevallása alapján + \item ellőző viselkedés alapján (a korábbi löketidők alapján becsli) + \end{itemize} + + \noindent A kiéheztetés és elkerülése + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Kiéheztetés: A folyamat sokáig (esetleg soha) nem jut processzorhoz + \item Prioritásos algoritmusoknál kiéheztetés felléphet. Ennek kivédése a folyamatok öregítése: A régóta várakozó folyamatok prioritását növeljük.\\ + \end{itemize} + + \subsubsection*{Prioritásos ütemezési algoritmusok\\} + + \noindent \textbf{Legrövidebb (löket)idejű} [SJF (Shortest Job First)]\\ + + \noindent A kötegelt rendszerben használt algoritmus itt is használható. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A legrövidebb becsült löketidejű folyamatot választja ki futásra. + \item A felhasználó által megadott és az előzmények alapján becsült löketidőt veszi alapul.\\\\ + Az első futási időt jelöljük $T_1$-gyel, a következő időt $T_2$-vel, és vegyünk egy $x$-szel jelölt, egynél kisebb súlyértéket. Ekkor a következő becsült (avagy súlyozott) futási időt tételezzük fel harmadszorra: + \[ + x * T_{1} + (1 - x)T_{2} + \] + \item Legjobb válaszarány (HRR: Highest Reponse Ratio): A folyamat kiválasztásánál a löketidőt és a várakozási időt is figyelembe veszi. Öregítést alakalmaz (aging), azaz a régóta várakozó folyamatok prioritását növeli.\\ + \end{itemize} + + \paragraph*{A garantált ütemezés} + + \noindent Minden aktív folyamat arányos CPU időt kap, nyilván kell tartani, hogy egy folyamat már mennyi időt kapott, ha valaki arányosan kevesebbet akkor az kerül előre. + + \paragraph*{A sorsjáték-ütemezés} + + \noindent Mint a garantált ütemezés, csak a folyamatok között „sorsjegyeket” osztunk szét és az kapja vezérlést akinél a kihúzott jegy van. + + \paragraph*{Az arányos ütemezés} + + \noindent Úgy működik, mint a garantált, csak felhasználókra nézve.\\ + + \subsection*{Valós idejű rendszerek ütemezése} + + A valós idejű rendszerek kulcsa az idő. Ahogy láttuk korábban, az ütemezési algoritmusok pedig pontosan arról szólnak, hogy adott idő eltelte után ki legyen a következő futó. Ezek esetében is kulcsszerepe van az időnek.\\ + + \noindent Egy operációs rendszerben, ha a feladatainknak nemcsak azt szabjuk meg, hogy hajtódjanak végre valamilyen korrekt ütemezés szerint, hanem az is egy kritérium, hogy egy adott kérést valamilyen időn belül ki kell szolgálni, akkor valós idejű operációs rendszerről beszélünk.\\ + + \noindent A valós idejű ütemezést két kategóriába sorolhatjuk. + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Hard Real Time (szigorú), abszolút, nem módosíthatóhatáridők. + \item Soft Real Time (toleráns), léteznek a határidők, de ezek kis mértékű elmulasztása tolerálható. + \end{itemize} + + \noindent A megfelelő határidők betartása úgy valósítható meg, hogy egy programot több folyamatra bontunk, és ezeknek a rövid (vagy rövidebb) folyamatoknak az ütemező biztosítja a számukra előírt határidő (vagy határidők) betartását. Ha a folyamatoknak egységnyi idő alatt $N$ eseményük van, amelyek elvégzéséhez szükséges összes idő több mint egy, akkor az ilyet kezelhetetlenek tekintjük. Ha az összes idő kisebb, mint egy, akkor a valós idejű rendszer ütemezhető. + + \subsection*{Szálütemezés} + + \noindent Röviden szóljunk befejezésül a szálak ütemezéséről. Két esetről beszélhetünk a szálak ütemezésével kapcsolatban.\\ + + \noindent A felhasználói szintű szálakról az operációs rendszer nem tud, így ebben az esetben az alkalmazás tud mindenről, akár arról is, hogy egy szál elhasználja a folyamat teljes idejét, és a többi szál pedig csak várakozik. Az ilyen szál önző viselkedése nem érinti a többi folyamatot, csakis a szál folyamatát, és esetlegesen a meglévő „testvér” szálait.\\ + + \noindent A kernel rendszerhívásszintű szálakról az operációs rendszer tud, és gyakorlatilag egyenrangúan kezeli azokat a folyamatokkal, tehát minden szál részt vesz az ütemezési folyamatban. Ebben az esetben a szálak közti kapcsolás gyakorlatilag a folyamatok közti kapcsolással azonos erőforrást igényel, és pontosan az a helyzet, mint a korábbi ütemezési algoritmusoknál.\\ + + \noindent A felhasználói szálváltás, amit nem is az ütemező végez, ehhez képest gyors, hiszen nem kell környezetváltást végezni, de ezt az ütemezést az alkalmazásnak kell tartalmaznia! + + \section*{Párhuzamosság, kritikus szekciók, kölcsönös kizárás megvalósítása} + + \subsection*{Párhuzamosság és megvalósítása} + + A mai operációs rendszerek majdnem mindegyike a többfeladatos, multiprogramozásos modellt használja. Ez azt jelenti, hogy az operációs rendszer nyilvántartja az éppen „futó” folyamatokat, és gondoskodik arról, hogy ezek szép sorban végrehajtódjanak, biztosítva azt, hogy minden folyamatról úgy érezzük: „folyamatosan” működik. Ebben az esetben néha látszatpárhuzamosságról is beszélünk, különösen akkor, amikor egy processzor (CPU) van a rendszerben, megkülönböztetve ezt attól az esettől, amikor többmagos processzorral kiépített számítógépet használunk, netalán ebből nem is egyet. Ekkor a magok valódi párhuzamos működést mutatnak, ugyanazt a fizikai memóriát használva. Ebben a modellben a folyamatok párhuzamosságának alapja az, hogy a folyamatok egy szekvenciális végrehajtási sorrá alakulnak. Ezekbe a folyamatokba beleértjük az operációs rendszer rendszerfolyamatait is. + + \subsubsection*{Valódi párhuzamosság} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Többprocesszoros rendszerek + \begin{itemize} + \item Akár processzorok százai egy számítógépben + \item Közös sín, közös órajel, akár közös memória és perifériák, gyors kommunikáció + \item Gazdaságos teljesítmény-növelés + \item A megbízhatóságot általában nem növeli! + \end{itemize} + \item Klaszterek (fürtök) + \begin{itemize} + \item Önállóan is működőképes számítógépek együttműködése + \item Egységes rendszer illúziója + \item Lassú kommunikáció (tipikusan helyi hálózat) + \item Magas rendelkezésre állás + \end{itemize} + \end{itemize} + + \subsubsection*{Versenyhelyzetek} + + Amikor a futás kimenete attól függ, hogy melyik folyamat mikor és mennyit futott, azaz a párhuzamos végrehajtás következtében előforduló nem determinisztikus viselkedést versenyhelyzetnek nevezzük.\\ + + \noindent A versenyhelyzeteket nehéz reprodukálni és debuggolni, mivel a program működése nemdeterminisztikus, és az egymással versengő szálak közötti viszonylagos időzítéstől függ. Minden beavatkozás a program működésébe azzal járhat, hogy megváltozik a viszonylagos időzítés, így lehet, hogy a naplózás vagy a debuggoló rendszer teljesen kijavítja a hibát; ezek nélkül a program azonban továbbra is néha hibásan működik.\\ + + \subsection*{Kölcsönös kizárás és megvalósítása} + + A megosztott változók, vagy akár a megosztott fájlok használatánál keressük az ideális módszert arra, hogy ezeket az adatokat egy időben egynél több folyamat ne tudja használni (versenyhelyzet elkerülése). Ez azt jelenti, hogy a folyamatoknak kölcsönösen ki kell zárni egymást ezen megosztott erőforrások használata során.\\ + + \noindent A programok futásuk nagy részében végzik a mindenki mástól független számolási, írási, olvasási műveleteket. Azokat az utasításokat, azt a programrészt, amelyben a programunk a közös adatokat használja, kritikus területnek, \textbf{\emph{kritikus szakasznak}} vagy kritikus blokknak nevezzük.\\ + + \noindent Annak biztosítására, hogy a párhuzamosan működő folyamataink korrekten együttműködjenek, ne alakuljon ki versenyhelyzet, az alábbi négy feltételnek kell teljesülni: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Egyszerre legfeljebb egy folyamat lehet a kritikusszakaszban. (\textbf{\emph{Kölcsönös kizárás}}) + \item Ne legyen semmilyen előfeltétel a számítógép sebességéről, a processzorok számáról vagy a memória nagyságáról. + \item A folyamat a kritikus szakaszon kívül ne blokkoljon másik folyamatot. + \begin{itemize} + \item Ha egy folyamat sincs a kritikus szakaszban, és van olyan folyamat, amely be akar lépni, akkor csak a belépni kívánó folyamatok vehetnek részt annak eldöntésében, hogy ki lépjen be, és véges időn belül dönteniük kell. (\textbf{\emph{Haladás}}) + \end{itemize} + \item Egy folyamatnak se kelljen örökké várni arra, hogy sorra kerüljön. + \begin{itemize} + \item A kritikus szakaszba belépni kívánó folyamatok közül minden folyamat előbb-utóbb kerüljön sorra. (\textbf{\emph{Korlátozott várakozás}}) + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/mutex.png} + \caption{A kölcsönös kizárás elvárt viselkedése} + \end{figure} + + \noindent A két folyamat (az „A” és a „B” folyamatok) közti kölcsönös kizárás biztosítja, hogy egyidejűleg csak az egyik lehet a kritikus szekciójában. A „B” folyamat $T_2$ időpillanatban megpróbálja a kritikus szekcióját végrehajtani, de nem teheti, mert az „A” folyamat már a saját kritikus szekciójában van. A $T_2$ és $T_3$ időpillanat között a „B” folyamatnak várakoznia kell arra, hogy be tudjon lépni a saját kritikus szekciójába. + + \subsection*{Megvalósítások} + + \subsubsection*{A kölcsönös kizárás biztosítása a megszakítások tiltásával} + + A legegyszerűbb megoldás a kölcsönös kizárás megvalósítására: a folyamat, mielőtt belépne a kritikus szakaszba, letiltja a megszakításokat, majd miután kilépett a kritikus szakaszból, újra engedélyezi a megszakításokat. Ezzel elérheti, hogy a kritikus szakasza alatt nem történik folyamatváltás, mivel az ütemező az óramegszakítás hatására cseréli le a folyamatokat. Ugyanezt éri el, ha csak az ütemezést vagy a folyamatváltást tiltja le a folyamat.\\ + + \noindent Ez a megoldási módszer valódi párhuzamos folyamatok esetén nem használható, mivel a megszakítások tiltása csak az adott processzorra vonatkozik. Továbbá nem szabad a felhasználói folyamatoknak ekkora hatalmat adni, mivel a rosszindulatú folyamatok nem kapcsolják vissza a folyamatváltást, így átveszik az uralmat a processzor (CPU) felett.\\ + + \noindent Az ismertetett megoldás a felhasználói programok esetén sem használatos, azonban a kerneleken belül gyakran alkalmazott módszer. A kernel a futása alatt tiltja a megszakításokat, így más folyamat nem futhat, amíg a kerneleljárás véget nem ért. Az egyprocesszoros rendszereknél így tudja biztosítani a kernelműveletek atomi voltát (megszakíthatatlanságát). + + \subsubsection*{Szigorú váltogatás} + + A következő megoldásban egy „zálog” nevű változó tartalmazza azt, hogy melyik folyamat léphet be a kritikus szakaszba. + {\small + \begin{verbatim} +#define FALSE 0 +#define TRUE 1 +int zalog; + +while( TRUE ) { + while( zálog != sorszámom ); + // Tevékeny várakozás. + kritikus_szakasz(); + zálog = (zálog + 1) % folyamatok_száma; + nem_kritikus_szakasz(); +}\end{verbatim} +} + + \noindent A második sorban lévő ciklus azt teszteli, hogy beléphet-e a folyamat a kritikus szakaszba, azaz a zálog az ő sorszámával megegyezik-e. A ciklus magja egy üres utasítás, tehát csak a feltételt teszteljük folyamatosan. Ezt tevékeny várakozásnak nevezzük. A tevékeny várakozást általában kerülni kell, mivel nagyon pazarolja a processzor- (CPU-) időt. A másik probléma ezzel a megoldással, hogy a folyamatok sorba léphetnek csak be a kritikus szakaszba, ami megsérti a párhuzamos környezetben egy közös erőforrás használatakor javasolt feltételekből a harmadik feltételt, mivel ezáltal előfordulhat, hogy egy kritikus szakaszon kívüli folyamat sorszámával azonos a zálog, és ekkor ez a folyamat blokkolja a zálogra váró folyamatokat. + + \subsubsection*{Peterson megoldása (1981)} + + G. L. Peterson javította a szigorú váltogatást. Tegyük fel most azt, hogy két folyamat verseng egymással a közös erőforrás használatáért (processz = 0 és processz = 1). Mielőtt a folyamat belépne a kritikus szakaszba, meghívja a „belepes” eljárást, a kritikus szakasz végén pedig meghívja a „kilepes” eljárást. A „belepes” eljárás biztosítja, hogy szükség esetén várakozni fog a folyamat (mindezt tevékeny várakozással). + + \noindent A megoldás lényege az, hogy a \emph{verseng} nevű vektorban tároljuk azt, hogy mely folyamatok akarnak belépni a kritikus szakaszba. Ha csak az egyik folyamat akar belépni a kritikus szakaszba, akkor a \emph{zalog} az övé lesz, ha a másik folyamat nem verseng. Tehát a várakozó ciklust „átugorjuk”. Ha ezután a másik folyamat is belép, akkor a \emph{zalog} nála lesz, de a \emph{verseng} nevű vektorból azt látja, hogy a már belépett folyamat verseng, tehát várakozni fog addig, amíg a kritikus szakaszból ki nem lép a folyamat, és meg nem hívja a \emph{kilepes} eljárást. A \emph{kilepes} eljárás a \emph{verseng} nevű vektornak a folyamat sorszámával indexelt elemét FALSE-ra állítja.\\ + + \paragraph*{A TSL utasítás használata} + + Szoftveres megoldás helyett hardveresen biztosított a kritikus szakaszba lépés.\\ + + \noindent TSL (Test and Set Lock) utasítás, melynek működése a következő: + \begin{verbatim} +boolean TSL (boolean & zár) { + boolean érték = zár; + zár = true; + return érték; +} + \end{verbatim} + + \noindent A TSL utasítástól elvárt, hogy legyen + \begin{itemize} + \item atomi + \item megszakíthatatlan, és + \item ugyanarra a zárra egyszerre csak egy processzor hajthatja végre + \end{itemize} + + \noindent Ez által a szinkronizáció jóval egyszerűbbé válik: + \begin{itemize} + \item Belépés: + \begin{verbatim} + while (TSL(zár)) + ; /* várakozik */ + \end{verbatim} + \item Kilépés: + \begin{verbatim} + zár = false; + \end{verbatim} + \end{itemize} + + \noindent A modern processzorokban általában van ilyen utasítás, viszont a \emph{korlátozott várakozás feltétele} nem teljesül! + + \subsubsection*{TSL + korlátozott várakozás} + + A várakozó folyamatok nyilvántartásával kijavítható a megoldásunk: + + \begin{itemize} + \item Belépés: + \begin{verbatim} +#define FALSE 0 +#define TRUE 1 + +várakozik[i] = TRUE; +while (várakozik[i] && TSL (zár)) +; /* vár */ +várakozik[i] = false; + \end{verbatim} + \item Kilépés: + \begin{verbatim} +j = i + 1; +do { + j = (j + 1) % n; +} while (j != i && !várakozik[j]); +if (j == i) + zár = false; +else + várakozik[j] = false; + \end{verbatim} + \end{itemize} + + \noindent Ez már mindhárom követelménynek eleget tesz (kölcsönös kizárás, haladás, korlátozott várakozás). + + \paragraph*{Az alvás-ébredés módszere} + + Az előzőekben említett megoldások komoly problémájának róható fel az, hogy tevékeny várakozással oldották meg a problémát, azaz egy ciklusban vizsgálták, hogy beléphetnek-e a kritikus szakaszba, vagy sem. Ezzel a módszerrel feleslegesen sok processzor- (CPU-) időt pazaroltak. A tevékeny várakozás a processzoridő pazarlása mellett fordított prioritási problémának nevezett hibalehetőséget is magában rejti. Tegyük fel, hogy az operációs rendszer prioritásos ütemezőt használ. Amíg van magas prioritású futásra kész folyamat, addig alacsonyabb prioritású folyamatot nem futtat. Legyen egy alacsony prioritású folyamat, amelyik a kritikus szekciójában van; ekkor egy magas prioritású folyamat tevékeny várakozásba kezd, amit az alacsonyabb prioritású folyamat tudna feloldani, ha be tudná fejezni a kritikus szekcióját, de soha nem kerül a processzorhoz, mivel az ütemező mindig a magas prioritású tevékenyen várakozó folyamatot választja.\\ + + \noindent A tevékeny várakozás feloldására javasolt egyik eszköz a sleep-wakeup páros. A sleep egy olyan rendszerhívás, amely blokkolja a hívó folyamatot, a wakeup pedig olyan rendszerhívás, amely felébreszti a paraméterül kapott alvó folyamatot. + + \paragraph*{Példa az alvás-ébredés módszerére: a gyártó-fogyasztó probléma} + + A sleep-wakeup használatára tekintsük példaként a gyártó-fogyasztó problémát. Van egy gyártó és egy fogyasztó folyamatunk. A gyártó termel, és a termelt árut elhelyezi egy tárolóban.\\ A fogyasztó fogyaszt úgy, hogy a tárolóból kiveszi az árut. A tároló kapacitása véges + \begin{itemize} + \item ha megtelik, a gyártást le kell állítani; + \item ha kiürül, a fogyasztónak várnia kell, amíg újra áru kerül a tárolóba. + \end{itemize} + + \noindent Amikor a gyártó egy új árut rak a tárolóba, és a tároló megtelik, akkor elmegy aludni, majd amikor a fogyasztó kivesz árut a tárolóból, akkor felébreszti a gyártót. Fordítva is hasonlóan: amikor a fogyasztó szeretne kivenni árut a tárolóból, de azt látja, hogy kiürült, akkor elmegy aludni, majd amikor a gyártó árut helyez el a tárolóban, akkor felébreszti az alvó fogyasztót.\\ + + \noindent Legyen egy „DB” nevű változó, amely a tárolóban lévő elemek számát, illetve egy „KAPACITÁS” nevű változó, ami a tároló kapacitását tartalmazza.\\ + + \noindent Versenyhelyzet előfordulhat ebben a megoldásban. Tegyük fel azt, hogy a tároló üres, és a fogyasztó kiolvassa a „DB” nevű változó értékét, majd az ütemező átadja vezérlést a gyártónak, aki betesz egy árut a tárolóba, és növeli a „DB” nevű változó értékét egyre. A gyártó látván azt, hogy a „DB” nevű változó értéke eggyel egyenlő (azaz DB==1), ébresztést küld a fogyasztónak, aki még nem alszik (tehát az ébresztés elmarad). Amikor a vezérlés visszakerül a fogyasztóra, a korábban kiolvasott „DB” nevű változó nulla értéke miatt (azaz DB==0) elmegy aludni. A gyártó szép lassan megtölti a tárolót, majd elmegy ő is aludni. Ezt követően mindkét folyamat alszik, és a másikra vár, hogy felébressze. Tehát így „örökké” aludni fognak. A probléma akkor történt, amikor a nem alvó folyamatnak küldtek ébresztést. Ez az ébresztés elveszett. Meg lehetne oldani, hogy az ilyen ébresztést elrakjuk, és amikor el akarna aludni a folyamat, akkor megnézi, van-e talonba ébresztése; ha igen, akkor nem alszik el, csak a talont felhasználja. + + \subsubsection*{Sorszámhúzásos szinkronizáció} + + \noindent A sorszámhúzós szinkronizáció tetszőleges számú folyamatra alkalmazható. Működése az ügyfélfogadó rendszerek mintájára épül. Ez mindhárom követelménynek eleget tesz (kölcsönös kizárás, haladás, korlátozott várakozás). + + \section*{Szemaforok, osztott memória, üzenetküldés} + + \subsubsection*{Szemaforok} + + A szemafor egy új, egész értékű típus. Általános célú megoldás, a szinkronizáció megkönnyítésére. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Ha a szemafor értéke $> 0$, szabad a pálya, beléphetünk a kritikus szakaszra. + \item Két atomi művelet (plusz kezdőértékadás) + \begin{itemize} + \item Ha belépünk egy kritikus szekcióba, csökkentjük szemafor értékét; + \begin{itemize} + \item \emph{down}(S): Ha S értéke zérus, várakozik, míg S pozitívvá nem válik. Egyébként, ill. ezután S-t eggyel csökkenti.\\ + (Eredetileg: P(S), a holland proberen, megpróbálni szóból.) + \end{itemize} + \item Ha kilépünk egy kritikus szekcióból, növeljük a szemafor értékét. + \begin{itemize} + \item \emph{up}(S): S értékét eggyel növeli. \\ + (Eredetileg: V(S), a holland verhogen, megemelni szóból.) + \end{itemize} + \item Megengedett, hogy egyszerre több down művelet legyen várakozó állapotban + \end{itemize} + \end{itemize} + + \noindent Ha a szemafor tipikus vasutas helyzetet jelöl, azaz 1 vonat mehet át csak a jelzőn, a szemafor értéke ekkor 0 vagy 1 lehet. Ez a \textit{bináris szemafor}, vagy más néven \textbf{\emph{mutexnek}} (Mutual Exclusion) nevezzük, és kölcsönös kizárásra használjuk. \\ + + \noindent Rendszerhívással, felhasználói szinten nem biztosítható a műveletek atomiságának megvalósítása. Művelet elején például letiltunk minden megszakítást. Ha több CPU van, akkor az ilyen szemafort védeni tudjuk a TSL utasítással. Viszont ezek a szemafor műveletek kernel szintű, rendszerhívás műveletek. A fejlesztői környezetek biztosítják. + + \subsubsection*{Szemaforok alkalmazásai} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Kezdetben legyen mutex = 1. + \item Belépés: down(mutex); + \item Kilépés: up(mutex); + \begin{verbatim} +while (1) { + down(mutex); + kritikus_szekcio(); + up(mutex); + nem_kritikus_szekcio(); +} + \end{verbatim} + \item Tetszőleges számú folyamatra működik. + \item Kölcsönös kizárás és a haladás feltétele teljesül. + \item Korlátozott várakozás teljesítése az \emph{up} implementációjától függ. + \item Ha mutex értékét \emph{k}-ról indítjuk, egyszerre legfeljebb \emph{k} darab folyamat lehet a kritikus szekcióban. + \item Már két utasítás felcserélése is gondot okozhat. + \end{itemize} + + \subsection*{Szemaforok implementációja} + + Egyszerű implementáció: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item down(S):\\ +% \begin{verbatim} +while (S $<=$ 0); /* vár */\\ +S = S-1; +% \end{verbatim} + \item up(S): +% \begin{verbatim} +S = S+1; +% \end{verbatim} + \end{itemize} + \noindent Feltételezések: + \begin{itemize} + \item S értékváltoztatásai atomiak + \item A \emph{down} műveletben a ciklusfeltétel hamissá válása és az értékcsökkentés együtt is oszthatatlan művelet + \end{itemize} + + \noindent Általában processzorok speciális utasításai segítik az implementációt.\\ + + \noindent A szemafor és a mutex közti különbség: Az a különbség, hogy míg utóbbi csak kölcsönös kizárást tesz lehetővé, azaz egyszerre mindig pontosan csakis egyetlen feladat számára biztosít hozzáférést az osztott erőforráshoz, addig a szemafort olyan esetekben használják, ahol egynél több - de korlátos számú - feladat számára engedélyezett a párhuzamos hozzáférés + + \subsection*{Monitorok} + + A szemaforral ellentétben a monitor egy magasabb szintű, objektum elvű, objektumorientált művelet. Ezt a programszerkezetet C.A.R Hoare angol programfejlesztő dolgozta ki 1974-ben. \ + + \noindent A monitor objektum egy több szál által használt eljárás nem párhuzamos végrehajtását teszi lehetővé, azaz nem folyamat szintű művelet. Ötvözi az objektum orientált programozást a szinkronizációs metódusokkal.\\ + + \noindent A monitor objektuma következőkből áll: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item osztott adat + \item ezeket az adatokat feldolgozó eljárások + \item monitort inicializáló metódusok + \end{itemize} + + \noindent A megvalósításhoz három dologra van szükség: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item feltételváltozó és + \item két művelet + \begin{itemize} + \item wait(): Az állapot bekövetkeztére vár, eközben más folyamatok is beléphetnek a monitorba + \item signal(): Jelzi az állapot bekövetkeztét. Ha nincs az állapotra váró folyamat, nem csinál semmit; egyébként kiválaszt egy várakozó folyamatot, és felébreszti + \end{itemize} + \end{itemize} + + \noindent A kritikus adatokhoz csak szinkronizált műveleteken keresztül lehet hozzáférni.\\ + + \noindent Minden eljárás halmazt egy monitor kontrolál. A többszálas alkalmazás futásakor, a monitor egyetlen szálnak engedélyezi egy adott időpontban az eljárás végrehajtását. Ha egy szál éppen egy monitor által kontrolált eljárást akar futtatni akkor az lefoglalja a monitort. Abban az esetben ha a monitor már foglalt akkor a belépni szándékozó szál várakozik amíg a monitort lefoglaló szál befejezi az adott eljárás végrehajtását és felszabadítja a monitort.\\ + + \noindent Előnye, hogy a közösen használandó erőforrások és az erőforrásokon végrehajtható műveletek egyetlen szintaktikus egységben helyezkednek el.\\ + + \noindent A monitor és a szemafor összehasonlítása: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A monitor magasabb szintű eszköz. Magas szintű, objektumorientált nyelvek esetében (pl. Java) roppant egyszerűen használható. + \item A szemaforok segítségével rugalmasabban kezelhetők a kritikus szakaszok, hiszen nem kell beágyazott módon, előre elkészíteni az összes kritikus szakaszt. + \item A szemaforokkal több kritikus erőforrás használatát könnyebb általában összekombinálni egy kritikus szakaszon belül. + \end{itemize} + + \noindent Ha olyan osztott, többprocesszoros rendszert használunk, ahol a központi egységeknek saját memóriájuk van, akkor ezek a módszerek nem igazán használhatóak. + + \paragraph*{Az üzenetküldéses paradigma} + + Ha a párhuzamos programot – a programfejlesztés valamilyen szintjén – egymástól független, egymással kommunikáló szekvenciális folyamatok halmazaként fogjuk fel, akkor a kommunikációt tekintve alapvetően kétfajta programozási paradigmáról beszélhetünk. + + \noindent Az első az osztott memóriás modell, amelyben a futó folyamatok ugyanahhoz a (nem feltétlenül fizikai) memóriához férnek hozzá.\\ + + \noindent A második pedig az üzenetváltásos modell, amelyben minden egyes folyamat a többi által nem elérhető memóriát használ, a kommunikációt pedig a folyamatok közötti (szinkron, aszinkron, illetve a kettő közötti átmenetnek megfelelő) üzenetek biztosítják.\\ + + \noindent Az, hogy a programfejlesztési modellünk üzenetváltásos modell, nem jelenti feltétlenül azt, hogy végül az implementált programnak is feltétlenül „üzenetváltásos” hardveren kell futnia.\\ + Természetesen igaz az, hogy az üzenetváltásos modellnek megfelelő algoritmusok, programok egyszerűbben és általában hatékonyabban implementálhatók üzenetváltásos architektúrákon. (Valamint az osztott memóriás modell alapján készült programok egyszerűbben és hatékonyabban implementálhatók osztott memóriás hardveren.) + + \subsection*{Osztott memória} + + A megosztott memória segítségével megoldható, hogy különböző folyamatok ugyanazt a \lword{memóriaterületet} közösen használják. A közösen használt memóriaterület lehetőséget ad az adatok megosztására és a gyors kommunikációra. A rendszer csak a hozzáférési jogosultságokat kezeli, tehát az egyidejű közös erőforrás-használat következményeként versenyhelyzet alakulhat ki. A versenyhelyzetek kezelése a felhasználói folyamatok feladata.\\ + + \noindent Közös memórián keresztül történő adatcsere esetén az együttműködő folyamatok mindegyike saját címtartományában lát egy közös memóriát. + + \noindent A közös memória elérését (a közös memória címtartományára kiadott olvasás vagy írás művelet végrehajtását) valamilyen adatátviteli rendszer (kapcsolóhálózat, sín stb.) teszi lehetővé.\\ + + \noindent A folyamatok párhuzamos futása miatt a közös memóriát egyidejűleg több folyamat is írhatja, illetve olvashatja. Ilyen esetekre a RAM-modell nem határozza meg a memória működését, ezért a közös memóriát a RAM-modell kiterjesztésével kapott PRAM (Pipelined Random Access Memory) modell szerint kell kialakítani.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/shared_memory_sync.png} + \caption{Folyamatok együttműködése PRAM szerint működő közös memórián} + \label{shared_memory_sync} + \end{figure} + + \noindent A PRAM-modell szerint működő memóriát több processzor írhatja és olvashatja egyidejűleg. Az olvas és ír műveletek egyidejű végrehajtására a RAM-modellhez képest az alábbi kiegészítések vonatkoznak: + \begin{itemize} + \item olvasás-olvasás ütközésekor mindkét olvasás ugyanazt az eredményt adja, és ez megegyezik a rekesz tartalmával, + + \item olvasás-írás ütközésekor a rekesz tartalma felülíródik a beírni szándékozott adattal, az olvasás eredménye vagy a rekesz régi, vagy az új tartalma lesz, más érték nem lehet, + + \item írás-írás ütközésekor valamelyik művelet hatása érvényesül, a két beírni szándékozott érték valamelyike írja felül a rekesz tartalmát, harmadik érték nem alakulhat ki. + \end{itemize} + + \noindent Ezek a szabályok lényegében azt jelentik, hogy az egyidejű műveletek nem interferálhatnak, azaz nem lehet közöttük zavaró kölcsönhatás. Hatásuk olyan lesz, mintha valamilyen előre nem meghatározható sorrendben hajtódnának végre (ezt tükrözi a pipelined elnevezés, arra utalva, hogy a memóriához egy sorosítást végző csővezetéken jutnak el a parancsok). Másként fogalmazva, ezek a műveletek a modell szintjén oszthatatlanok (atomiak).\\ + + \noindent A közös memória használatával történő adatcsere helyes lebonyolításához a PRAM-modell szerint működő memória mellett a folyamatok működésének összehangolása is szükséges (például az adat fogadója akkor olvassa el az adatot, ha a küldő már elhelyezte azt; összetett adatok átadásakor félig átírt rekordot ne kezdjen olvasni a fogadó stb.). Ez ismét a folyamatok szabadon futásának (aszinkronitásának) korlátozását jelenti, azaz szinkronizációt igényel. + + \subsection*{Üzenetküldés} + + Üzenetváltásos adatcsere esetén a folyamatoknak nincs közös memóriája. Az adatátviteli rendszer most a logikai processzorokat kapcsolja össze. Rajta keresztül a folyamatok üzeneteket tudnak küldeni, illetve fogadni. Az üzenetküldésre, illetve fogadásra a folyamatok logikai processzorainak utasításkészletében megfelelő utasítások állnak rendelkezésre. Legyenek ezek a Küld (Send) és a Fogad (Receive) műveletek.\\ + + \noindent A $\text{Küld}(<\text{cím}>,<\text{folyamat}>)$ művelet végrehajtásakor a műveletet végrehajtó folyamat elküldi a saját memóriájának megadott címén tárolt adatot a megadott folyamatnak,\\ a $Fogad(<\text{cím}>,<\text{folyamat}>)$ művelet pedig végrehajtásakor a megadott folyamattól érkező üzenetet a saját memória megadott címén tárolja. + + \begin{figure}[H] + \centering + \includegraphics[width=0.35\textwidth]{img/messaging_sync.png} + \caption{Folyamatok együttműködése üzenetváltással} + \label{messaging_sync} + \end{figure} + + \noindent Míg gyakorlatilag valamennyi közös memóriás információcserét alkalmazó megoldás a PRAM-modellre alapul, az üzenetközvetítésre nincs egyetlen elfogadott modell. Ha csak a működés logikájával foglalkozunk, és olyan lényeges kérdéseket nem is érintünk, mint az átviteli sávszélesség, az összeköttetés megbízhatósága, az üzenetszerkezet, az átviteli közeg sajátosságai, a kapcsolatépítés esetleges dinamikája, akkor is számos tulajdonságot találunk, amelyekben az egyes megoldások eltérhetnek, és amelyek ismerete fontos a felhasználók (rendszertervezők, programozók, üzemeltetők) számára. A folyamatok kommunikációs műveleteinek tulajdonságaival ezért külön pontban foglalkozunk. + + \subsection*{Folyamatok kommunikációja} + + A folyamatok együttműködésének másik alapmodellje a közös memóriás együttműködés mellett az üzenetváltásos együttműködés, azaz a folyamatok közötti kommunikáció. Az üzenetváltásos együttműködés akkor került előtérbe, amikor realitássá vált több, adatátviteli vonalon, vagy hálózaton keresztül összekapcsolt számítógép együttműködése. + + \noindent Azonkívül, hogy a logikai processzor utasításkészletében szerepel \emph{Küld} és \emph{Fogad} művelet, a kommunikáció működésével, tulajdonságaival kapcsolatban számos nyitott kérdés maradt, és \lword{megállapítottuk}, hogy nincs egyetlen tiszta modell, amelyet a megoldások követnek.\\ + + \noindent Néhány a legkézenfekvőbb kérdések közül: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Milyen megnevezést használhatnak a kommunikáló partnerek, hogy egymásra találjanak? + \item Milyen szemantikai konzisztenciának kell fennállni a küldés és a fogadás között? + \item Milyen járulékos (implicit) szinkronizációs hatása van a kommunikációnak? + \end{itemize} + + \paragraph*{A partner megnevezése} + + Megnevezés tekintetében beszélhetünk közvetlen (direkt), közvetett (indirekt), valamint aszimmetrikus kommunikációról, illetve megnevezésről, továbbá csoportkijelölésről és üzenetszórásról.\\ + + \noindent A közvetlen (direkt) kommunikáció két folyamat között zajlik, mind a \emph{Küld}, mind a \emph{Fogad} művelet megnevezi a partner folyamatot (\ref{direct_communication}. ábra). $P_1$ elküldi a saját címtartományában tárolt $x$ változó értékét $P_2$-nek, aki azt saját $y$ változójába teszi el. (Ha a változók közös címtartományban lennének, egyszerűen $y:=x$ értékadást használhatnánk, így azonban kommunikációs műveletek szükségesek.) + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/direct_communication.png} + \caption{Kommunikáció direkt megnevezéssel} + \label{direct_communication} + \end{figure} + + \noindent Közvetett (indirekt) kommunikáció esetén a partnerek nem egymást nevezik meg, hanem egy közvetítő objektumot, (például postaládát, vagy csatornát). A postaládán keresztül bonyolódó kommunikációt a \ref{indirect_communication}. ábra szemlélteti. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/indirect_communication.png} + \caption{Kommunikáció indirekt megnevezéssel} + \label{indirect_communication} + \end{figure} + + \noindent A postaláda egy általában véges, de elméletileg esetleg korlátlan befogadóképességű, az üzenetek sorrendjét megtartó (FIFO) tároló, amely a \emph{Küld}-\emph{Fogad}, (betesz-kivesz) műveletpárral kezelhető. A $\text{Küld}(<\text{cím}>,<\text{postaláda}>)$ művelet a saját címtartományban elhelyezkedő üzenetet a postaláda következő szabad tárolóhelyére másolja. Ha a postaláda tele van, ürülésig várakozik. A $\text{Fogad}(<\text{cím}>,<\text{postaláda}>)$ művelet a postaládában legrégebben várakozó üzenetet kimásolja a megadott, saját címtartománybeli címre, helyét pedig felszabadítja.\\ + + \noindent A csatorna olyan kommunikációs objektum, amelyik két folyamatot kapcsol össze. A csatorna lehet egyirányú (szimplex), osztottan kétirányú, azaz egyidejűleg egyirányú, de az irány változtatható (félduplex), vagy kétirányú (duplex). Tartalmazhat 0, véges vagy végtelen kapacitású átmeneti tárolót. Egy véges tárolókapacitású duplex csatorna egyenértékű két véges befogadóképességű postaládával, amelyeket csak két folyamat használ, egyiket egyik irányú, másikat az ellenkező irányú adatcserére.\\ + + \noindent A postaláda és a csatorna lazítja a kommunikáló folyamatok közötti csatolást, lehetővé teszi, hogy olyan folyamatok is információt cseréljenek, amelyek nem ismerik egymást. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/asymmetric_communication.png} + \caption{Kommunikáció asszimetrikus megnevezéssel} + \label{asymmetric_communication} + \end{figure} + + \noindent Aszimmetrikus megnevezés esetén az egyik folyamat, az adó vagy vevő, megnevezi, hogy melyik folyamattal akar kommunikálni, a másik partner viszont egy saját be-/kimeneti kaput (port) használ, amelyiket – ha csak egy van – nem is kell megneveznie. Ha az üzenet vevője használ bemeneti kaput, akkor a műveletek alakja $\text{Küld}(<\text{cím}>,<\text{folyamat}>)$, $\text{Fogad}(<\text{cím}>)$. Ez a megoldás azokban az esetekben hasznos, amikor a fogadó folyamat nem ismeri a küldőt, de a küldő ismeri a fogadót, például egy ügyfél folyamat szolgáltatási kérelmet küld egy szolgáltató folyamatnak (kliens–szerver modell). A fordított irányú aszimmetria alkalmazására pedig egy feladat lebontását és szétosztását végző menedzser folyamat és több, munkáért versengő végrehajtó folyamat kapcsolata lehet példa. A küldő a kimeneti port­jára küldi az elvégzendő feladatot tartalmazó üzenetet, a fogadó pedig az első ráérő feldolgozó lesz (farmer–worker modell).\\ + + \noindent Csoportkommunikáció esetén az üzenet küldője folyamatok (esetleg kommunikációs objektumok) egy csoportját nevezheti meg vevőként. Ilyenkor egyetlen üzenetküldő művelet végrehajtása azt eredményezi, hogy az üzenetet a csoport valamennyi tagja megkapja. Az üzenetszórás (broadcasting) logikailag a csoportkommunikáció azon esete, amikor az egyetlen művelettel elküldött üzenet a rendszer valamennyi folyamatához eljut (\ref{broadcasting_communication}. ábra).\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/broadcasting_communication.png} + \caption{Kommunikáció üzenetszórással} + \label{broadcasting_communication} + \end{figure} + + \noindent A csoportkommunikáció lehetősége lényegesen egyszerűsíti a küldő műveleteit, ha több folyamattal akarja ugyanazt az információt közölni. Bizonyos típusú fizikai átviteli közegeken a csoportkommunikáció igen hatékonyan valósítható meg (például sín-topológiájú összeköttetések, \lword{rádiókommunikáció}). + + \paragraph*{Szemantikai konzisztencia} + + Most azt szeretnénk tisztázni, hogy mi történik a kommunikációs műveletek végrehajtásakor, milyen hatása van a műveleteknek az egyes folyamatok ál­la­­potterére (változókra, kommunikációs objektumokra), milyen minimális kon­zisztencia-feltételt kell betartani a műveletek megvalósításakor.\\ + + \noindent Az üzenetváltásos modell akkor került előtérbe, amikor több számítógépet kapcsoltak össze egy rendszerré adatátviteli vonalon, vagy hálózaton keresztül. Ilyenkor fel kell készülni olyan rendkívüli esetekre is, hogy a partner folyamatot futtató számítógépet esetleg kikapcsolták, vagy a nagyobb távolságot áthidaló átvitel közben az adatok sérülnek, hiszen a hibalehetőség lényegesen nagyobb, mint az egyetlen chipben, dobozban, esetleg egyetlen kártyán elhelyezkedő egységek közötti átvitel esetén.\\ + + \noindent Az üzenettovábbítás műveleteivel szemben ezért elvárás, hogy a műveletet végrehajtó folyamat ne fagyjon be sem átviteli hibák, sem a partner folyamatok kiesése esetén, és a kommunikációs műveletek helyes vagy hibás végrehajtásáról szerezzen tudomást.\\ + + \noindent A műveletek helyességének visszajelzésére az egyik szokásos megoldás egy állapotkód visszaadása, amelynek egyik értéke a helyes végrehajtás, további értékei pedig az előforduló hibakódok lehetnek.\\ + + \noindent Egy másik megoldás lehet a logikai processzor szintjén megvalósított hiba-megszakítás, ami a folyamat végrehajtását a hiba felderítéséhez és a folyatáshoz szükséges információk tárolását követően egy hibakezelési pontra (exception handler) irányítja. A partner folyamat kiesését szokásosan a műveletekre megszabott időkorlát (time-out) figyelésével észlelik. A kommunikációs művelet az időkorlát elérésekor hibajelzéssel akkor is befejeződik, ha a partner válaszának hiánya, vagy a kommunikációs közeg hibája miatt az adatcsere még nem történt meg. A folyamatok programozásához megfelelő rugalmasságot nyújt, ha lehetőség van a kommunikációs műveletekre vonatkozó időkorlát paraméterként történő megadására.\\ + + \noindent A hibajelzéssel és időkorláttal kiegészítve közvetlen kommunikáció esetén a műveletek a következő alakúak: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item $\text{Küld}(<\text{cím}>,<\text{folyamat}>,<\text{időkorlát}>, <\text{hibakód}>)$, illetve + \item $\text{Fogad}(<\text{cím}>,<\text{folyamat}>,<\text{időkorlát}>,<\text{hibakód}>)$.\\ + \end{itemize} + + \noindent Az időkorlát lehetséges értékei között célszerű a 0 és a értéket is megengedni. A 0 várakozás például akkor hasznos, ha egy fogadó folyamat működésének egy pontján csak akkor akar üzenetet fogadni, ha azt már elküldték, egyébként van más teendője. A $<\text{végtelen}>$ várakozás pedig az olyan folyamatok esetén szükséges, amelyiknek nincs teendője, amíg valaki egy üzenettel el nem indítja.\\ + + \noindent A Küld művelet szemantikáját tekintve elsősorban az a kérdés merül fel, hogy okozhat-e várakozást a művelet, és mi az, ami az adatcseréből a művelet befejeződésekor, azaz a folyamat továbblépésekor már megtörtént.\\ + + \noindent A lehetséges megoldásváltozatok közül az egyik véglet: a Küld művelet akkor fejeződik be, amikor az adatcsere teljes egészében befejeződött, a küldött üzenet rendben megérkezett és a helyére került. Ez a megoldás általában a \emph{Küld} művelet várakozását is okozhatja, a végrehajtás során ellenőrzések, esetleg hibajavítások is történhetnek. A megoldás ahhoz hasonló, mint amikor tértivevényes levelet küldünk valakinek, és addig nem lépünk tovább, amíg a tértivevény aláírva vissza nem érkezett.\\ + + \noindent A másik véglet az lehet, hogy a Küld befejeződésekor az üzenet csupán bekerült a kommunikációs rendszerbe, de további sorsáról semmit sem tudunk. Ilyenkor a Küld művelet általában sohasem várakozik. Ez a megoldás ahhoz hasonló, mint amikor valakinek úgy küldünk levelet, hogy egyszerűen bedobjuk a postaládába, és továbbmegyünk.\\ + + \noindent A két véglet között számos köztes megoldás létezhet (például az üzenet elhagyta azt a processzort, amelyiken a küldő folyamat fut stb.).\\ + + \noindent Valamennyi megoldás esetén be kell tartani azt a minimális konzisztencia-feltételt, hogy amennyiben nincs hibajelzés, az elküldött üzenetet tartalmazó terület a küldő folyamat saját memóriájában (a $<\text{cím}>$ tartalma) a \emph{Küld} befejeződése után – akár a következő utasítással – felülírható legyen. Ennek már nem szabad hatással lennie az elküldött üzenetre.\\ + + \noindent A \emph{Fogad} művelet megvalósításai általában várakozást okozhatnak abban az esetben, ha még nem érkezett üzenet. A művelet egyszeri végrehajtása pontosan egy üzenetet helyez el a fogadó folyamat saját memóriájába akkor is, ha esetleg több várakozó üzenet van a folyamat számára a kommunikációs rendszerben. Az üzenetek érkezési sorrendben fogadhatók, minden üzenet csak egyszer, azaz a fogadás törli az üzenetet a kommunikációs rendszerből. Postaláda, illetve bemeneti kapu használata esetén kérdés, hogy a fogadó tudomást szerez-e arról, hogy ki az üzenet küldője. Erre általában szükség van, hiszen az üzenetre gyakran választ kell küldeni. Ha a kommunikációs rendszer ezt az információt nem közli automatikusan, a folyamatoknak kell gondoskodniuk arról, hogy a küldő azonosítható legyen az üzenet tartalma alapján.\\ + + \paragraph*{Járulékos (implicit) szinkronizáció} + + \noindent A kommunikációs műveletek általában a kommunikációban résztvevő folyamatok szabadonfutásának korlátozását okozzák. Az egyes műveletekkel járó szinkronizációs mellékhatás elsősorban a kommunikációs rendszer átmeneti tárolójának (puffer) kapacitásától függ.\\ + + \noindent Tárolás nélküli átvitel esetén a kommunikációs rendszer csak közvetít, de a \emph{Küld} és \emph{Fogad} műveleteknek be kell várnia egymást ahhoz, hogy az információcsere megtörténhessen. A két folyamat ezen utasításaira egyidejűség érvényes (a \emph{Küld} és a \emph{Fogad} randevúja).\\ + + \noindent Véges kapacitású tároló alkalmazása bizonyos keretek között kiegyenlíti a küldő és fogadó folyamatok sebességingadozásait. A fogadó folyamat várakozik, ha üres az átmeneti tároló, a küldő folyamat pedig akkor, ha nincs szabad hely a tárolóban. Ugyanazon üzenet elküldésének meg kell előznie az üzenet fogadását, tehát ezen műveletekre sorrendiség (precedencia) érvényesül. Emellett egy rövid távú szinkronizációs hatás is érvényesül, magának a tárolónak a kezelése általában kölcsönös kizárással valósul meg, azaz két folyamat ugyanazon kommunikációs objektumra hivatkozó kommunikációs műveleteinek megvalósítási részleteit szemlélve egyes szakaszokra kölcsönös kizárás áll fenn.\\ + + \noindent Végtelen kapacitású tároló (csak modellben létezik) esetén a küldő folyamatnak sohasem kell várakoznia, egyébként a véges kapacitású tárolóra elmondottak érvényesek. + + \section*{Be- és kimeneti eszközök ütemezési lehetőségei, holtpontok} + + \subsection*{Be- és kimeneti eszközök ütemezési lehetőségei\\} + + Periféria kezelési módszerek: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Programozott + \begin{itemize} + \item közvetlen szoftver ütemezés + \item lekérdezéses ütemezés + \end{itemize} + \item Megszakításos + \item DMA + \end{itemize} + + \subsection*{Programozott periféria kezelés\\} + + \paragraph*{Közvetlen szoftver ütemezés} + + \noindent Egyes perifériáknál nincs szükség szinkronizálásra mert vagy nincs mihez szinkronizálódni (pl: egy kijelzőt meghajtó regiszter, egyszerű bementi port), vagy a periféria egy művelet elindítása után a következő utasítás végrehajtására már biztosan elkészül (gyors A/D konverter). Az ilyen perifériákhoz a processzor tetszőleges időpontban fordulhat. + + \paragraph*{Lekérdezéses ütemezés} + + \noindent Ha a periféria sebessége olyan, hogy egy perifériás művelet néhány utasítás végrehajtási időn belül fejeződik be, akkor a szinkronizálást státusz figyeléssel célszerű megoldani. + + \noindent Lassú periféria esetében sok várakozással jár , ami alatt a CPU nem végez érdemleges működést. Ezért csak akkor engedhető meg, ha CPU egyéb feladatait így is képes elvégezni . Az igényelt hardver tekintetében általában a lekérdezéses ütemezés a legolcsóbb megoldás. + + \paragraph*{Program megszakításos periféria kezelés} + + Ha a periféria csak viszonylag hosszú idő vagy előre kiszámíthatatlan idő múlva lesz kész az újabb adatátvitelre, a lekérdezéses ütemezés feleslegesen foglalja a processzor idejét. Ezért ilyenkor interruptos periféria kezelést célszerű alkalmazni.\\ + + \noindent A perifériához fordulást maga a periféria kezdeményezi egy logikai jellel a CPU vagy IT vezérlő interrupt kérő bemenetén. Az interruptot hardvertől függően az IT vonal szintje (szintérzékeny IT), vagy a jel valamely éle (élérzékeny IT) váltja ki.\\ + + \noindent Az IT kezdeményezés hatására valamilyen mechanizmussal előbb-utóbb egy speciális szubrutinra (interrupt rutin) adódik a vezérlés, ami elvégzi a periféria kezelését . Mivel a CPU és a periféria szinkronizálása automatikus, nem kell feleslegesen státusz figyeléssel tölteni az időt.\\ + + \noindent Az interruptos kezelés a program áttekinthetőségét is növeli . Mivel az IT rutinban nem a periféria kezelését szolgáló, ugyanakkor mindig végrehajtandó feladatok is vannak (regiszter mentés, regiszter visszaállítás, stack kezelés), túl sűrűn érkező IT-k szintén leronthatják a CPU kihasználtságát. + + \noindent IT-s periféria kezelést akkor célszerű alkalmazni, ha: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item a CPU sebessége elegendő a periféria kezelésére és + \item az interruptok várhatóan nem túl sűrűn jönnek , közöttük a CPU elég sok utasítást képes végrehajtani, vagy + \item ha az interrupt bekövetkezésének időpontja véletlenszerű , de ha bekövetkezik, akkor gyorsan ki kell szolgálni, + \item az interrupt alatt elvégzendő feladatok nem vesznek túl sok időt igénybe, vagy ha igen, akkor azt egyéb IT is megszakíthatja (többszintű IT rendszer). + \item az interruptos szervezés a program strukturáltságát, áttekinthetőségét szolgálja. + \end{itemize} + + \paragraph*{A közvetlen memória hozzáférés (DMA)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Ha a processzor sebessége nem elegendő az adatátvitel lebonyolítására a periféria és memória között, DMA-s kezelést kell alkalmazni. + \item Az ún. DMA vezérlő segítségével a processzort kikerülve, közvetlen adatátvitel lehetséges a memória és a periféria között. Ezt nevezik közvetlen memória hozzáférésnek (Direct Memory Access). + \item A DMA átvitel általában gyorsabb, mintha a CPU végezné (nem kell közben a memóriából utasításokat olvasni és nem kell az adatot a CPU-n keresztül áramoltatni. + \item A DMA-s kezelést tipikusan nagy sebességű, blokkos adatátvitelt igénylő perifériáknál alkalmazzák (winchester, nagysebességű soros adatátvitel stb). + \begin{itemize} + \item \textit{Blokkos eszközök}: Adott méretű blokkban tároljuk az információt. Blokkméret 512 byte - 32768 byte között. Egymástól függetlenül írhatók vagy olvashatók. Blokkonként címezhetőek. Ilyen eszköz: HDD, szalagos egység + \end{itemize} + \end{itemize} + + \subsection*{Holtpontok (deadlock)} + + Két vagy több folyamat egy erőforrás megszerzése során olyan helyzetbe kerül, hogy egymást blokkolják a további végrehajtásban.\\ + + \noindent \textbf{Definíció}. Folyamatokból álló halmaz \emph{holtpontban van}, ha minden folyamat valamelyik másik folyamat által kiváltható eseményre várakozik.\\ + + \noindent A holtpontban lévő folyamatok tipikusan egy erőforrás felszabadítására várnak.\\ + + \noindent Erőforrások például: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Szemaforral védett memóriaterület + \item I/O eszközök + \item Fájlok, rekordok olvasásának/írásának joga + \item Processzorhasználat joga + \item Új memóriaterület igénylése + \end{itemize} + + \noindent Nem csak az I/O eszközökhöz kötődik, pl párhuzamos rendszerek, adatbázisok, stb. \\ + + \noindent Az egyes erőforrástípusokból több példány is a rendelkezésre állhat. Mindegy, hogy melyiket kapja meg egy adott folyamat.\\ + + \noindent Holtpont létrejöttéhez a következő négy feltételnek egyszerre teljesülnie kell: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textit{Kölcsönös kizárás.} Legyen legalább egy megoszthatatlan erőforrás + \item \textit{Birtoklás és várakozás.} A folyamatoknak nem kell feladniuk az eddig megszerzett erőforrásokat ahhoz, hogy újakat igényelhessenek + \item \textit{Megszakíthatatlanság.} Az erőforrások nem vehetők el a folyamatoktól a beleegyezésük (felszabadításuk) nélkül + \item \textit{Ciklikus várakozás.} Lennie kell egy két vagy több folyamatból álló ciklikus listának, amiben minden folyamat a következő egy erőforrására várakozik + \end{enumerate} + + \noindent Irányított gráffal lehet modellezni a folyamatokat és erőforrásokat. Ha van kör, akkor az holtpontot jelent. \\ + + \subsection*{A holtpontok detektálása } + + A holtpontok detektálásához (észrevételéhez) az operációs rendszernek egyfolytában nyilván kell tartania azt, hogy hogyan osztotta eddig szét az erőforrásokat, mely folyamatoknak vannak ki nem elégített igényei. Ebből a nyilvántartásból kiindulva kell az operációs rendszernek felismernie a holtpont esetleges meglétét. Ehhez egy úgynevezett holtpontdetektáló algoritmust futtat le időnként.\\ + + \noindent A holtpontdetektálás nem egyszerű feladat, mivel nem feltétlenül egy-két folyamat között alakulhat ki ilyen függőség, hanem akár jóval több folyamat is részt vehet egy holtpont kialakulásában, ami lehetséges, hogy „észre sem vehető”, mert nem befolyásol más, rendszer közeli folyamatokat. + + \subsection*{A holtpontok detektálásának stratégiája } + + A holtpontok detektálására adott lehetséges stratégia a következő: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A futó folyamatok közül pontosan azokat válogassuk ki, amely folyamatoknak van valamilyen erőforrásigényük. (Ezek lehetnek ugyanis olyan folyamatok, amelyek egy holtpont létrejöttében részt vehetnek!) + \item Ezt követően a kiválogatott folyamatok közül keressük ki azokat, amelyeknek csak olyan erőforrásigényük van, ami éppen az adott pillanatban kielégíthető, azaz az erőforrás-kezelő a folyamatnak oda tudja adni az erőforrást, mert az éppenséggel szabad. Ezeket a folyamatokat jelöljük meg. + \item Tekintsünk szabadnak minden olyan erőforrást, amit a most kijelölt folyamatunk használ. + \item A második ponttól kezdve ismételgessük az algoritmust addig, amíg el nem jutunk egy olyan állapotba, amelyben már nincsen más kiszolgálható tevékenység. + \end{itemize} + + \noindent Ha a holtpontok detektálására adott eljárás végén marad nem kiszolgálható folyamat, akkor az operációs rendszerben holtpont rejtőzik, és a hátra maradt folyamatok éppen azok a folyamatok, amelyek a holtpont kialakításában részt vesznek.\\ + + \noindent Az algoritmusról könnyen belátható, hogy a holtpontok detektálására adott stratégia végén megkapott folyamatok halmaza nem függ attól, hogy az algoritmus elején melyik folyamatot választjuk ki elsőként.\\ + + \noindent A holtpontdetektáló algoritmus egy úgynevezett „mohó” algoritmus, aminek a gyakori lefuttatása az operációs rendszer hatékonyságát csökkenti. Felmerülhet kérdésként ekkor az olvasóban: mi lehet vajon ennek az algoritmusnak az optimális aktivizálási ideje, azaz vajon milyen időközönként célszerű futtatnunk, hogy az operációs rendszer hatékonysága ne drasztikus mértékben csökkenjen?\\ + + \noindent Erre egy egyszerű meghatározást lehet adni: célszerű azt a megoldást használni, hogy a holtpontdetektáló algoritmus akkor induljon el, ha egy folyamat olyan hosszú ideig várakozik egy erőforrás használatára, hogy már túllép egy előre meghatározott időintervallumot a várakozás.\\ + + \subsection*{A holtpontok megszüntetése\\} + + \paragraph*{A drasztikus megszakítás} + + Ez a módszer úgy oldja meg a holtpont miatti konfliktust, hogy a várakozási körben található összes folyamatot megszakítja. Drasztikus módszer, mivel ebben az esetben a folyamatok eredményei is elvesznek, mivel a megszakítás miatt egyik sem fogja folytatni a tevékenységét.\\ + + \paragraph*{A kevésbé drasztikus, kompromisszumos megoldások} + + \noindent Sokszor elég csak néhány tevékenységet megszakítani, és nem az összes folyamatot. Sőt, sok esetben nem is kell megszakítani ezen kiválasztott folyamatokat sem, hanem csak elég, úgymond, visszaállítani őket egy olyan állapotba, mielőtt a már korábban lefoglalt erőforrásra megadták volna az igénylésüket, és ezzel megnövelték a holtponthelyzet létrejöttének esélyét.\\ + + \noindent A következő módszerekkel megszüntethető az operációs rendszer által felismert holtpont kevésbé drasztikusan: + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item módszer: Keressük meg azt a folyamatot, amelyik a „legaktívabban” vesz részt a holtpont kialakításában! Többnyire elegendő egyetlen egy ilyen „aktív” holtpont kialakító folyamat eltávolítása. + \item módszer: Keressünk egy olyan folyamatot, amely újraindítható bármiféle mellékhatás nélkül! Természetesen egy adatmódosító művelet nem tekinthető újraindíthatónak, mivel lehet, hogy az újraindításával inkonzisztencia lépne fel az adatok között. + \item módszer: Keressünk meg azokat a folyamatokat, amelyek újraindítása a legkevesebb költséggel jár! Tehát olyan folyamatokat, tevékenységeket keressünk ki, amelyek vagy olyan ellenőrzési pontokkal (checkpoint) rendelkeznek, amelyekre könnyen visszaállíthatóak, vagy éppen „most” kezdték meg működésüket, tevékenységüket. + \item módszer: A holtpontot előidéző folyamatokat a prioritásuk szerint vizsgáljuk meg, és válasszuk ki a legalacsonyabb prioritású folyamatot, majd távolítsuk el, szakítsuk meg a működését, vagy állítsuk vissza valamilyen korábbi megfelelő állapotba, ha lehetséges. + \end{enumerate} + + \noindent A holtpont megszüntető műveleteknél fontos, hogy a holtpont megszüntetésekor az automatikus választás mindig komoly kockázati tényezővel jár. A kockázat mellett figyelembe kell venni azt is, hogy bármilyen módszert választunk is ki a holtpont megszüntetésére, ugyanazt a folyamatot nem választhatjuk ki végtelen sokszor a holtponthoz kapcsolódó folyamatok „várakozási köréből” való eltávolítására, ugyanis ez az adott folyamat kiéheztetését okozná. Törekedni kell az optimális holtpontkezelésre, mivel a kiéheztetésen túl a holtpontkezelés legnagyobb veszélyei közé tartozik, ha az operációs rendszerünk alulszabályozott, vagy éppen túlszabályozott a holtpontdetektálással és a holtpont megszüntetéssel kapcsolatban.\\ + + \noindent Alulszabályozás alatt azt kell érteni, hogy az operációs rendszer olyan nagyfokú túlbiztosítására törekszünk, hogy holtpont sosem alakul ki a futó folyamatok közt az operációs rendszerben, de magának a rendszernek a lehetőségeit sem fogjuk tudni kihasználni. Túlszabályozottság alatt pedig azt kell érteni jelen esetben, hogy olyan bonyolult holtpontdetektáló vagy éppen holtpontmegszüntető algoritmust választunk ki, hogy magának az algoritmusnak a végrehajtása lassítja az operációs rendszert, és csökkenti a rendszer hatékonyságát. + + \subsection*{Holtpontkezelés\\} + + \subsubsection*{Holtpont-megelőzés\\} + + A holtpontokat el tudjuk kerülni, ha garantálni tudjuk, hogy a holtpont létrejöttének négy feltételének valamelyike biztosan nem áll fenn.\\ + + \noindent A holtpont kialakulásához szükséges feltételek elkerülése: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A \emph{\textbf{kölcsönös kizárás}} néhány esetben elkerülhetetlen, így ezekben az esetekben nem lehet mit csinálni, de más esetekben elkerülhető. Az egyik leggyakrabban használt technika az úgynevezett spooling technika (simultaneous peripherial operation on-line), ami annyit teszt, hogy a direkt erőforrás-használat helyett egy általában nagyméretű átmeneti tárolóba helyezzük az erőforrást. + \item Az erőforrások lefoglalása (\emph{\textbf{Birtoklás és várakozás}}) úgy kerülhető el, ha elrendeljük azt, hogy egyszerre csak egy erőforrást foglalhat le egy folyamat, tehát egy folyamat csak akkor igényelhet egy új erőforrást, ha nem birtokol már egy másik erőforrást. + + \noindent Ezt kétféle módon érhetjük el: + + \begin{enumerate} + \item Az összes szükséges erőforrást egyszerre kell igényelni, a folyamat indulásakor + \begin{itemize} + \item Néha a program indulásakor még nem tudja, milyen erőforrásra lesz szüksége + \item Pazarló erőforrás-gazdálkodást eredményez + \end{itemize} + \item Új erőforrás igényléséhez el kell engedni az eddig megszerzetteket + \begin{itemize} + \item Kiéheztetéshez vezethet + \item Kényelmetlen + \end{itemize} + \end{enumerate} + \item A \emph{\textbf{„megszakítás nem megengedett”}} (\emph{Megszakíthatatlanság}) kiküszöbölése, azaz hogy nincs erőszakos erőforrás-elvétel, a következő módon érhető el: hogyha az erőforrásaink menthető állapotúak, akkor elvehetjük az adott folyamattól az erőforrás birtoklásának jogát úgy, hogy mentjük az erőforrás állapotát, majd az erőforrást átadjuk a másik folyamatnak, és mikor a másik folyamat befejezte a működését, akkor az erőforrás régebbi állapotát visszaállítva visszaadjuk az erőforrást az előző folyamatnak. + \begin{itemize} + \item Csak néhány erőforrástípus esetén alkalmazható. Például. processzor, fizikai memória, de I/O eszközök, fájlok esetén nem! + \end{itemize} + \item A \emph{\textbf{visszatérő igények}} (\emph{Körkörös kizárás}) elkerülése úgy érhető el, hogy kialakítunk egy hierarchikus rendszert. Az erőforrásokat kategorizáljuk, és hozzájuk prioritásokat rendelünk. Ez után minden folyamat csak olyan erőforrásokat igényelhet, amelyeknek a prioritása nagyobb, mint amilyen erőforrásai már vannak. + + \begin{itemize} + \item Kizárjuk a hurkok lehetőségét + \item Lehetetlen minden folyamatnak megfelelő sorrendet kitalálni + \item Pazarló erőforrás-gazdálkodás + \end{itemize} + \end{itemize} + + \noindent A feltételek közül az első, illetve a harmadik feltétellel nem tudunk mit kezdeni, mivel az operációs rendszerünkben vagy vannak a feltételek által megállapított fajtájú erőforrások, vagy nincsenek. + + \subsubsection*{Holtpont-elkerülés} + + \paragraph*{A strucc algoritmus} + + A strucc algoritmus a „struccpolitika” elvét vallja, aminek egyszerűen a lényege az, hogy nem veszünk tudomást a holtpont létezéséről. Ha tudjuk azt, hogy egy esetleges holtpont kialakulásának valószínűsége meglehetősen kicsi, és az operációs rendszer újraindításának nincsenek kritikus következményei, akkor előfordulhat, hogy érdemes ezt a „megoldást” választani, mint holtpont „elkerülő” algoritmust. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \emph{Előnyei}: + \begin{itemize} + \item Gyors holtpontelkerülés. + \end{itemize} + \item \emph{Hátrányai}: + \begin{itemize} + \item Adatvesztés, a folyamatok végeredményeinek elvesztése fennállhat. + \item Holtpontok megléte: mivel az algoritmus szerint csak figyelmen kívül hagyjuk a holtpontokat, azaz a holtponthelyzeteket, azok ugyanúgy ott lesznek, és maguktól nem fognak köddé válni. + \item Kritikus következmények esetleges megléte. + \item Nem ajánlott, mivel ez csak egy „struccpolitika”. + \end{itemize} + \end{itemize} + + \paragraph*{Egyetlen foglalási lehetőség stratégia (one-shot allocation strategy)} + + Az egyetlen foglalási lehetőség stratégia lényege az, hogy megtiltja a várakozás közben fellépő erőforrás-lekötést, azaz csak az a folyamat igényelhet magának erőforrást, amelyiknek egy \lword{erőforrásigénye} sincs.\\ + + \noindent A stratégia alkalmazása esetén egy folyamat csak egyetlen alkalommal, általában a folyamat induláskor foglalhatja le azokat az erőforrásokat, amelyekre szüksége van a futása során. A stratégia alkalmat ad arra ezáltal, hogy ha a folyamat indulásakor van olyan erőforrás, amelyet a folyamat nem tud lefoglalni (tehát az adott erőforrás éppen nem szabad), akkor az operációs rendszer a folyamatot várakozásra kényszeríti, és így egy úgynevezett várakozási listára kerül fel. Ezen felül a stratégia még elrendeli azt is, hogy mivel egyetlen alkalommal foglalhatja le csak a folyamat a szükséges erőforrásokat, így a futása során más alkalommal nem nyújthat már be erőforrásigényt az operációs rendszer felé, és ha van is erőforrás-igénylése, akkor az operációs rendszer elutasítja, mivel már rendelkezik erőforrásokkal.\\ + + \noindent Holtpont nem alakulhat ki az operációs rendszernek a futó folyamatai között, mivel a futó folyamatok minden erőforrást elérhetnek, amikre szükségük volt már a futásuk elején, mert ha valamilyen erőforrás megléte (birtoklása) hiányozna, akkor nem futó folyamatok lennének, hanem a várakozási listában várakoznának, illetve ezek a várakozó folyamatok nem rendelkeznek semmilyen erőforrás használatával. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Előnyök: + \begin{itemize} + \item Holtpont nem alakulhat ki a stratégia használata esetén. + \item Ha egy folyamat már megszerezte az összes olyan erőforrást, ami a futásához szükséges, akkor biztosan nem kell sohasem várakoznia a futása során esetleges erőforrás-használat megszerzésére, így a folyamat futási idejét semmilyen erőforrásra való várakozás nem fogja megzavarni, meghosszabbítani. + \end{itemize} +\newpage + \item Hátrányok: + \begin{itemize} + \item A folyamatoknak a futásuk végéig kell birtokolniuk a futásuk kezdetekor szükségessé vált erőforrásokat, tehát akkor is, ha nincsen rá semmilyen szükségük. Eszerint ez egy nagyon pazarló stratégia. + \item Nem mérhető fel minden esetnem egy folyamat erőforrásigénye már a futás kezdetekor. + \item Kiéheztetés lehetséges fennállása: ha egy folyamat nagyon sok erőforrást igényel, akkor előfordulhat, hogy nem mindegyik elérhető a futásának az elején, így lehetséges az, hogy beláthatatlan ideig várakozásra kényszeríti az operációs rendszer a folyamatot, így egyszerűen kiéheztetve az erőforrásokra vonatkozóan. + \end{itemize} + \end{itemize} + + \paragraph*{Rangsor szerinti foglalási stratégia (hierarchical allocation strategy)} + + \noindent A rangsor szerinti foglalási stratégia a ciklikus várakozási lehetőségét küszöböli ki azzal, hogy az erőforrásokat úgy kategorizálja, hogy minden egyes kategóriához egy-egy sorszámot rendel, és a leggyakrabban használt erőforráshoz a legkisebb sorszámot rendeli, míg a legritkábban használt erőforráshoz pedig a legnagyobb sorszámot, így felállítva közöttük egy úgynevezett prioritási sorrendet.\\ + + \noindent A rangsor szerinti foglalási stratégia lényege a prioritási sorrend megkonstruálása által az, hogy a különböző folyamatok mindig csak növekvő sorszámú erőforrást igényelhetnek az operációs rendszertől, azaz egy folyamat mindig csak magasabb sorszámú erőforrást igényelhet meg az operációs rendszertől, mint amilyen sorszámú prioritást már birtokol.\\ + + \noindent Továbbá, ha egy folyamatnak a meglévő erőforrásainak sorszámainál alacsonyabb sorszámú erőforrásra van szüksége, akkor fel kell szabadítania a szükséges erőforrás sorszámánál nagyobb sorszámú erőforrásokat egészen addig, míg a folyamat erőforrás-igénylési feltételei (lényegében a rangsor szerinti foglaláis stratégia feltételei) nem teljesülnek. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Előnyök: + \begin{itemize} + \item holtpont nem alakulhat ki a stratégia használata esetén. + \item Nagyon hatékony, ha a megfelelő módon történt a sorszámok kiosztása az erőforrásoknak. + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Ha nem megfelelő módon történik a sorszámok kiosztása az erőforrásoknak, akkor nem biztosítható a stratégia hatékonysága. + \item Problémás eset, ha a folyamatnak a meglévő erőforrásai sorszámainál alacsonyabb sorszámú erőforrásra van szüksége. + \end{itemize} + \end{itemize} + + \paragraph*{Bankár-algoritmus} + + Edsger Wybe Dijkstra-tól származik az egyik holtpontelkerülő ütemezési algoritmus, amit bankár algoritmusnak is nevezünk.\\ + + \noindent Az algoritmus neve onnan származik, hogy a probléma nagymértékben hasonló a bankárok munkájához, azaz általánosabban tekintve a bankok erőforrás-kihelyezési problémájához. A hitelt igénylő ügyfelek a bankárhoz fordulnak a beruházásaik finanszírozásához szükséges hitelekért. A bankár az ügyfelek egy meghatározott (a hitelt kérő ügyfeleknek) csoportjával foglalkozik, akiknek folyósít egy bizonyos mennyiségű hitelt. A hiteligénylők a bankárnak megmondják, hogy pontosan mennyi lenne az a maximális pénzmennyiség, amire szükségük lehet, és a bankár ezt folyósítja számukra.\\ + + \noindent Természetesen a bankár nem rendelkezik végtelen mennyiségű készpénzzel, így nem rendelkezik annyi pénzzel sem, ami az összes ügyfél teljes hiteligényét kielégítené egy időpontban. A hitelt csak az az ügyfél tudja visszafizetni, aki be is tudja fejezni a beruházását, amihez a hitelt igényelte eredetileg, ám a beruházás befejezéséhez szüksége van arra, hogy előbb vagy utóbb hozzáférhessen az igényelt hitel teljes pénzösszegéhez. A bankár tudja, hogy nem mindegyik ügyfélnek lesz szüksége azonnal a maximális hitelre, és feltételezi, hogy minden ügyféle a teljes hitel felvételét követően, amint csak tudja, azonnal vissza is fizeti a hitelt.\\ + + \noindent A hitelt csak az az ügyfél tudja visszafizetni, aki be tudta fejezni a beruházást; ehhez pedig szüksége van arra, hogy előbb-utóbb hozzájusson az igényelt hitel teljes összegéhez.\\ + + \noindent Ha a bankár nem elég óvatosan bánik a pénzével, akkor könnyen „megnézheti magát”, mivel kiürülhet a pénzes kasszája, és egyik ügyféle sem fejezné be a beruházását, mivel nem lenne egyiküknek sem pénze, amiből gazdálkodhatna, és folytathatná a beruházást, vagy akár törlessze a hitelt, mert nem kapná meg a hitelének a következő részét.\\ + + \noindent Az algoritmus pontosan azt adja meg, hogy hogyan kell eljárnia a bankárnak az előbb említett (holtpont) helyzetek elkerülésére, feltételezve, hogy csak önmagára számíthat, és nincsen semmilyen segítsége, amire számíthatna?\\ + + \noindent A bankár algoritmus lényege tehát az, hogy az operációs rendszert mindig egy biztonságos állapotban tartja. A biztonságos állapot a bankár algoritmus esetében azt jelenti, hogy létezik legalább egy olyan erőforrás-igénylés kielégíthetőségi sorrend, amely szerint minden egyes folyamat erőforrás-igénylése kielégíthető. Tehát létezik olyan állapotsorozat, amelynek eredményeként mindegyik ügyfél felvehet összesen annyi kölcsönt, amennyit a hitel lehetősége enged, azaz minden folyamat megkapja az összes erőforrását, majd a tevékenysége után befejeződik. Az algoritmus sohasem elégít ki egy olyan erőforrás-igénylést sem, amely által az operációs rendszer biztonságos állapota nem állna fenn.\\ + + \noindent A bankár algoritmus csak akkor működik, ha a folyamatok már az indulásukkor tudják, hogy a különböző erőforrásokból egyszerre maximálisan mennyit fognak igényelni, illetve ezt az operációs rendszernek be is jelentik.\\ + + \noindent Ha az operációs rendszer állapota nem biztonságos, még nem jelenti azt, hogy a holtpont biztosan kialakul, hanem mindössze csak annyit jelent, hogy lehetséges holtpont kialakulása az adott állapotból. A bankár algoritmus úgy garantálja a holtpontmentességet, hogy már a nem biztonságos állapot kialakulását is megakadályozza, tehát a túlzott biztonságot tartja szem előtt. A módszer legnagyobb hátrányának tekinthető, hogy léteznek olyan folyamatok, amelyeknek erőforrásigénye előre nem ismerhető fel.\\ + + \noindent A bankár algoritmus minden egyes erőforrás-igénylés megjelenésekor elemzést végez, és megnézi, hogy vajon az erőforrás-igénylés engedélyezése esetén is biztonságos marad-e a rendszer. Ha igen, akkor a kérést jóváhagyja, ha nem, akkor a kérést későbbre halasztja. Egy állapot biztonságosságának eldöntésekor a bankár azt elemzi, hogy van-e elegendő erőforrása ahhoz, hogy kielégítse néhány ügyfél hiteligényét. Ha ezt meg tudja tenni, akkor természetesen feltételezi, hogy az ügyfelek a kölcsönöket vissza fogják fizetni, és következhet annak az ügyfélnek a vizsgálata, akinek a hitelfolyósításainak összege a legközelebb van az általa igényelhető maximális hitelmennyiségnek, és így tovább. Ha az ügyfelek minden kölcsönt visszafizetnek a bankárnak, akkor az állapot biztonságos, és a kezdeti erőforrás igénylését a folyamatnak ki lehet elégíteni. + + \section*{Memóriakezelés, virtuális memória fogalma} + + Az alapvető memóriakezelési módszerek két csoportba sorolhatók: + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item már a betöltéskor eldől, hogy mi hova kerül, és a futás végéig állandósul a memória, azaz a programon belüli esetleges dinamikus definíciókon kívül a memóriának a „programot” tartalmazó része állandó; + \item végrehajtás közben mozgatják az egyes programrészeket a központi tár és a lemez között (lapozás, szegmentálás); + \end{enumerate} + + \subsection*{Monoprogramozás} + + \noindent A legegyszerűbb memóriakezelési módszer, időben csak egyetlen programot futtatunk. Lényege, hogy a memóriát csak saját programunk, illetve az operációs rendszer között kell „felosztani”. \\ + + \noindent Ezt a felosztást háromféleképpen végezhetjük – a sorrend a kisebb címtől a nagyobb cím felé haladást jelenti: \\ + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item felhasználói program, operációs rendszer a RAM-ban – ezt a felosztást régi nagyszámítógépes rendszerekre, illetve miniszámítógépeken (Commodore, HT-1080Z) használták; + \item operációs rendszer a RAM-ban, felhasználói program – főleg beágyazott rendszerek használják ezt a felosztást; + \item eszközmeghajtók a ROM-ban, felhasználói program, operációs rendszer a RAM-ban – korai személyi számítógépekre jellemző. Lényegében a ROM-ba égetett rész nem más BIOS (Basic Input-Output System). + \end{enumerate} + + \subsection*{Multiprogramozás\\} + + \subsubsection*{Multiprogramozás rögzített partíciókkal} + + \noindent Főleg kötegelt rendszerek tipikus megoldása. + + \begin{enumerate}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item[1.] Különböző méretű partíciókat definiálunk és a megfelelő programot a hozzá méretben illeszkedő várakozási sorba rakjuk. Hátránya a megvalósításnak, hogy több várakozási sort (queue) kell nyilvántartani és menedzselni. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/memory_partitioning_individial_queue.png} + \caption{} + \label{memorymanagement_partitioning_iq} + \end{figure} + + \item[2.] Csak egy várakozási sort használunk, ekkor a megüresedett partíció helyére az a program kerül, amelyik a sorban előrébb van és bele is fér a partícióba. + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/memory_partitioning_single_queue.png} + \caption{} + \label{memorymanagement_partitioning_sq} + \end{figure} + + Ebben az esetben kis módosítása lehet a kiválasztásnak, hogy nem az első beleférő programot helyezzük bele a partícióba, hanem a beleférők közül a legnagyobbat. Ezzel a módszerrel a partíció veszteséget lehet minimalizálni. \\ + + Egy-egy programválasztás során a partícióba több program fér be, a nem kiválasztottakhoz jegyezzük fel, hogy most éppen nem volt szerencséjük. Ezt a \emph{szerencsétlenség} számlálót növeljük egyel. Megadhatunk egy korlátot $k$, amit ha elér egy vagy több program, akkor a sorban első $k$-t elérő programot választjuk ki. Így nem várakozik végtelen ideig egyik program se a memóriába kerüléshez. + \end{enumerate} + + \subsubsection*{Multiprogramozás cserével} + + \noindent Főleg időosztásos rendszerek tipikus megoldása. + + \noindent Ez a technika az „azonos” időben futó programokat teljes egészében –a méretüknek megfelelően – mozgatja a lemezterület és a memória között. Mivel egy-egy folyamat működésének végeztével felszabadul a memória általa használt része, de nincs mit betölteni, a memóriában lyukak keletkeznek. Emiatt jelentősen csökkenhet a memória kihasználtsága, így szükség van a lyukak „egyesítésére”, amit memóriatömörítésnek nevezünk. Ilyenkor a rendszernek arra kell ügyelnie, hogy bent lévő processzek ne sérüljenek (az esetleges áthelyezések miatt újra kell számolni az utasítások címeit). A következő ábra ezt a csere folyamatot szemlélteti. Az \emph{A} folyamat kikerül a memóriából, a háttértáron kerül elhelyezésre, míg a \emph{B} folyamat a háttértárból a fizikai memóriába kerül.\\ + + \noindent A cserék adminisztrálására kétféle módszert dolgoztak ki. + + \paragraph*{Bittérképes cserekezelés} + + \noindent A memóriát, szónyi vagy kilobájtnyi egységekre osztjuk.(Talán leggyakrabban ma 4KB egységről beszélhetünk, de előfordulhat 2/4 MB is.) Minden egységhez hozzárendelünk egy-egy foglaltsági bitet. Ennek értéke egy, ha foglalt és nulla, ha szabad. Új processz érkezésekor olyan összefüggő szabad területet kell keresni, melyek együttes hossza elegendő az új tevékenység betöltéséhez. Az allokációs területek hosszának tervezésekor figyelembe kell venni, hogy a csere lehetőleg gyors legyen (a keresési algoritmusok is időt igényelnek), valamint ne foglaljon aránytalanul sok memóriát, hiszen akkor megint sehol sem vagyunk.\\ + + \paragraph*{Láncolt listás cserekezelés} + + \noindent Ennél a technikánál egy kétirányú listába fűzzük a memóriában szereplő allokációs elemeket, a szabad helyeket, valamint a valamilyen processz által foglalt területeket. A lista ezek után egy négy elemet tartalmazó rekord: a terület jellege (szabad, foglalt), a terület kezdőcíme, a terület hossza, illetve a következő elem címe (mutató). Célszerű a listát kezdőcím szerint rendezetten kezelni, így egyszerűbb helyet keresni egy új feladatnak, valamint egyszerűbb a lyukakat összevonni. Nézzük meg, hogy milyen módon kereshetünk helyet egy új processznek. Feltesszük, hogy a memóriakezelő tudja az igényelt hely nagyságát: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textbf{firstfit}: megkeresi az első olyan üres helyet, amiben elférünk, majd két részre osztja a területet: az egyik tartalmazza magát a processzt, a maradék rész pedig szabad listaelem lesz; + \item \textbf{nextfit}: az utolsó szabad helytől keres üres területet; + \item \textbf{bestfit}: az egész listában keresi azt a legkisebb szabad területet, ahol elfér a processz. Természetesen az eljárás általában lassabb, mint az előbbiek, viszont helyet talál olyan processzeknek is, amelyeknek az előző két módszer nem talál a nagy helyigény miatt. Azok ugyanis kis igényhez is az első szabad helyet rendelik, ami lehet, hogy nagyobb igénynek is megfelelne; + \item \textbf{worstfit}: a legnagyobb szabad lyukat választja; + \item a módszerek javíthatóak azáltal, hogy külön listában kezeljük a foglalt, illetve a szabad területeket. Tovább javítható bizonyos előfeltételek teljesülése esetén: például ha elég egyformák a processzek méretei, akkor a leggyakoribb mérethez külön szabadlistát készítünk, és ebben keresünk. Ezt a módszert \textbf{quickfit} technikának nevezik. + + \end{itemize} + + \subsection*{Virtuális memória fogalma} + + \noindent A számítógépek korai időszakában a véletlen elérésű memória (RAM) hozzávetőlegesen ezerszer drágább volt, mint a mechanikai tárolók, azaz a mai merevlemezeknek megfelelő tárolók.\\ + + \noindent Jó megoldásnak tűnt, hogy a drága – ezért viszonylag kis tárolókapacitású – gyors memóriába csak az éppen szükséges programrész kerüljön be, a „nem használt” programrészek pedig külső, mechanikus tárolókon helyezkedjenek el. Különösen a több felhasználós (időosztásos) rendszerek esetében látszott előnyösnek ez a megoldás, amikor a program- és felhasználóváltás amúgy is jó alkalmat szolgáltatott arra, hogy a programot cseréljék.\\ + + \noindent A program megállítása helyett több számítógéprendszer a kevéssé használt memóriaterületeket másolja ki mechanikai tárolóra.\\ + + \noindent A mozgatás a háttértár és a memória között viszont nagyon időigényes feladat. A programok rövid idő alatt csak kis részét használják a tárterületnek, valamint az operációs rendszer felelőssége nagy (biztosítania kell, hogy a program ne nyúljon ki a partícióból; ha a partíció túl kicsi, akkor dinamikusan „hozzá kell foglalni”, stb.).\\ + + \noindent A virtuális memória a számítógép RAM memóriáját a merevlemezen egy ideiglenes használatú területtel kombinálja. Ha nincs elegendő RAM memória, a virtuális memória az adatokat a RAM memóriából a lapozófájlnak nevezett területre mozgatja. Az adatok lapozófájlba mozgatása RAM memória területet szabadít fel, mellyel befejezhetők a feladatok.\\ + + \noindent Általánosan elmondható, hogy minél több RAM memória van a számítógépben, annál gyorsabban futnak a programok. Ha a számítógép működését a kevés RAM memória lelassítja, akkor ellensúlyozásként a virtuális memória növelése látszik megoldásnak. Azonban a számítógép az adatokat a RAM memóriából sokkal gyorsabban tudja olvasni, mint a merevlemezről, ezért a RAM memória bővítése jobb megoldás.\\ + + \noindent Az operációs rendszer úgy szabadít fel operatív memóriát az éppen futó program számára, hogy a memóriában tárolt, de éppen nem használt blokkokat (lapokat) kiírja a külső tárolóra, amikor pedig ismét szükség van rájuk, visszaolvassa őket. Mivel a merevlemez sebessége töredéke a memória sebességének, nagyon sok múlik azon, hogy a virtuálismemória-kezelő milyen stratégiát alkalmaz az operatív memóriából kimozgatandó lapok kiválasztásakor. A memóriakezelésnek két fajtája létezik. Az egyik az úgy nevezett lapozás, a másik pedig a szegmentálás.\\ + + \noindent A virtuális memóriaval szemben támasztott követelmények: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden program saját memóriaterületet lásson (mintha minden memória az övé volna) + \item Bármely címre lehessen hivatkozni, ahol is az adatok permanens tárolódjanak (akárcsak a fizikai memóriában) + \item A program ne tudjon semmit arról, hogy hogyan van ez megvalósítva + \item A hatékonyság ne romoljon drasztikusan a fizikai memóriához képest\\ + \end{itemize} + + \paragraph*{A virtuális memória megvalósítása} + + \noindent A virtuális és a fizikai memóriát is felosztjuk részekre, ezeket egymáshoz rendelhetjük. Ha a folyamat olyan memóriaterületre hivatkozik, amihez még nincs fizikai memória rendelve, akkor kivétel keletkezik $\rightarrow$ ennek kezelését az operációs rendszer végzi, amely folyamán hozzárendel egy fizikai memória részt.\\ + + \noindent Minden program saját címtárral rendelkezik, az ő címei nem hivatkozhatnak másik folyamat fizikai memóriájára, kivéve bizonyos speciális eseteket (pl.: operációs rendszerkódja, adatai; kommunikációs adatok, stb.). \\ + + \noindent A leképezés során a címpárokat tárolni kell, ezt tehetjük: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item byte-onként: rugalmas, de a címtáblázat nagy + \item rögzített méretű darabonként: \emph{lapozás} + \item változó méretű darabonként: \emph{szegmentálás} + \end{itemize} + + \section*{Lapozás és szegmentálás} + + \subsection*{Lapozás} + + A virtuális és a fizikai memóriát is egyenlő méretű darabokra osztjuk: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item virtuális memória $\rightarrow$ lapok, + \item fizikai memória $\rightarrow$ lapkeretek. + \end{itemize} + + \noindent Egy lappal csak akkor dolgozhatunk, ha keretbe foglaltuk, de a keretek száma kevesebb, mint a lapoké. Egy lapon belüli címek egy lapkereten belüli címekké "fordítódnak". A felhasználói programok csak a lapokat látják, mint ha az lenne a fizikai memória.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/paging.png} + \caption{} + \label{paging} + \end{figure} + + \noindent A lapok mérete általában kettő hatványa ($2^k$).\\ + + \paragraph*{Laptábla} + + \noindent A lapok és lapkeretek egymáshoz rendeléseit tartalmazza. Minden folyamatnak külön laptáblája van. A laptábla alapcím szerint indexelt, mezői üresek vagy a lapkeret címét tartalmazzák. Mezői tartalmazzák, hogy a laphoz tartozik-e lapkeret a fizikai memóriában, és ha van ilyen, akkor mi annak a címe. Hivatkozás esetén ez a lapcím keret a táblázatból a lapcím helyére másolódik. Ha nem tartozik hozzá lapkeret: laphiba kivétel történik és a kivételkezelő feladat a lapot valamelyik lapkeretbe elhelyezni. A laphiba kivétel mindig hiba (fault), azaz a végén a kivételt okozó utasítás a kivétel kezelése után újra végrehajtódik. A gyakori lapcím–lapkeret párokat egy gyorsítótárban tároljuk. + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/paging_address_conversion.png} + \caption{Címfordítás egy lapozó rendszerben} + \label{paging_address_transformation} + \end{figure} + + \paragraph*{A lapméret problematikája} + + \noindent Ha nagy a lapméretünk, akkor kicsit a laptábla, de belső elaprózódás lép fel (a kisebb folyamatok több memóriát kapnak, mint amire szükségük lenne).\\ + + \noindent Ha kicsi a lapméret, akkor kevés memória veszik kárba, ellenben nagy a laptábla, ami viszont sok memóriát eszik. Erre megoldás a két szintű laptáblázat. + + \section*{Lapcserélési algoritmusok} + + Akkor válik szükségessé lapcsere, ha a használni kívánt programrész nincs a memóriában. Ezt az eseményt laphibának nevezik, ami kiváltja a lapcserélési eljárás megindítását.\\ + + \noindent A hiányzó lapot be kell töltenünk vagy létre kell hoznunk egy üres lapot. Ha van üres lapkeret, ezt megtehetjük, ha nincs, akkor „ki kell dobnunk” egy lapot, a kérdés, hogy melyiket. Mivel a laphibakezelése sok erőforrást igényel, a cél a minél kevesebb laphiba.\\ + + \noindent Fontos elemei a virtuális memóriakezelésnek a lapcserélési algoritmusok. Ezek többfélesége egyrészt a fejlődésüket, hatékonyabbá válásukat mutatja, másrészt esetleg ismerve a feladat milyenségét, egyikük valamilyen szempontból jobb lehet egy másiknál. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item \textbf{Optimális} – egyben megvalósíthatatlan – \emph{lapcserélési algoritmus}. Ennek lényege, hogy a memóriában levő minden lapot megcímkézünk azzal a számmal, amelyik azt jelzi, hogy hány utasítás végrehajtása után kerül erre a lapra „sor”. Nyilván a legnagyobb számú lapot kellene kidobni, de az operációs rendszerek nem tudják megmondani a számot. Ehhez ugyanis először „virtuálisan” le kellene futtatni a programot, ami nyilvánvalóan abszurditás. + + \item \textbf{NRU} (Not Recently Used, nem mostanában használt) algoritmus: + \begin{itemize} + \item Minden laphoz, ami a memóriába kerül, hozzárendelünk még két bitet: egy R bitet, amely minden hivatkozáskor (akár olvasás, akár írás) egyesre állítódik, és egy M bitet, ami módosításkor kap 1-es értéket. Ennek alapján a memóriába lévő lapok négy osztályba sorolhatóak: + \begin{itemize} + \item 0.osztály: 00 (nem hivatkozott, nem módosított) + \item 1.osztály: 01 (nem hivatkozott, módosított) + \item 2.osztály: 10 (hivatkozott, nem módosított) + \item 3.osztály: 11 (hivatkozott, módosított) + \end{itemize} + \item A módszer az, hogy véletlenszerűen kiválaszt a legalacsonyabb sorszámú osztályból egyet, és azt kidobja. Egyszerű módszer, könnyen megvalósítható. + \end{itemize} + \item \textbf{FIFO} (First-In First-Out) \emph{lapcserélési algoritmus}. A sor-adatszerkezet műveleteinek megfelelően lapcsere esetén a legrégebben bent lévő lapot eldobja, és a sor végére teszi az újonnan érkezőt. + \item \textbf{Second chance} (második lehetőség) \emph{lapcserélési algoritmus}. A FIFO olyan módosítása, amelyben a legrégebbi egyes hivatkozású lapot nullás bittel a sor végére teszi, és keresi tovább a megfelelőt. + \item \textbf{Az óra} \emph{lapcserélési algoritmus}: A bent lévő lapokat egy láncnak képzeljük, azaz nincs első és utolsó, eleje meg vége elem, hanem egy aktuális elem, amellyel utoljára volt dolgunk laphiba esetén. Innen indulva szintén az R bitet vizsgáljuk: amennyiben ez egyes, akkor nullára állítjuk, és megyünk tovább. Lényegében az előző algoritmus, csak a kitüntetett elem – ahonnan a keresés indul – az utolsónak hivatkozott változásra mutat. + vizsgáljuk. Ha vizsgált lap hivatkozás bitje 0, akkor kitesszük. + \item \textbf{LRU} (Least Recently Used) \emph{lapcserélési algoritmus}: Talán ez közelíti legjobban az optimális lapcserélést. Statisztikai megfontolásokra támaszkodik: az utoljára használt néhány utasítás által gyakran használt lap valószínűleg továbbra is szükséges lehet; viszont amit régen nem használtunk, valószínűleg még egy darabig nem is kell. Így azt dobjuk el, amelyiket a legrégebben nem használtunk. Az okozhat implementációs nehézséget, hogy minden hivatkozáskor aktualizálni kell a laphivatkozásokat. Ehhez minden lapbejegyzéshez felveszünk egy újabb bejegyzést, amely a lapra hivatkozáskor annak a számlálónak az értékét tartalmazza, amely minden memóriahivatkozás esetén eggyel nő. + HW vagy SW megvalósítás. + \begin{itemize} + \item HW1: Vegyünk egy számlálót, ami minden memória hivatkozásnál 1-gyel nő. Minden laptáblában tudjuk ezt a számlálót tárolni. Minden memóriahivatkozásnál ezt a számlálót beírjuk a lapba. Laphibánál megkeressük a legkisebb számlálóértékű lapot. + \item HW2: LRU bitmátrix használattal, n lap, n x n bitmátrix. Egy k. lapkeret hivatkozásnál állítsuk a mátrix k. sorát 1-re, míg a k. oszlopát 0-ra. Laphibánál a legkisebb értékű sor a legrégebbi. + \end{itemize} + \item \textbf{NFU} (Not Frequently Used) algoritmus: + \begin{itemize} + \item Minden laphoz tegyünk egy számlálót. Minden óramegszakításnál ehhez adjuk hozzá a lap hivatkozás (R) bitjét. + \item Laphibánál a legkisebb számlálóértékű lapot dobjuk ki. (A leginkább nem használt lap) + \item Hiba, hogy az NFU nem felejt, egy program elején gyakran használt lapok megőrzik nagy értéküket. + \item Módosítsuk: Minden óramegszakításnál csináljunk jobbra egy biteltolást a számlálón, balról pedig hivatkozás bitet tegyük be (shr).(Öregítő algoritmus) + \item Ez jól közelíti az \emph{LRU} algoritmust. + \item Ez a lapszámláló véges bitszámú (n), így n időegység előtti eseményeket biztosan nem tud megkülönböztetni. + \end{itemize} + \end{itemize} + + \subsection*{Szegmentálás} + + A memóriát logikailag részekre un. szegmensekre osztják, és minden résznek megvan a saját, 0-tól kezdődő címtartománya. Egy memóriacím így két részből áll, egy szegmenscímből és egy eltolási- (offset) címből, azaz a memória kétdimenziós. Két szinten valósul meg, hardver és operációs rendszer szinten. A lapozással ellentétben ez nem marad rejtve a felhasználó (programozó) előtt.\\ + + \noindent Szegmentálás nélkül egyetlen egydimenziós címterünk lenne, pl.:0-100 címig. Tegyük fel, hogy a programunk két folyamatosan növekvő méretű memóriaterületet használ. Előfordulhat, hogy az első a 0-49. címig tart, a második az 50-től 80-ig. Az első memóriaterületet nem tudjuk tovább növelni, pedig még lenne szabad memória a 81-től kezdődően. A megoldás a szegmentálás. Létrehozunk egy-egy szegmenst a két memóriaterület számára, mindkettő a 0. címtől kezdődik, így mindkét memóriaterületet addig tudjuk növelni amíg a memória el nem fogy.\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/segmentation_address_conversion.png} + \caption{Címfordítás egy szegmentációval működő rendszerben} + \label{segmentation_address_transformation} + \end{figure} + + \noindent A szegmensekhez elérési jogok tartoznak: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item írható, + \item olvasható, + \item futtatható. + \end{itemize} + + \noindent Így például a programunk nem írhatja felül saját magát, mert a programkódot egy olyan szegmensben tároljuk, amely csak futtatható.\\ + + \noindent A szegmentálás hasznos osztott programkönyvtárak használata esetén is. Ha a függvények külön-külön szegmensben helyezkednek el, akkor a programkönyvtár újabb verziójával a függvények kezdőcíme nem fog megváltozni, még akkor sem, ha a méretük megváltozik.\\ + + \noindent Kétféleképp lehet megvalósítani: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item cseréléssel + \item lapozással. + \end{itemize} + + \noindent Cserélésnél a rendszer a memóriában csak néhány szegmenst tárol. Kezdetben a szegmensek folyamatosan helyezkednek el. Ha a memória betelt, és egy olyan szegmensre van szükség, amely nincs benn a memóriában, helyet kell neki csinálni, azaz ki kell egyet írni a lemezre. Mivel egy szegmenst csak a vele legalább egyenlő méretű helyre tudunk beilleszteni, a memória előbb-utóbb lyukacsossá válik -mivel a pontos illeszkedés valószínűsége csekély- , ezt hívják külső elaprózódásnak. Ennek elkerülésére több módszer lehetséges. Az egyik, hogy a szegmenseket a memória eleje felé tolják, így a sok apró lyuk helyett a memória végén egy nagy lyuk keletkezik. Egy másik, hatékonyabb módszer, hogy olyan szegmenseket írnak ki a lemezre, amelyek két lyuk közé esnek, így a lyukak mérete nő.\\ + + \noindent Lapozásnál nem teljes szegmensek cserélődnek, hanem ezeket a rendszer fix méretű részekre -lapokra- osztja. Ezeket a lapokat írja ki, vagy olvassa be. A klasszikus lapozáshoz képest, a különbség csak annyi, hogy minden szegmensnek külön laptábla kell. + + \section*{Lemezterület-szervezés, redundáns tömbök, fájlrendszerek szolgáltatásai és jellemző megvalósításaik} + + \subsubsection*{Partíciók} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A partícionálással a lemezt független szeletekre osztjuk. + \item A partíciók az alkalmazások és az OS magasabb rétegei számára általában a lemezegységekhez hasonló eszközként látszanak. + \item Az egyes partíciókat különböző célokra használhatjuk: + \begin{itemize} + \item Nyers partíciók (pl. adatbáziskezelőknek) + \item Virtuális memóriaterület (swap) + \item Fájlrendszer + \end{itemize} + \end{itemize} + + \subsection*{Redundáns tömbök} + + \textbf{RAID} -- Redundant Array of Inexpensive Disks. (olcsó lemezegységek redundáns tömbje)\\ + + \noindent Szoftverből és hardverből is megvalósítható + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Hardver-RAID esetén általában egész diszkeket kötünk össze egy külső vezérlőegységgel, az OS szemszögéből az eredmény egy szokásos lemezegységnek látszik (RAID diszkrendszer) + \item Szoftver-RAID-et az OS valósítja meg, így partíciók felett is működhet + \item A hardver megvalósítás drágább, de hatékonyabb + \end{itemize} + + \noindent Több lemezt fog össze, és egy logikai egységként látja az operációs rendszer. Többféle ,,összefogási" elv létezik: RAID 0-6 (7). + + \paragraph*{RAID 0 (összefűzés vagy síkozás)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Néhány diszk tárterületének összefűzésével megsokszorozhatjuk az összefüggő tárkapacitást + \item A logikai diszk blokkjait általában felváltva osztjuk szét a fizikai diszkek szektorai között + \item Az IO műveletek párhuzamosításával nő a teljesítmény + \item Nincs redundancia, nő az adatvesztés esélye + \item Általában a blokknál nagyobb egységeket kezelünk (stripe), de akár bitszintű szétosztás is lehetséges + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.275\textwidth]{img/raid0.png} +% \caption{RAID 0} + \label{ref:raid0} + \end{figure} + + \noindent A RAID 0 főleg olyan helyeken alkalmazható, ahol nem szempont az adatbiztonság vagy kevés merevlemez csatolható fel az operációs rendszer korlátozása miatt. A másik pozitív tulajdonsága viszont továbbra is csábító lehet olyan, kifejezetten csak játékra épített rendszereknél, ahol ezzel tetemes teljesítménynövekedést érhetünk el. Ilyen célú alkalmazásra mégsem túl ajánlott, mivel az egyszer már összekapcsolt diszkek különálló alkalmazása csak újraszervezés után, a teljes adattartalom eltávolításával és újraformázással lehetséges. + + \paragraph*{RAID 1 (tükrözés)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Minden adatot két független diszken tárolunk + \item A tárolókapacitás a felére csökken + \item Olvasási teljesítmény nőhet, írás nem változik, vagy kissé csökken + \item Diszkhibából eredő adatvesztés esélye jelentősen csökken + \item Egyszerű, de drága megoldás + \item Nagyon kicsi processzorigény + \item 1 GB adat tárolásához 2 GB diszkterület szükséges + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.28\textwidth]{img/raid1.png} +% \caption{RAID 1} + \label{ref:raid1} + \end{figure} + + \paragraph*{RAID 2 (ECC)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A gépi memóriánál megszokott hibajavító kódok használata (ECC memória) + \item Az adatbitek mellett néhány extra bitet is tárolunk (lásd Hamming kódok) + \item A bájt bitjeit és a hibajavító biteket tároljuk különböző diszkeken + \item Az egyik diszk meghibásodása esetén a paritásbitekből helyreállítható a hiányzó bit + \item pl. 4 diszk kapacitáshoz elég 7 fizikai diszk + \item A gyakorlatban ritkán használt + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/raid2.png} +% \caption{RAID 2} + \label{ref:raid2} + \end{figure} + + \paragraph*{RAID 3 (paritásbitek)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A memóriával ellentétben a P lemezegységek jelzik, ha hiba történik + \item Nincs szükség a teljes hibajavító kódra, elég egyszerűen a paritásbitet tárolni (XOR) + \item Az ismert pozíciójú hibás bit ebből helyreállítható + \item Előnyök: + \begin{itemize} + \item Olcsó: n diszk kapacitáshoz elég n+1 diszk + \item Egy blokk írása/olvasása szétosztódik a diszkek között, tehát felgyorsul + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Magasabb CPU igény + \item I/O műveletekben az összes diszk részt vesz, a párhuzamos teljesítmény romlik + \end{itemize} + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/raid3.png} +% \caption{RAID 3} + \label{ref:raid3} + \end{figure} + + \paragraph*{RAID 4 (paritásblokkok)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A RAID 0 megoldást egészítsük ki egy P paritásdiszkkel + \item Nincs szükség a bájtok felszabdalására, a paritás független blokkokra is számolható + \item Egy diszk kiesése esetén a paritásdiszk és a többi diszk blokkjaiból helyreállíthatók az adatok + + \item Előnyök: + \begin{itemize} + \item A RAID 3-hoz hasonlóan olcsó + \item Egy blokk beolvasásához elég egyetlen diszk, így a független olvasások párhuzamosíthatók + \end{itemize} + \item Hátrányok: + \begin{itemize} + \item Az egyedi olvasásműveletek sebessége csökken + \item Az írások nem párhuzamosíthatóak (a paritásdiszket minden írás használja) + \item A diszkek igénybevétele nem egyforma + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/raid4.png} + % \caption{RAID 4} + \label{ref:raid4} + \end{figure} + + \paragraph*{RAID 5 (elosztott paritásblokkok)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A RAID 4 javítása: a paritásblokkokat keverjük az adatblokkok közé + \item Például egy 5 diszkből álló tömbben az n. blokkhoz tartozó paritásblokkot tároljuk az (n mod 5)+1. diszken, a többi diszk n. blokkjai tárolják az adatokat + \item A diszkek igénybevétele kiegyenlítődik + \item Az írások némileg párhuzamosíthatók, azonban még mindig jóval lassabbak az egyszerű tükrözésnél + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{img/raid5.png} + \caption{RAID 5} + \label{ref:raid5} + \end{figure} + + \paragraph*{RAID 6 (P+Q)} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Paritásblokk (P) mellett hibajavító kódok (Q, Reed-Solomon) + \item n+2 diszk költséggel n diszknyi kapacitást nyújt, és bármely két diszk kiesését elviseli + \item Matematikai háttér: Galois-terek + \item Jelentős, a RAID 5-nél is magasabb CPU igény + \item Elvileg általánosítható kettőnél több diszk kiesésére, a gyakorlatban általában nem éri meg + \item A P és Q blokkokat célszerű itt is az adatblokkok közé keverni + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/raid6.png} + \caption{RAID 6} + \label{ref:raid6} + \end{figure} + + \paragraph*{RAID 1+0 (RAID 10)} + + \noindent Hasonlít a RAID 01 megoldáshoz, annyi különbséggel, hogy itt a lemezeket először tükrözzük, majd a kapott tömböket fűzzük össze. Ez biztonság szempontjából jobb megoldás, mint a RAID 01, mivel egy diszk kiesése csak az adott tükrözött tömböt érinti, a rá épült RAID 0-t nem; sebességben pedig megegyezik vele.\\ + + \noindent Hátránya, hogy legalább 4 adathordozóra van szükség, ahol 1-1 tükrözött adathordozó kerül összefűzésre, ezért az egyes adathordozók összes tárkapacitásának mindössze a fele felhasználható a tömbben. Előnye azonban az összefűzésből fakadó írási sebesség növekedés, valamint egy sajátos, több elemre is kiterjedő redundancia.\\\\ + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/raid1+0.png} + \caption{RAID 1+0} + \label{ref:raid10} + \end{figure} + + \paragraph*{RAID 0+1 (RAID 01)} + + \noindent Ez egy olyan hibrid megoldás, amelyben a RAID 0 által hordozott sebességet a RAID 1-et jellemző biztonsággal ötvözhetjük. Hátránya, hogy minimálisan 4 eszközre van szükségünk, melyekből 1-1-et összefűzve, majd páronként tükrözve építhetjük fel a tömbünket, ezért a teljes kinyerhető kapacitásnak mindössze a felét tudjuk használni. Mivel a tükrözés (RAID 1) a két összefűzött (RAID 0) tömbre épül, ezért egy lemez meghibásodása esetén az egyik összefűzött tömb mindenképp kiesik, így a tükrözés is megszűnik. Fontos megjegyeznünk, hogy ez a megoldás legalább négy darab merevlemezt igényel. + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/raid0+1.png} + \caption{RAID 0+1} + \label{ref:raid01} + \end{figure} + + \noindent A vezérlők gyakran nyújtják egyiket, másikat, mivel így is, úgy is tükrözés van, azaz drága, így ritkán használt.\\ + + \paragraph*{RAID összefoglalás\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A gyakorlatban csak a 0., 1., 5. és 6. szinteket alkalmazzák, illetve az 1+0, 0+1 kombinált megoldásokat. (RAID 2,3,4) nem gyakran használatosak.\\ + + \item A komponens diszkek méretének egyformának kell lennie + \item Új diszkek menet közbeni hozzáadásával nem lehet növelni a tárkapacitást, újra létre kell hozni a tömböt + \item A 6. illetve szerencsés esetben az 1+0, 0+1 kivételével valamennyi szint csak egyetlen diszk kiesését viseli el + \item Választási szempontok: + \begin{itemize} + \item Magas megbízhatóság: 1, 5, 6, 1+0, 0+1 + \item Nagy teljesítmény: 0, 1, 1+0, 0+1 + \item Alacsony költség: 0, 5, 6 + \item Ezek közül bármelyik kettőt teljesíthetjük + \end{itemize} + \item Minden rendszernél külön kell mérlegelni, melyik a legmegfelelőbb megoldás; gyakran több különböző RAID szintű és méretű tömböt definiálunk + \item Általában lehetőség van készenléti diszkek definiálására, melyeket a rendszer automatikusan üzembe állít, ha egy diszk kiesik + \begin{itemize} + \item Az új diszk szinkronizációja időbe telik, ezalatt a tömb teljesítménye csökken + \item A szinkronizáció közbeni új diszkhiba végzetes (a RAID-6 ez ellen védelmet nyújt) + \end{itemize} + \item A redundáns tömbök nem nyújtanak védelmet minden hibalehetőség ellen + \begin{itemize} + \item Emberi tévedések + \item Programhibák + \item Az egész rendszert érintő hibák + \end{itemize} + \item Váratlan leállások + \item Túlfeszültség + \item Természeti katasztrófák + \item A fejlett operációs rendszerek kötetkezelő rendszerekkel (volume manager) könnyítik meg a hibatűrő logikai diszkek létrehozását és üzemeltetését + \begin{itemize} + \item Új indirekciós szint a logikai blokkok és a RAID tömbök fizikai blokkjai között + \item A kötetkezelő rendszertől a partíciókhoz hasonló, de rugalmasan átméretezhető, \\ + hibatűrő logikai tárterületek (kötetek) igényelhetők + \item A rábízott fizikai partíciók tárterületével a kötetkezelő automatikusan gazdálkodik + \end{itemize} + \end{itemize} +\newpage + \subsection*{Fájlrendszerek szolgáltatásai} + + \noindent Az adatállományok a rendelkezésre álló lemezterületen történő tárolásának és elrendezésének módszere a fájlrendszer.\\ + + \noindent \textbf{Fájl}\\ + + \noindent Olyan bitsorozat, melyek tartalma a folyamat befejeződése vagy a rendszer újraindítása után sem veszik el. Adatok logikai csoportja, névvel és egyéb atrribútumokkal.\\ + + \noindent A fájl az információtartalmán túl a fájlt leíró ún. meta-adatokat vagy attribútumokat is tárolunk: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item neve + \item elhelyezkedése a lemezen + \item mérete + \item tulajdonosai, elérési jogosultságok + \item elérési és egyéb időbélyegek + \item $\ldots$ + \end{itemize} + + \noindent Fizikai szerkezetét tekintve egy blokksorozat, amely nem feltétlenül egymást követő blokkokból áll (töredezés). És az utolsó blokkja általában töredékblokk (nem tölti ki feltétlenül a teljes blokkot). + + \noindent A meta-adatokat a fájl tartalmától elkülönítve önálló fájlleíró blokkokban tároljuk a lemezen.\\ + + \noindent A fájl típusa közli, hogy a fájl tartalma hogyan értelmezhető + \begin{itemize} + \item Expilict meta-attributumokban (pl MAC) + \item A fájlnévbe építve, kiterjesztés formájában (Windows) + \item A fájl tartalmában elhelyezett speciális kódokkal (UNIX) + \end{itemize} + + \noindent A fájl műveletei + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új, üres fájl létrehozása + \item Egy létező fájl törlése + \item Írás (felülírás, beszúrás, hozzáfűzés) + \item Olvasás (szekvenciális vagy közvetlen) + \item Újrapozíciónálás (szekvenciális írás/olvasás) + \item Meta-adatok lekérdezése, módosítása (például: Átnevezés) + \item Zárolás + \item $\ldots$ + \end{itemize} + + \noindent A fájlrendszer feladata a fenti műveletek hatékony implementációja.\\ + + \noindent A könyvtár a fájlrendszerben tárolt fájlokról tárolt jegyzék. Egy könyvtár alá tartozhatnak további könyvtárak ún. alkönyvtárak. Ez esetben minden könyvtárnak pontosan egy szülője lehet, kivéve a gyökér könyvtár, aminek nincs szülője. A könyvtárak hierarchiája fa szerkezetű.\\ + + \noindent Egy fájl útvonala a gyökérkönyvtár a fájlt tartalmazó könyvtárral összekötő út a könyvtárszerkezetben.\\ + + \noindent A rendszer a folyamatokhoz aktuális könyvtárat rendel. Ehhez az aktuális könyvtárhoz képest egy fájl vagy könyvtár hivatkozható relatív elérési úttal is.\\ + + \noindent A könyvtáraknak is vannak meta-adatai: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item neve + \item tulajdonos, elérési jogosultságok + \item időbélyegzők + \end{itemize} + + \noindent A könyvtár műveletei: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új, üres könyvtár létrehozása + \item Egy létező könyvtár törlése + \item Listázás + \item Keresés + \item $\ldots$ + \end{itemize} + + \noindent A fájlkezelés alrendszerét rétegekre oszthatjuk. Az egyes rétegek csak a közvetlenül alattuk és fölöttük lévő rétegekkel kommunikálnak. Az alsó réteg szolgáltatásait használják, és a felső réteg számára szolgáltatásokat nyújtanak.\\ + + $\begin{array}{lccc} + 7 & \text{alkalmazás} & & \\ + 6 & \text{rekordkezelő} & & \\ + 5 & \text{fájlrendszer} & & \\ + 4 & \text{kötetkezelő} & & \\ + 3 & \text{eszközmeghajtó} & & \\ + 2 & \text{I/O-vezérlő} & & \\ + 1 & \text{lemez} & & + \end{array}$\\ + +% \begin{figure}[H] +% \centering +% \includegraphics[width=0.4\textwidth]{img/file_system_management.png} +% \caption{Fájl-kezelés} +% \label{file_system_management} +% \end{figure} + + \noindent \textbf{Fájlrendszer típusok:} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Merevlemezen alkalmazott fájlrendszer: FAT, NTFS, EXT2FS, XFS, stb + \item Szalagos rendszereken: Tartalomjegyzék, majd a tartalom szekvenciálisan + \item CD, DVD, Magneto-opto Disc fájlrendszer: CDFS, UDF (Universal Disc Format) + \item RAM lemezek (ma már kevésbé használtak) + \item FLASH memória meghajtó (FAT32) + \item Hálózati meghajtó: NFS + \item Egyéb pszeudó fájlrendszerek: Zip, tar.gz, ISO + \end{itemize} + + \noindent A modern operációs rendszerek viszont többféle fájlrendszert is támogatnak, és vannak olyan fájlrendszerek is, amelyeket több operációs rendszer is támogat. +\newpage + \subsection*{Fájlrendszerek szolgáltatásainak jellemző megvalósításai\\} + + \subsubsection*{A lemezen tárolt adatszerkezetek} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Boot blokk + \item Fájlrendszer-leíró blokk vagy blokkok (superblock) + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Fájlok száma + \item Blokkok száma és mérete + \item Szabad blokkok száma + \item A fájlrendszer állapota (tiszta, gyanús, hibás) + \item Időbélyegzők + \begin{itemize} + \item Utolsó csatolás + \item Utolsó ellenőrzés + \item Utolsó modosítás + \end{itemize} + \item Fájlrendszer címkéje + \end{itemize} + \item Könyvtárszerezet a fájlok szervezéséhez + \item Fájlleíró blokkok (i-node) a fájlok metaadatainak tárolására + \end{itemize} + + \noindent Superblock nélkül a fájlrendszer nem használható, ezért több példányban is eltárolják általában. + + \paragraph*{A memóriában tárolt adatszerkezetek\\} + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Csatolt fájlrendszerek táblázata + \item Nemrégiben használt könyvtárak táblázata + \item Rendszerben megnyitott összes fájl leírása + \item Folyamatonkénti táblázat a folyamat megnyitott fájlairól + \item Blokk gyorsítótár + \end{itemize} + + \noindent A könyvtárakat általában speciális tartalmú adatállományokkal reprezentálják. Hasonló a fájlok tárolásához.\\ + + \subsection*{Blokkfoglalás} + + \noindent A fájlok tartalmát adatblokkokban tárolja + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Nyilvántartja mely blokkok tartoznak egy fájlhoz és milyen sorrendben + \item Tudnia kell egy új blokkok hozzáadását egy már létező fájlhoz + \end{itemize} + + \noindent A blokkok nyilvántartását metaadatok között tárolja magában az i-node-ban, vagy a lemez egy erre a célra elkülönített területén. + + \paragraph*{Folytonos blokkfoglalás} + + Legyenek a fájlok blokkjai együtt egy folytonos lemezterületen + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Dinamikus partíciók használhatók + \item Egy fájl blokkjainak nyilvántartásához elég a kezdőblokkot és a fájl hosszát tárolni. + \item Nagyon hatékony, mivel kizárja a fájl töredezettségéből eredő fejmozgásokat + \item \emph{Hátrányai:} + \begin{itemize} + \item A szabad terület elaprozódása miatt külső töredezettség + \item Mivel a végső fájlméretet előre meg kell adni, a lassan növő fájlok jelentős belső töredezettséget eredményeznek + \item A fájlméret utólag nehezen növelhető + \end{itemize} + \item Csak olvasható háttértárakon (CD, DVD, stb.), illetve nagy I/O teljesítmény esetén\\ (nagyszámítógépek) éri meg használni + \end{itemize} + + \paragraph*{Láncolt listás blokkfoglalás} + + Minden adatblokk végén megtalálható a következő adatblokk száma + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az i-node csak az első adatblokk számát tartalmazza + \item Láncolt lista adatszerkezet + \item \emph{Hátrányai:} + \begin{itemize} + \item Csak szekvenciális I/O műveletek esetén elfogadható + \item A blokkmutatók tárolása miatt a használható tárkapacítás százalékokban kifejezhető mértékben csökken + \item Ha a blokkmutatók elromlanak jelentős lesz lehet az adatvesztés + \end{itemize} + \item A tisztán ezt a módszert a gyakorlatban ritkán használják + \begin{itemize} + \item Több blokkot fürtbe (cluster) fogva javítható a viselkedés, de nő a belső töredezettség + \item Jellemzően a blokkmutatók kigyűjtése egy külön táblázatba: FAT + \end{itemize} + \end{itemize} + + \paragraph*{Indexelt blokkfoglalás} + + A fájl adatblokkjainak sorszámát sorojuk fel egy külön erre a célra fenntartott indexblokkban + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az i-node-ban erre az indexblokkra hivatkozunk + \item Minden fájlhoz külön indexblokkot rendelünk + \item A szekvenciális és közvetlen elérést egyaránt jól támogatja + \item Rövid fájlok esetén az utolsó adatblokk mellett az indexblokk is csak részlegesen lesz kihasználva + \item Az indexblokkokat általában a memóriában megőrizzük + \end{itemize} + + \noindent Mi történik, ha betelik az indexblokk? + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Új blokkot láncolhatunk hozzá (láncolt listás index) + \item Második szintű indexblokkot definiálhatunk + \begin{itemize} + \item Követlen indexblokkok számait sorolja fel + \item Tetszőlegese szintig kiterjeszthető + \end{itemize} + \item A két megoldást kombináljuk + \begin{itemize} + \item Az i-node-ban felsorolunk néhány adatblokkot, néhány közvetlen indexblokkot, és egy-egy második és harmadik szintű indexet + \item Hatékony és gazdaságos megoldás + \item Elterjedt (klasszikus UNIX UFS, Linux ext2, stb.) + \end{itemize} + \end{itemize} + + \section*{Fájlrendszerek megvalósításai} + + \subsubsection*{FAT} + + \paragraph*{Egy FAT partíció létrehozása} + + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/FAT_disk.png} + \caption{FAT partíció} + \label{fat_partition} + \end{figure} + + \noindent Egy partíció formázásakor és a FAT fájlrendszer beállításakor egy úgynevezett Master Boot Record (MBR) jön létre a háttértárolón.\\ + + \noindent A Master Boot Record, vagy más néven a partíciós szektor a merevlemez legelső szektorának (azaz az első lemezfelület első sávja első szektorának) elnevezése. \\ + + \noindent Csak a particionált merevlemezeknek van Master Boot Recordjuk. \\ + + \noindent A Master Boot Record a merevlemez legelején, az első partíció előtt található meg.\\ + + \noindent A Master Boot Record egy kisebb végrehajtható kódot, amit Master Boot Code-nak hívunk, és egy partíciós táblát tartalmaz. \\ + + \noindent Egy új partíció becsatolásakor a Master Boot Record végrehajtja a Master Boot Code-ot, és átadja a vezérlést a lemez boot szektorának.\\ + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{8cm}|} \hline + Hard disk & Háttértároló, ami egy vagy két partíciót tartalmaz. \\ \hline + Boot szektor & Összesen: Bootolható partíció, amely információkat tartalmaz a lemez kialakításáról, a fájlrendszer struktúrájáról. Itt tárolódik a boot code is, amely az Ntdlr-t tölti be. \\ \hline + Master Boot Record & Olyan végrehajtható kódot tartalmaz, amit a rendszer BIOS (Basic Input/Output System) tölt be a memóriába. A kód a partíciós tábla alapján eldönti, hogy melyik partíció aktív vagy bootolható. \\ \hline + Ntldlr.dll & A processzort (CPU) védett módba állítja, elindítja a fájlrendszert, majd kiolvassa a Boot.ini fájl tartalmát. Ezek az információk meghatározzák a kezdeti beállításokat és a kezdeti „boot menu” opciókat. + +Az Ntldr Windows NT alapú operációs rendszerek betöltőprogramja, amelynek feladata az alapvető hardverkonfigurációs jellemzők felderítése és az ezeknek megfelelő rendszermagváltozat betöltése és elindítása. \\ \hline + Fastfat.sys & System file driver a FAT 16-hoz és a FAT 32-höz. \\ \hline + Ntoskrnl.exe & Információt ad arról, hogy melyik system device drivert kell betölteni, és hogy mi a megfelelő betöltési sorrend. \\ \hline + Kernel mód & Az a végrehajtó mód, amely lehetőséget biztosít a kódoknak, hogy közvetlen hozzáférjenek az összes hardverhez és a memóriához a rendszerben. \\ \hline + Felhasználói mód & Az a végrehajtó mód, ahol az alkalmazások futnak. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{A FAT fájlrendszer fizikai szerkezete, lemezkezelése} + + \noindent A klaszter a legkisebb egység a lemezen, amit le lehet foglalni egy fájl tárolásához. A szektor a tárolás egysége a háttértárolón. Ha például egy háttértároló 512 bájtos szektorméretet használ, akkor az 512 bájtos klaszter egy szektort, míg a 4 kilobájtos klaszter nyolc szektort foglal magában.\\ + + \noindent A klaszterek a partíció kezdetétől sorban vannak megszámozva. Mivel a FAT fájlrendszer adatklaszterei a BIOS Parameter Block, a fenntartott szektorok és két FAT struktúra után találhatók, így a FAT formázás nem garantálja, hogy az adatklaszterek illeszkednek a klaszterhatárokra.\\ + + \noindent Mivel a FAT 16 és a FAT 32 különböző méretű klaszterekkel dolgozik, a kötet méretétől függően, így az összes fájlrendszernek megvan a maximálisan támogatott klaszterszáma. Minél kisebb a klaszter mérete, annál hatékonyabb az adattárolás a lemezen.\\ + + \noindent A nevekben elhelyezkedő számok utalnak arra, hogy hány bit szükséges a FAT tábla egy bejegyzésének tárolására: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item FAT16: + \begin{itemize} + \item 16 bites bejegyzések + \item (Ez 216 klasztert jelent.) + \end{itemize} + \item FAT32: + \begin{itemize} + \item 32 bites bejegyzések, amiből 4 bit a FAT bejegyzésre van félretéve. + \item (Tehát maximum 228 klaszter lehetséges.)\\ + \end{itemize} + \end{itemize} + + \noindent A \textbf{FAT16} fájlrendszer méretkorlátai\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} \hline + Leírás & Maximális fájlméret \\ \hline \hline + Maximális fájlméret & Összesen: 4 GB - 1 bájt (azaz 232 bájt - 1 bájt). \\ \hline + Maximális kötetméret & Összesen: 4 GB. \\ \hline + Fájlok maximális száma kötetenként & Megközelítően 65 536 (azaz 216 darab fájl). \\ \hline + Maximum hány fájl vagy könyvtár lehet a gyökérkönyvtárban? & 512 db \\ \hline + \end{tabular}\\ + } + \renewcommand{\arraystretch}{1}\\ + + \noindent A \textbf{FAT32} fájlrendszer méretkorlátai\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} \hline + Leírás & Maximális fájlméret \\ \hline \hline + Maximális fájlméret & Összesen: 4 GB - 1 bájt (azaz 232 bájt - 1 bájt). \\ \hline + Maximális kötetméret & 32 GB (implementációfüggő). \\ \hline + Fájlok maximális száma kötetenként & 4 194 304 darab. \\ \hline + Maximum hány fájl vagy könyvtár lehet a gyökérkönyvtárban? & 65 536 db \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{A FAT fájlrendszer kötetszervezése, felépítése} + + {\footnotesize + \begin{centering} + \noindent \renewcommand{\arraystretch}{2} + \begin{tabular}{|c|c|c|c|c|c|} \hline + \textbf{Boot sector} & \makecell{Reserved \\ sectors} & \textbf{FAT} (1) & \makecell{\textbf{FAT (2)}\\Copy of FAT (1)} & \textbf{Root folder} & \textbf{Files and folders} \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\ + \end{centering} + } + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + Elemek & Leírás \\ \hline \hline + Boot sector & Bootolható partíció, amely információkat tartalmaz a lemez kialakításáról, a fájlrendszer struktúrájáról. Itt tárolódik a boot code is. \\ \hline + Reserved sectors & A szektorok száma, ami megelőzi az első FAT köteget, és tartalmazza a boot szektort. \\ \hline + FAT 1 & Eredeti FAT kötet. \\ \hline + FAT 2 & Biztonsági mentés a FAT kötetről. \\ \hline + Root folder & Leírja a fájlokat és a mappákat, amelyek a partíció gyökerében találhatóak. \\ \hline + Files and folders & A fájlok és mappák adatait tartalmazza, amelyek a fájlrendszerben találhatóak. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\\\ + + \noindent A FAT fájlrendszer az elnevezését a benne megvalósított fájlláncolási eljárásról kapta. Ebben a fájlláncolási eljárásban nemes egyszerűséggel felvettek egy táblázatot, ami megmondja, hogy az n.-ik klaszteren elhelyezkedő fájl következő darabja pontosan hol található. A FAT táblában szerepelhet a valós értékek mellett egy-két extrém érték is, amelyek a fájl végét, hibás klasztert vagy üres blokkot jelölhetnek.\\ + + \noindent A FAT tábla összesen két példányban került a lemezre, így ha az egyik megsérült valamilyen oknál fogva, akkor az a másikból helyreállítható volt. Sajnálatos módon a tervezésnél a két FAT tábla (az eredeti és a duplikátum) pontosan egymás mögött helyezkedik el, így egy szerencsétlen hardverhiba esetén mind a kettő akár egyszerre is megsérülhet. A dupla hibalehetőségre viszont az informatikában nem lehet tervezni, mivel elég költséges.\\ + + \noindent A FAT fájlrendszeren egy fájl neve nyolc (8) ASCII karakter lehetett, amelyet egy háromkarakteres (3) kiterjesztés követett. Az MS-DOS és a Microsoft Windows operációs rendszerek a kiterjesztés alapján döntötték el (és ez alapján döntik el a mai napig is) egy fájl típusát.\\ + + \noindent A könyvtárak és a kötetazonosítók attribútumokkal voltak jelölve. A FAT fájlrendszer egyéb attribútumai (mint például a rendszerattribútum, a rejtett attribútum, az archív attribútum és a csak olvasható attribútum) eléggé „gyengére” sikerültek, mivel alkalmazásfüggő volt, hogy a fájlrendszer figyelembe vette-e őket, vagy sem. A FAT fájlrendszer eredetileg csak az utolsó módosítás dátumát tárolta, azt is csak két másodperces felbontással.\\ + + \noindent A Microsoft Windows 95 operációs rendszerben bevezették az úgynevezett LFN-t, azaz a hosszú fájlnév támogatást.\\ + + \noindent Minden egyes könyvtárbejegyzés tárolja a fájl első darabjának helyét (a kezdő klasztert), és a FAT fájlrendszerben a fájl végigolvasásához innen indulva kell végigjárni a FAT táblát. + + \paragraph*{A fragmentáció a FAT fájlrendszerekben} + + \noindent A FAT fájlrendszernek sosem voltak különféle mechanizmusai, eljárásai a fájlok töredezettségének a megakadályozására, illetve kezelésére. A fájltöredezettség azt jelenti, hogy a fájl egyes darabkái egymástól messze található klaszterekbe kerülnek (ez az úgynevezett first-fit allokációs módszer). Így a fájlok beolvasásakor a merevlemez olvasófejének rendkívül sokat kell ide-oda mozognia, ezáltal nagyon lassú lett a fájlok beolvasása, a merevlemez pedig folyamatosan „berregett”.\\ + + \noindent A FAT fájlrendszerhez mellékeltek emiatt egy úgynevezett defragmentáló (töredezettségmentesítő) programot, amellyel „on-demand”, azaz azonnal sorba lehetett rendezni a fájlrendszeren található állományokat. Így könnyen megtörténhetett az, hogy egy akkoriban lassan bootoló 486-os számítógép szinte „szárnyakat kapott” egy egyszerű defragmentálástól.\\ + + \noindent A defragmentálás mindenesetre akkoriban egy rendkívül időigényes és veszélyes folyamat volt. A veszélyesség abban az értelemben nyilvánult meg, hogy egy pillanatnyi áramszünet komoly adatvesztéses károkat okozhatott a fájlrendszerben.\\ + + \paragraph*{A FAT fájlrendszer napjainkban} + + \noindent A FAT fájlrendszer az MS-DOS, a Microsoft Windows 95 és a Microsoft Windows 98 operációs rendszerek natív fájlrendszere. Manapság az MP3 és az MP4 lejátszókon, a flash-drive-okon, a memóriakártyákon és a digitális kamerákon is használnak FAT fájlrendszert, mert kompatibilis szinte minden operációs rendszerrel.\\ + + \noindent A FAT eredeti változatai a nagyobb meghajtók esetében a rendelkezésre álló helyet nagyon rosszul kezelték, éppen ezért hozta létre a Microsoft a FAT fájlrendszer bővített 32-bites változatát, amit FAT 32-nek neveztek el. Az „eredeti merevlemezes” FAT változatra FAT 16-osként szokás hivatkozni, mert az allokációs egységek számát 16 biten tárolja. A FAT fájlrendszernek ezen a két változatán kívül (FAT16, FAT32) létezett még 12 bites változata is, amit FAT 12-nek nevezünk. Utóbbi azonban kizárólag hajlékonylemezes egységeken volt használatban.\\ + + \noindent A FAT fájlrendszer napjainkban elavult fájlrendszernek tekinthető, mert sem naplózási, sem biztonsági jogosultságok tárolására nem alkalmas.\\ + + \paragraph*{NTFS} + + \noindent Az NTFS fájlrendszer (avagy New Technology File System) a Microsoft korábbi FAT fájlrendszerét váltotta le. A Microsoft Windows NT operációs rendszerben jelent meg először.\\ + + \noindent Manapság széles körben elterjedt az NTFS fájlrendszer, ugyanis rengeteg újítás, újdonság és extra funkció érhető el benne, ami az elavult FAT fájlrendszerben nem volt elérhető, és emiatt a FAT fájlrendszer hiányosságaként soroltuk fel az előző pontban. Ilyenek például + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item metaadatok támogatása, + \item fejlettebb adatstruktúrák támogatása, + \item sebesség és a megbízhatóság növekedése, + \item lemezterület optimálisabb felhasználás, + \item rendelkezik hozzáférés-védelmi listával + \item naplózás + \end{itemize} + + \noindent Elterjedése a Microsoft operációs rendszereken kívül akadályozott, mivel az NTFS fájlrendszer pontos speciikációja a Microsoft szabadalma.\\ + + \noindent Az NTFS fájlrendszer 64 bites indexeket használ a klaszterek kiválasztásához, így nem pazarol az amúgy is szűkös hellyel. A 64 bites indexelési módszernek köszönhetően az NTFS fájlrendszernek az elvileg elérhető maximális partíciómérete 16 exabájt (16 EB), ám a gyakorlatban 2 terabájtnál (2 TB) nagyobb partíciókat már nem kezel.\\ + + \noindent Az NTFS fájlrendszer teljesen a Microsoft Windows NT operációs rendszer biztonsági modelljére épül. Pontosabban a DACL (Discretionary Access Control List) és SACL (System Access Control List, magyarul hozzáférési listák) biztonsági megfontolásaira épül, így az NTFS fájlrendszeren belül megadható, hogy melyik felhasználó mikor és mit végezhet egy-egy fájllal, továbbá minden elvégzett művelet visszakövethető benne. Ez a biztonsági modell az, amivel az NTFS fájlrendszer valóban hatalmas előrelépés volt a FAT fájlrendszerhez képest. Az NTFS fájlrendszer mellett szól még az is, hogy egy többfelhasználós környezetben, mint amilyen a Microsoft Windows NT operációs rendszer szerver verziója, feltétlenül szükséges egy ilyenfajta biztonsági modell követése.\\ + + \noindent A FAT fájlrendszerrel ellentétben az NTFS fájlrendszer volt az első olyan Microsoft Windows platformú fájlrendszer, ami natívan (bármiféle „hack” nélkül) támogatta a hosszú fájlneveket.\\ + + \noindent A FAT fájlrendszer legnagyobb hibáját, miszerint a FAT fájlrendszerben nincs semmilyen hibatűrő\footnote{A hibatűrő megoldás alatt azt értjük, hogy ha a nyitott fájlok módosítása, szerkesztése során fellép egy esetleges rendszerhiba, például a számítógép „lefagy”, akkor a fájlrendszer -partíción tárolt adatok nem vállnak inkonzisztenssé.} megoldás, az NTFS fájlrendszer ügyesen megoldotta.\\ + + \noindent Az NTFS fájlrendszer megoldása az lett, hogy vezet egy beépített fájlművelet-végzési nyilvántartást (azaz egy úgynevezett log fájlt). Ebbe a speciális log fájlba minden egyes fájlművelet során egy bejegyzést tesz. Így amikor egy esetleges rendszerhiba következik be (pl. a fentebb említett „lefagyás”), akkor az újrabootolás során a log fájlok alapján azonnal meg lehet állapítani, hogy a rendszerhiba bekövetkezésekor történt-e bármiféle adatvesztés, vagy sem. Amennyiben a log fájlok alapján megállapítható az adatvesztés megtörténte (a log fájlban benne lesz, hogy a fájlmódosító művelet félbemaradt), akkor el kell indítani az úgynevezett CHKDSK (lemezellenőrző) programot. A CHKDSK program a log fájlt felhasználva megpróbálja visszaállítani az eredeti konzisztens állapotot. A log fájl minden bejegyzése két típusú lehet: vagy ismétlő (redo), vagy visszavonó (undo) parancsot tartalmazhat.\\ + + \noindent A log fájl mérete a merevlemeztől függően két és négy megabájt között (2 MB – 4 MB) mozoghat. Ha az NTFS fájlrendszer nem vizsgálná meg mindig, hogy az ismétlő (redo) és a visszavonó (undo) információk szükségesek-e hibajavítás esetére, akkor a log fájl mérete gyorsan megnőne, és így hamar be is telne. Ennek az elkerülése végett az összes módosított adatot lemezre menti az NTFS fájlrendszer, és törli a log fájl tartalmát. Ez a vizsgálat az úgynevezett checkpoint- (határpont-) képzés. A vizsgálat körülbelül minden 4. vagy 5. másodpercben megtörténik. + + \paragraph*{Az NTFS fájlrendszer maximális fájlmérete} + + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Elemek} & \textbf{Határ} \\ \hline \hline + Maximális fájlméret & Elvi megvalósíthatóság: 16 exabájt – 1 kB (264 bájt – 1 kB) + Megvalósított: 16 terabájt – 64 kB (244 bájt – 64 kB) \\ \hline + Maximális kötetméret & Elvi megvalósíthatóság: 264 klaszter – 1 klaszter + Megvalósított: 256 terabájt – 64 kB (azaz 232 klaszter – 1 klaszter) \\ \hline + Fájlok maximális száma kötetenként & 4 294 967 295 (azaz 232 – 1 fájl) \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer maximális kötetmérete} + + \noindent Elméletben a maximális NTFS kötetméret 264 - 1 klaszter (foglalási egység). Ennek ellenére a maximális NTFS kötetméret a Windows XP Professional megvalósításának megfelelően 232 - 1 klaszter.\\ + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Partíció méret} & \textbf{NTFS klaszterméret} \\ \hline \hline + 7 megabájt (MB) – 512 megabájt (MB) & 512 bájt (B) \\ \hline + 513 megabájt (MB) – 1,024 megabájt (MB) & 1 kilobájt (kB) \\ \hline + 1,025 megabájt (MB) – 2 gigabájt (GB) & 2 kilobájt (kB) \\ \hline + 2 gigabájt (GB) – 2 terabájt (TB) & 4 kilobájt (kB) \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer kötetszervezése, felépítése} + + \begin{centering} + \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|c|c|c|c|} \hline + \textbf{NTFS Boot sector} & \makecell{\textbf{MFT} \\ Master File Table} & \textbf{File System Data} & \textbf{Copy of MFT} \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + \end{centering} + + \noindent \renewcommand{\arraystretch}{2} + {\footnotesize + \begin{tabular}{|p{6cm}|p{9cm}|} + \hline + \textbf{Elemek} & \textbf{Leírás} \\ \hline \hline + NTFS Boot Sector & Tartalmazza a BIOS paraméterblokkot, ami információkat tárol a lemez kialakításáról és a fájlrendszer struktúrájáról; a „boot code” is itt tárolódik. \\ \hline + MFT Master File Table & A fájlok eléréséhez szükséges információkat tartalmazza, amelyek az NTFS fájlrendszerű partíción találhatók. \\ \hline + File System Data & Minden más olyan adatot tárol, amelyeket a Master File Table már nem. \\ \hline + Master File Table Copy & Biztonsági mentés a Master File Table-ről, ha az eredetin tárolt adatokhoz nem lehet hozzáférni. \\ \hline + \end{tabular} + } + \renewcommand{\arraystretch}{1}\\ + + \paragraph*{Az NTFS fájlrendszer fizikai szerkezete, lemezkezelése} + + \noindent Az NTFS fájlrendszer a fájlok és a könyvtárak adatai mellett egy sereg egyéb fájlt is használ a lemezkezeléssel összefüggő adatok tárolása végett. Ezekben a fájlokban és más, az NTFS fájlrendszerrel kapcsolatos fájlban, illetve könyvtárban tárolt adatok összességét úgynevezett metaadatnak (metadata) nevezzük. Egy NTFS fájlrendszerbeli partíció formázása során 11 metaadatfájl jön létre. A metaadatfájlok nem láthatóak egyszerűen semmilyen felsorolásban, viszont ha tudjuk, mi az általunk keresett a metaadatfájl neve, akkor kilistáztathatjuk.\\ + + \noindent Az NTFS fájlrendszer legfeljebb 32 000 Unicode karakter hosszúságú elérési útvonalakat támogat, amelyeknek minden komponense (ami egy könyvtár vagy egy fájlnév) legfeljebb 255 Unicode karakter hosszúságú lehet. Bizonyos azonosító neveket a rendszer azonban fenntart a saját használatra. Ennek az az oka, hogy az NTFS fájlrendszer metaadatai szabályos (ámbár rejtett és általában nem hozzáférhető) fájlokban tárolódnak; emiatt a felhasználói adatállományok nem használhatják fel a neveiket. Ezek a rendszerfájlok mindig az NTFS fájlrendszerű kötet gyökerében tárolódnak, és kizárólag a gyökérkönyvtárban vannak fenntartva.\\ + + \subsection*{Ext fájlrendszer} + + \noindent Az „ext” kifejezés a fájlrendszerek neveiben az extended (magyarul kiterjesztett) kifejezést takarja. \\ + + \noindent Az extended fájlrendszer volt az első kifejezetten a UNIX-szerű GNU/LINUX operációs rendszerekhez készített fájlrendszer, amely örökölte az UFS (UNIX File System) fájlrendszer metaadat-szerkezetét, és arra készült, hogy a Minix operációs rendszer fájlrendszerének a hibáit kiküszöbölje.\\ + + \noindent A hibák kiküszöbölése többek között a Minix operációs rendszer fájlrendszer-határainak kiterjesztése, például: + \begin{itemize} + \item a maximális méret, amely a 16 bites offszet miatt csak maximálisan 64 megabájt (64 MB) lehetett, illetve + \item a maximális fájlnévhosszúság, amely csak 14 karakter lehetett. + \end{itemize} + Ennek megoldásához egy virtuális fájlrendszerréteget tettek a Linux-kernelbe\footnote{Az operációs rendszer magja. Ez a rész tartalmazza a hardver eszközöket kezelő programot is.}, mellyel a maximális méret két gigabájtra (2 GB), a fájlnevek hosszúsága pedig 255 karakteresre növekedhetett.\\ + + \noindent Hiányossága volt azonban az, hogy mindezek ellenére nem biztosította a fájlok egyenkénti elérését, és nem rögzítette a fájlok módosításának idejét! + + \subsection*{Ext2 fájlrendszer} + + \noindent Az extended fájlrendszer következő verziója az „ext2” fájlrendszer lett (second extended filesystem – második kiterjesztett fájlrendszer).\\ + + \noindent Az ext2 fájlrendszer, amely a GNU/LINUX operációs rendszereken kívül más rendszereken is megjelent, több Linux disztribúció alapértelmezett fájlrendszere volt, amíg az utódja, az „ext3” fájlrendszer el nem készült.\\ + + \noindent Az ext2 fájlrendszer nagy előnye a többi más fájlrendszerekhez képest, hogy már a tervezésénél készültek a folytatására, továbbfejlesztésére úgy, hogy a még meg nem valósított, azaz nem implementált funkcióknak meghagyták benne a helyet. + + \paragraph*{Az ext2 fájlrendszer adatszerkezete} + + \noindent A szabad területet az ext2 fájlrendszer blokkokra osztja, a blokkokat pedig további csoportokra osztja tovább. \\ + + \noindent Egy-egy fájl – amennyire csak lehet – egy csoportba tartozik, hogy a csökkentse a fájlrendszer szabad területének töredezését, és hogy csökkentse a keresést nagyméretű folytonos elérésű fájlok esetén.\\ + + \noindent Minden csoport tartalmazza a saját leírótábláját és a szuperblokk leírójának másolatát, egy blokktérképet, amely számon tartja, hogy mely fizikai részek foglaltak, és melyek nem.\\ + + \noindent Ezeken kívül tartalmaz még egy úgynevezett \textbf{i-node}-ot\footnote{A UNIX fájlrendszerének megszervezésében használatos, a fájllal kapcsolatos információkat tárolja}, melynek szintén van blokktérképe és leírótáblája. Ezek címeit a csoportleíró tartalmazza. + + \paragraph*{Az i-node-ok használata az ext2 fájlrendszerben} + + Minden egyes fájlt és könyvtárat egy-egy i-node ír le (\ref{ref:ex2inode}. ábra).\\ + Ez tartalmazza a fájlok tulajdonságait: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item hozzáférési jogok, + \item engedélyek, + \item fájlméret és + \item a fájl helye a merevlemezen + \end{itemize} + + \noindent Az i-node struktúra 15 mutatót tartalmaz, melyből 12 fix, és a 13-astól kezdve pedig újabb i-node-okra mutathat, amennyiben a fájl nem fér bele egy i-node-ba. + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/ext2inode.png} + \caption{i-node szerkezete} + \label{ref:ex2inode} + \end{figure} + + \paragraph*{A könyvtárak az ext2 fájlrendszerben} + + Minden egyes könyvtár további könyvtárbejegyzéseket tartalmazhat. Ezek a bejegyzések azonosítják az egyes fájlokat az egyes i-node-okhoz. + Tartalmazhatják az + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item i-node számát, + \item a fájlnév hosszúságát és + \item a fájl nevét. + \end{itemize} + + \noindent Egy megadott keresés során a kereső ezeken az adatokon megy végig, ezeket az adatokat vizsgálja meg. A gyökérkönyvtár mindig az i-node második eleme, így a rendszer a felcsatlakoztatás (mount) során rögtön megtalálja. Az alkönyvtárak a fájlokhoz hasonlóan szerepelhetnek a táblában, egy saját i-node számmal és egy saját névvel. A hivatkozások pedig ugyancsak egy i-node azonosítóhoz rendelnek több nevet, így végül mindegyik hivatkozás ugyanarra a fizikai helyre mutat.\\ + + \noindent Az aktuális munkakönyvtár [. (a pont)] és a szülő munkakönyvtár [.. (a dupla pont)] ugyanígy tárolódik a fájlrendszeren belül, vagyis minden egyes könyvtár tartalmazza a saját és a szülőjének a nevét és az ő azonosítóját. Ezek a könyvtárak létrehozásakor automatikusan létrejönnek, és csak a könyvtárral együtt törölhetők! + + \paragraph*{Az ext2 fájlrendszer határai} + + \noindent A fájl méretének és a meghajtó méretének határait a blokkok mérete határozza meg az ext2 fájlrendszerben, amelyet az adott architektúra lapmérete határoz meg a legfőképpen. Ezek a határok a fájlrendszer felépítése során rögzülnek, és még számos felhasználói programnak is lehetnek határai [például a két gigabájtnál (2GB) nagyobb fájlok esetében].\\ + + \noindent Az ext2 fájlrendszer maga nem tartalmazza a lehetőséget az adatok tömörített tárolására. + + \subsection*{Ext3 fájlrendszer} + + \noindent Az ext3 fájlrendszer (third extended filesystem – harmadik kiterjesztett fájlrendszer) az ext2 fájlrendszer utódja. + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az ext2 fájlrendszerhez képest naplózást is tartalmaz. + \item Visszafelé irányú kompatibilitása lehetővé teszi, hogy bármiféle adatmentés nélkül átalakítható legyen az ext2 fájlrendszerből. + \item Tesztek azt mutatják, hogy a hasonló fájlrendszerekhez képest kevesebb processzor- (CPU-) erőforrást használ, és egyszerűsége. + \item A nagy felhasználói bázisa miatt biztonságosabb. + \item A naplózáson kívül az ext3 fájlrendszer lehetővé tette a kikapcsolás nélküli növelés és a sok fájlt tartalmazó könyvtárak H-fával való indexelését. + \item Az ext2 fájlrendszerre írt diagnosztikai és javító eszközök kisebb módosítással használhatók az ext3 fájlrendszerrel. + \end{itemize} + + \noindent Ezek nélkül az ext3 fájlrendszer teljesen azonos lett volna az ext2 fájlrendszerrel.\\ + + \noindent \textbf{Az ext3 fájlrendszer hátrányai\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Az ext2 fájlrendszerrel való visszafelé kompatibilitás miatt számos modern fájlrendszerre jellemző tulajdonság kimaradt az ext3 fájlrendszerből. + \item Az ext3 fájlrendszer nem ellenőrizhető addig, amíg az csatlakoztatva van az operációs rendszerhez. + \item Törlésnél a fájlrendszer aktívan távolítja el az i-node -okban tárolt adatokat, főleg biztonsági okokból, ezért nincs sok lehetőség a fájlok helyreállítására. + \item A tömörítést, mint az ext2 fájlrendszer esetén, csak egy kiegészítő program biztosíthatja. + \item Nincs támogatás egy aktuális állapotkép készítésére, mely időnként mentené a fájlrendszer állapotát. + \item Nem számol ellenőrző összegeket a naplóbejegyzésekhez. + \end{itemize} + + \subsection*{ReiserFS fájlrendszer\\} + + \noindent A ReiserFS fájlrendszer lehetővé teszi egy blokkos eszközön (block device) változó méretű fájlok tárolását és könyvtárstruktúrába rendezését.\\ + + \noindent A ReiserFS fájlrendszer egy olyan fájlrendszer, amely csak és kizárólag a GNU/LINUX operációs rendszer alatt használható jelenleg korlátozás nélkül. + + \paragraph*{A ReiserFS előnyei} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item Jobb lemezterület-kihasználás. + \item Jobb lemezhozzáférési teljesítmény. + \item Gyors visszaállítás rendszerösszeomlás után. + \item Megbízhatóság az adatnaplózás használatával. + \end{itemize} + + \paragraph*{A ReiserFS fájlrendszer jellemzői\\} + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item A ReiserFS fájlrendszer a metaadatokat, sőt a négy kilobájtnál nem rövidebb fájltartalmak kivételével mindent egyetlen B+ fában tárol.\\ + \item Több fájl utolsó blokkjait egyetlen lemezblokkban is képes tárolni.\\ + \item A ReiserFS fájlrendszer – a többi UNIX fájlrendszerhez hasonlóan – egyszerűen az i-node-okat a könyvtárstruktúrán kívül tárolja.\\ + \item Hiba esetén, ha az lemezellenőrzés a B+ fában hibát érzékel, azt a jelenlegi ReiserFS fájlrendszer implementáció csak a teljes B+ fa újraépítésével tudja javítani.\\ + \end{itemize} + + \paragraph*{A ReiserFS fájlrendszer összehasonlítása más fájlrendszerekkel\\} + + \noindent A ReiserFS fájlrendszer előnyei az ext2 és egyéb korábbi fájlrendszerekhez képest: + + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item nagyobb maximális fájlméret és fájlrendszer méret + \item a fájlrendszer mérete lecsatolás nélkül is növelhető (ezt az ext3 fájlrendszer is tudja) + \item journaling, azaz naplózás (az ext3 és ext4 fájlrendszerben már van naplózás) + \item nagy könyvtárak gyorsabb elérése + \item nem kell az i-node-ok számát létrehozáskor megadni + \item a négy kilobájtnál kisebb fájlok, fájlblokkok pazarlásmentes tárolása (tail packing) + \end{itemize} + + \noindent A ReiserFS fájlrendszer hátrányai az ext2 és egyéb korábbi fájlrendszerekhez képest: + \begin{itemize}[topsep=8pt,itemsep=4pt,partopsep=4pt, parsep=4pt] + \item globálisan lockolja (zárolja) a Linux-kernelt + \item hardverhiba esetén nagymértékű adatvesztés történhet + \end{itemize} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/adaptivfa.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/adaptivfa.png new file mode 100644 index 0000000..f9576e6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/adaptivfa.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/alapsav.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/alapsav.png new file mode 100644 index 0000000..99af2a0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/alapsav.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/aloha_csma.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/aloha_csma.jpg new file mode 100644 index 0000000..f1271c2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/aloha_csma.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_key.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_key.png new file mode 100644 index 0000000..25e2ce1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_key.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_mod.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_mod.png new file mode 100644 index 0000000..7f1cbb7 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/amplitudo_mod.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/bitbeszuras.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/bitbeszuras.png new file mode 100644 index 0000000..de20306 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/bitbeszuras.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csoportos_bithiba.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csoportos_bithiba.png new file mode 100644 index 0000000..e816547 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csoportos_bithiba.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csuszoablak.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csuszoablak.png new file mode 100644 index 0000000..3152b6e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/csuszoablak.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/diagram.drawio new file mode 100644 index 0000000..db28f6b --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_aloha.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_aloha.png new file mode 100644 index 0000000..d50e7cf Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_aloha.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_bithiba.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_bithiba.png new file mode 100644 index 0000000..c77a889 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/egyszeru_bithiba.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/elektromagneses.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/elektromagneses.png new file mode 100644 index 0000000..f55a222 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/elektromagneses.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_key.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_key.png new file mode 100644 index 0000000..3dc5694 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_key.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_mod.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_mod.png new file mode 100644 index 0000000..c731a10 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/fazis_mod.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_key.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_key.png new file mode 100644 index 0000000..ff3b00f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_key.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_mod.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_mod.png new file mode 100644 index 0000000..0fd23d1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/frekvencia_mod.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming1.png new file mode 100644 index 0000000..e800a5c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming2.png new file mode 100644 index 0000000..3a5e406 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming3.png new file mode 100644 index 0000000..e33be16 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hamming3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hdlc_keret.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hdlc_keret.png new file mode 100644 index 0000000..8f4b794 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/hdlc_keret.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_fejresz.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_fejresz.png new file mode 100644 index 0000000..2dad2fc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_fejresz.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_spec_cimek.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_spec_cimek.png new file mode 100644 index 0000000..b13a7b4 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ip_spec_cimek.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ipv6.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ipv6.png new file mode 100644 index 0000000..2122e1e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ipv6.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterbeszuras.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterbeszuras.png new file mode 100644 index 0000000..6b6eec0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterbeszuras.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterszamlalas.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterszamlalas.png new file mode 100644 index 0000000..e015917 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/karakterszamlalas.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/paritasbit.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/paritasbit.png new file mode 100644 index 0000000..0eaf59c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/paritasbit.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp.png new file mode 100644 index 0000000..ab688b8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp_keret.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp_keret.png new file mode 100644 index 0000000..8ed35db Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/ppp_keret.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/rpc.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/rpc.png new file mode 100644 index 0000000..8ef2233 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/rpc.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szelessav.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szelessav.png new file mode 100644 index 0000000..fd3266b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szelessav.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szinkronizacio.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szinkronizacio.png new file mode 100644 index 0000000..3cc6496 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/szinkronizacio.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/tcp_fejlec.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/tcp_fejlec.png new file mode 100644 index 0000000..9fc1c0b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/img/tcp_fejlec.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.pdf new file mode 100644 index 0000000..ada0ba3 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.tex new file mode 100644 index 0000000..d37443d --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/16.Számítógépes hálózatok és Internet eszközök/tetel16.tex @@ -0,0 +1,1584 @@ +\documentclass[12pt]{article} + +\usepackage{caption} +\usepackage{subcaption} +\usepackage{multirow} +\usepackage[hungarian]{babel} +\usepackage{listings} +\usepackage{hhline} +\usepackage{graphicx} +\usepackage{float} +\usepackage{fancyhdr} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{makecell} +\usepackage[utf8]{inputenc} +\usepackage[thinlines]{easytable} +\usepackage[table,xcdraw]{xcolor} +\usepackage[normalem]{ulem} +\usepackage[a4paper, margin=1in]{geometry} +\usepackage{enumitem} +\usepackage{xcolor} + + \geometry{ + a4paper, + total={210mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\DeclareCaptionType{mycapequ}[][List of equations] +\captionsetup[mycapequ]{labelformat=empty} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{16. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + {\Large\bfseries\noindent 16. Számítógépes hálózatok és Internet eszközök} \\ + + \section*{Hálózatok modelljei} + + \subsubsection*{TCP/IP modell\\} + + \textbf{T}ransmission \textbf{C}ontrol \textbf{P}rotocol/\textbf{I}nternet \textbf{P}rotocol. Röviden TCP/IP. A TCP/IP modell 1982-ben lett az amerikai hadászati célú számítógépes hálózatok standardja. 1985-től népszerűsítették kereskedelmi használatra.\\ + + \noindent \textbf{Négy} réteget különböztet meg, ezek fentről lefelé a következők:\\ + \begin{center} + \renewcommand{\arraystretch}{2} + $\begin{array}{|l|c|} + \hline + 4 & \text{Alkalmazási réteg} \\ \hline + 3 & \text{Szállítói réteg} \\ \hline + 2 & \text{Hálózati réteg} \\ \hline + 1 & \text{Kapcsolati réteg}\\ \hline + \end{array}$ + \renewcommand{\arraystretch}{1} + \end{center} + + \subsubsection*{OSI modell} + + Az \textbf{O}pen \textbf{S}ystems \textbf{I}nterconnection Reference Model, magyarul a \emph{Nyílt rendszerek összekapcsolása referenciamodellje} (OSI-modell vagy OSI-referenciamodell) egy rétegekbe szervezett rendszer absztrakt leírása, amely a számítógépek kommunikációjához szükséges hálózati protokollt határozza meg, s amelyet az \emph{Open Systems Interconnection} javaslatban foglalt össze.\\\\ + Az OSI modellje a különböző protokollok által nyújtott funkciókat egymásra épülő rétegekbe sorolja. Minden réteg csak és kizárólag az alsóbb rétegek által nyújtott funkciókra támaszkodhat, és az általa megvalósított funkciókat pedig csak felette lévő réteg számára biztosíthat.\\ + + \noindent \textbf{Hét} réteget különböztet meg, ezek fentről lefelé a következők: + \begin{center} + \renewcommand{\arraystretch}{2} + $\begin{array}{|l|c|c|} + \hline + 7 & \makecell{\textbf{Alkalmazási réteg}\\\text{\small Alkalmazás szint hálózati eljárások}} & \text{adat} \\ \hline + 6 & \makecell{\textbf{Megjelenítési réteg}\\\text{\small Adat megjelenítés és kódolás/dekódolás}} & \text{adat} \\ \hline + 5 & \makecell{\textbf{Munkamenet (viszony) réteg}\\\text{\small Csomópontok közötti kommunikáció}} & \text{adat} \\ \hline + 4 & \makecell{\textbf{Szállítási réteg}\\\text{\small Végpontok közötti kapcsolat, megbízhatóság}} & \text{szegmensek} \\ \hline + 3 & \makecell{\textbf{Hálózati réteg}\\\text{\small Útvonalválasztás és IP (logikai címzés)}} & \text{csomagok} \\ \hline + 2 & \makecell{\textbf{Adatkapcsolati réteg}\\\text{\small MAC és LLC (fizikai címzés)}} & \text{keretek} \\ \hline + 1 & \makecell{\textbf{Fizikai réteg}\\\text{\small Médium, jelzések, bináris átvitel}} & \text{bitek} \\ \hline + \end{array}$ + \renewcommand{\arraystretch}{1} + \end{center} +\newpage + \section*{1. Fizikai réteg} + + A fizikai réteg feladata a bitek továbbítása a kommunikációs csatornán keresztül: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item a \emph{\textbf{\small korrekt bit átvitel}} biztosítása, + \item a \emph{\textbf{\small kapcsolat kezelése}}, és + \item az \emph{\textbf{\small átvitelhez szükséges idő} és \textbf{\small egyéb részletek tisztázása}}\\ + \end{itemize} + + \noindent Ez a réteg határoz meg minden, az eszközökkel kapcsolatos fizikai és elektromos specifikációt, beleértve az + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{érintkezők kiosztását}, a + \item használatos \emph{feszültség szinteket}, és a + \item \emph{kábel specifikációkat}. + \end{itemize} + + \subsection*{Adatátvitel\\} + + \paragraph*{Vezetékes} + + Adatátvitel vezeték esetén valamilyen fizikai jellemző változtatásával lehetséges (pl.: feszültség, áramerősség). Ezt egy $g(t)$ periodikus függvénnyel jellemezhetjük. + A 19. század elején Jean-Baptiste Fourier francia matematikus bebizonyította, hogy bármely $T$ periódusidejű, periodikus $g(t)$ függvény előállítható szinuszos és koszinuszos tagok (általában végtelen) összegeként: + \begin{mycapequ}[!ht] + \label{ref:fourier} + \begin{equation} + g(t) = \frac{1}{2}c+ \sum\limits_{n=1}^\infty a_nsin(2\pi\ n\ f t) + \sum\limits_{n=1}^\infty b_ncos(2\pi\ n\ f t) + \end{equation} + \end{mycapequ} + + \noindent ahol $f=\frac{1}{T}$ az alapfrekvencia, $a_n$ és $b_n$ pedig az $n$-edik harmonikus tag (azaz felharmonikus) szinuszos, illetve koszinuszos amplitúdója. Ezt a felbontást Fourier-sornak nevezzük. A Fourier-sor alapján az eredeti függvény visszaállítható, azaz a $T$ periódusidő és az amplitúdók ismeretében az eredeti időfüggvény meghatározható a (1) összeg alapján. Fontos megjegyezni, hogy a fenti összefüggés feltételezi, hogy a teljes jelalak folyamatosan ismétlődik.\\ + + \noindent Ahhoz, hogy az $a_n$ és $b_n$ valamint $c$ értékét megkaphassuk, azaz, hogy megtudjuk, hogy a kívánt jelalak előállításához az egyes felharmonikusokból mekkora amplitúdóra van szükség, a fenti képletből kiindulva eljuthatunk a következő három egyenletet kapjuk. + + \[ + a_n = \frac{2}{T}\int_{0}^{T}g(t)sin(2\pi n ft)dt, \quad b_n = \frac{2}{T}\int_{0}^{T}g(t)cos(2\pi n ft)dt, \quad c = \frac{2}{T}\int_{0}^{T}g(t) dt + \] +\newpage + \paragraph*{Vezeték nélküli} + + Vezeték nélküli adatátvitelre sok helyen használnak elektormágneses hullámokat. + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Rádió + \item Mikrohullám + \item Infravörös + \item Látható + \item Ultraibolya + \item Röntgen sugarak + \item Gamma sugarak + \end{itemize} + + \noindent A hullámoknak van frekvenciája és hullámhossza. + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Frekvencia: A hullám másodpercenkénti rezgésszáma. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\triangleright$}}$} + \item Jele: $f$, + \item Mértékegysége: Hz (Hertz) + \end{itemize} + \item Hullámhossz: két egymást követő hullámcsúcs (v. hullámvölgy) közötti távolság. Jele: $\lambda$ (\emph{lambda}) + \end{itemize} + \begin{center} + $\lambda f = c$ + \end{center} + ahol $c$ a fénysebesség, azaz az elektromágneses hullámok terjedési sebessége vákuumban. + + \paragraph{Szimbólumok} + + Digitális hálózatokat az adatátviteli sebességükkel: az időegység alatt átvitt bitek számával jellemezhetjük. Ezt célszerű \emph{bit/s}-ban mérni. Az átvitelt jellemezhetjük a felhasznált jel értékében egy másodperc alatt bekövetkezett változások számával is, amit jelzési sebességnek, vagy közismert néven \textbf{baud}-nak nevezünk. + \[ + 1\ \text{baud} = log_{2}P[bit/s] + \] + + \noindent Bitek helyett szimbólumokat küldünk át, ahol $P$ a kódolásban használt jelszintek száma.\\ + (Pl. 4 szimbólum: A - 00, B - 01, C - 10, D - 11) + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Baud: szimbólum/másodperc + \item Adatráta: bit/másodperc\\ + \end{itemize} + + \noindent Például olyan átvitelnél ahol ezt kétállapotú jelekkel valósítjuk meg, ott a $baud$ és a $bit/s$ azonos számértéket adnak, de ha a jelet négy szint felhasználásával visszük át, ott a $baud$ számértéke már csak fele a $bit/s$-ban megadott valós adatátviteli sebességnek. Ezért mindig gondosan, ne egymás szinonimájaként használjuk a baud és bit/s mértékegységeket! + + \paragraph{Szinkronizáció\\} + + Kérdés: Mikor kell szignálokat mérni, illetve mikor kezdődik egy szimbólum? \\ + Ehhez szinkronizációra van szükséges a felek között. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{Explicit órajel}: Párhuzamos átviteli csatornák használata, szinkronizált adatok, rövid átvitel esetén alkalmas. + \item \emph{Kritikus időpontok}: Szinkronizáljunk például egy szimbólum vagy blokk kezdetén, a kritikus időpontokon kívül szabadon futnak az órák, feltesszük, hogy az órák rövid ideig szinkronban futnak. + \item \emph{Szimbólum kódok}: Önütemező jel–külön órajel szinkronizáció nélkül dekódolható jel, a szignál tartalmazza a szinkronizáláshoz szükséges információt. + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/szinkronizacio.png} + \caption{Szinkronizáció szükségessége} + \end{figure} + + \subsection*{Átviteli közegek} + + \paragraph{Vezetékes} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{Mágneses adathordozók} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Nagy sávszélesség + \item Nagy késletetés + \end{itemize} + \item \emph{Sodort érpár} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Főként távbeszélőrendszerekben használatos + \item Dupla rézhuzal + \item Analóg és digitális jelátvitel + \end{itemize} + \item \emph{Koaxiális kábel} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Nagyobb sebesség és távolság érhető el, mint a sodorttal + \item Analóg és digitális jelátvitel + \end{itemize} + \item \emph{Fényvezető szálak (üvegszál)} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Fényforrás, átviteli közeg és detektor + \item Fényimpulzus 1-es bit, nincs fényimpulzus 0-s bit + \end{itemize} + \end{itemize} + + \paragraph{Vezeték nélküli} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{Rádiófrekvenciás} átvitel + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Egyszerűen előállíthatóak + \item Nagy távolságú átvitel (jel erősítés lehetséges) + \item Kültéri és beltéri alkalmazhatóság \\ + \item Időjárás befolyásolhatja + \item Lehallgathatóság + \item Frekvenciakiosztás állami hatáskör + \end{itemize} + \item \emph{Mikrohullámú} átvitel + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Egyenes vonal mentén terjed + \item Elhalkulás problémája + \item Olcsó + \end{itemize} + \item \emph{Műholdas átvitel} + \begin{itemize} + \item 30.000 km felett keringő műholdak + \item Eltérő frekvenciájú továbbítás, mint fogadás \\ + \item Időjárás függő + \item Lehallgatható + \item Nagy jel késés (a nagy távolság miatt) + \end{itemize} + \item \emph{Infravörös} és \emph{milliméteres hullámú} átvitel + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Kistávolságú átvitel esetén + \item Szilárd tárgyakon nem hatol át + \end{itemize} + \item \emph{Látható fényhullámú} átvitel + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Lézerforrás + fényérzékelő + \item Nagy sávszélesség, + \item Nem engedélyköteles + \item Biztonságos (nehezen lehallgatható) + \item Olcsó \\ + \item Időjárás erősen befolyásolhatja + \end{itemize} + \item \emph{Bluetooth} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Kis hatótávolság (méterek), + \item Adatcseréhez használható, + \item Alacsony energiaszükséglet + \end{itemize} + \end{itemize} + + \subsection*{Jelátvitel\\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{Alapsáv}: A digitális jel direkt árammá vagy feszültséggé alakul. A jel minden frekvencián átvitelre kerül. Átviteli korlátok + \begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{img/alapsav.png} + \caption{Digitális alapsávú átvitel struktúrája} + \end{figure} + \item \textbf{Szélessáv}: Széles frekvencia tartományban történik az átvitel. + \begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{img/szelessav.png} + \caption{Digitális szélessávú átvitel struktúrája} + \end{figure} + \end{itemize} + \noindent Modulációs eljárást alkalmazunk akkor, mikor a rendelkezésünkre álló átviteli közegen az átvinni kívánt információt hordozó jel nem képes, vagy csak nagy csillapítással, torzulással képes eljuttatni az egyik pontból egy másikba. Ekkor választunk egy olyan jelet (\emph{vivőjelet}), amelyet a rendelkezésre álló átviteli közeg az elvárásainknak megfelelően képes továbbítani.\\ + + \noindent A modulációs eljárásokat megkülönböztetjük aszerint, hogy a vivő jel mely jellemzője fogja az információt eljuttatni egyik ponttól a másikig. Az információ továbbításához a vivő jel valamely jellemzőjét (esetleg jellemzőit) az információt hordozó jellel (\emph{moduláló jellel}) megváltoztatjuk. A fenti eljárást \textbf{modulációnak} nevezzük. A modulált jelet (vivőjel és moduláló jel segítségével előállított jel) eljuttatjuk az átviteli közegen keresztül a célpontig, majd leválasztjuk az információt hordozó jelet. A leválasztást nevezzük \textbf{demoduláció}nak. + + \section*{Modulációk} + + Egy szinuszos rezgés ábrázolása $T$ periódus idejű függvényre + \[ + g(t)=Asin(2\pi f t + \varphi),\ ahol\ A\ \text{az amplitúdó}, f = \frac{1}{T}\ \text{a frekvencia és}\ \varphi\ \text{a fáziseltolás}. + \] + A jel modulálására az alábbi lehetőségeket használhatjuk. + + \paragraph*{Amplitúdó moduláció} + + Az $s(t)$ szignált a szinuszgörbe amplitúdójaként kódoljuk, azaz: + \begin{align*} + f_A(t) = s(t) \cdot sin(2\pi f t + \varphi) + \end{align*} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Analóg szignál: amplitúdómoduláció + \item Digitális szignál: amplitúdó keying\\ + (szignál erőssége egy diszkrét halmaz értékeinek megfelelően változik) + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/amplitudo_mod.png} + \caption{Amplitúdó moduláció} + \end{figure} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/amplitudo_key.png} + \caption{Amplitúdó keying} + \end{figure} + + \paragraph*{Frekvencia moduláció} + + Az $s(t)$ szignált a szinuszgörbe frekvenciájában kódoljuk, azaz: + \begin{align*} + f_F(t) = a \cdot sin(2\pi s(t) t + \varphi) + \end{align*} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Analóg szignál: frekvenciamoduláció + \item Digitális szignál: frekvencia-eltolás keying\\ + (például egy diszkrét halmaz szimbólumaihoz különböző frekvenciák hozzárendelésével) + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/frekvencia_mod.png} + \caption{Frekvencia moduláció} + \end{figure} + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/frekvencia_key.png} + \caption{Frekvencia keying} + \end{figure} + + \paragraph*{Fázis moduláció} + + Az $s(t)$ szignált a szinuszgörbe fázisában kódoljuk, azaz: + \begin{align*} + f_P(t) = a \cdot sin(2\pi f t + s(t)) + \end{align*} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Analóg szignál: fázis moduláció (nem igazán használják) + \item Digitális szignál: fázis-eltolás keying\\ + (például egy diszkrét halmaz szimbólumaihoz különböző fázisok hozzárendelésével) + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/fazis_mod.png} + \caption{Fázis moduláció} + \end{figure} + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/fazis_key.png} + \caption{Fázis-eltolás keying} + \end{figure} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Digitális és analóg jelek összehasonlítása: \\ + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Digitális átvitel: Diszkrét szignálok véges halmazát használja.\\ + például: feszültség vagy áramerősség értékek.\\ + \item Analóg átvitel: Szignálok folytonos halmazát használja.\\ + például: feszültség vagy áramerősség a vezetékben.\\ + \end{itemize} + \end{itemize} + + \noindent Digitális esetében lehetőség van a vételpontosság helyreállítására illetve az eredeti jel helyreállítására, míg az analógnál a fellépő hibák önmagukat erősíthetik. + +\newpage + \section*{2. Adatkapcsolati réteg} + + Az adatkapcsolati réteg feladata jól definiált szolgálati interfész biztosítása a hálózati rétegnek, melynek három fázisa van: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{nyugtázatlan összeköttetés alapú} szolgálat + \item \emph{nyugtázott összeköttetés nélküli} szolgálat + \item \emph{nyugtázott összeköttetés alapú} szolgálat + \end{itemize} + Továbbá az átviteli hibák kezelése és az adatforgalom szabályozása (elárasztás elkerülése). + + \subsection*{Keretképzés\\} + A fizikai réteg nem garantál hibamentességet, az adatkapcsolati réteg feladata a hibajelzés, illetve a szükség szerint javítás. \\ + + \noindent Erre ad megoldást a keretekre tördelése a bitfolyamnak, és ellenőrző összegek számítása.\\ + A keretezés nem egyszerű feladat, mivel megbízható időzítésre nem nagyon van lehetőség.\\ + + \noindent Négy lehetséges módszer: + \begin{enumerate} + \item \emph{\textbf{Karakterszámlálás}} \\\\ + A keretben lévő karakterek számát a keret fejlécében adjuk meg. Így a vevő adatkapcsolati rétege tudni fogja a keret végét. Probléma: nagyon érzékeny a hibára a módszer. + \begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{img/karakterszamlalas.png} + \caption{Karakterszámlálás} + \end{figure} + + \item \emph{\textbf{Kezdő és végkarakterek karakterbeszúrással}} \\\\ + Különleges bájtokat helyezünk el a keret elejének és végének jelzésére, aminek a neve jelző bájt (flagbyte). Az adatfolyamban szereplő speciális bájtokhoz ESC bájtot használnak. + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/karakterbeszuras.png} + \caption{Kezdő és végkarakterek karakterbeszúrással} + \end{figure} + \item \emph{\textbf{Kezdő és végjelek bitbeszúrása}} \\\\ + Minden keret egy speciális bitmintával kezdődik (flagbájt, 01111110) és minden egymást követő 5 hosszú folytonos 1-es bit sorozat után beszúr egy 0-át. + \begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{img/bitbeszuras.png} + \caption{Kezdő és végjelek bitbeszúrásal} + \end{figure} + \item \emph{\textbf{Fizikai rétegbeli kódolás-sértés}} \\\\ + Olyan hálózatokban használható, ahol a fizikai rétegbeli kódolás redundanciát tartalmaz. + \end{enumerate} + + \subsection*{Hibakezelés} + + Hibakezelés szempontjából a következő két esetet kell vizsgálnunk. A keretek megérkeztek-e a célállomás hálózati rétegéhez, illetve helyes sorrendben érkeztek-e meg. Ehhez valamilyen visszacsatolás szükséges a vevő és az adó között. (például nyugták). \\ + + \noindent Időkorlátokat vezetünk be az egyes lépésekhez. Hiba estén a csomagot újraküldjük. Többszörös vétel lehet, amin segíthet a sorszámok használata.\\ + + \noindent Az adatkapcsolati réteg feladata a hibakezelés szempontjából, hogy az időzítőket és számlálókat úgy kezelje, hogy biztosítani tudja a keretek pontosan egyszeri (nem több és nem kevesebb) megérkezését a célállomás hálózati rétegéhez. + + \subsubsection*{Bithibák} + + \begin{itemize}[leftmargin=5.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\emph{Egyszerű bithiba}} \\\\ + Az adategység 1 bitje nulláról egyre avagy egyről nullára változik. + \begin{figure}[H] + \centering + \includegraphics[width=0.2\textwidth]{img/egyszeru_bithiba.png} + \caption{Egyszerű bithiba} + \end{figure} + \item \textbf{\emph{Csoportos bithiba}} \\\\ + Egy olyan folytonos szimbólum sorozatot, amelynek az első és utolsó szimbóluma hibás, és nem létezik ezen két szimbólummal határolt részsorozatban olyan $m$ hosszú részsorozat, amelyet helyesen fogadtunk, $m$ hosszú csoportos bithibának nevezünk. + + \begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{img/csoportos_bithiba.png} + \caption{Egyszerű bithiba} + \end{figure} + + \end{itemize} + + \subsection*{Hiba jelzés és javítás\\} + + Kétféle hibakezelési stratégia létezik: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Hibajelző (redundáns információ mellékelése) + \item Hibajavító kódok (adatok közé iktatott redundancia). + \end{itemize} + + {\footnotesize \noindent \emph{Megjegyzés}: Megbízható csatornákon a hibajelzés olcsóbb. (csomagot inkább újraküldjük). A kevésbé megbízható csatornákon a hibajavításos módszer célszerűbb.} + + \paragraph*{Hamming-távolság, Hamming-korlát \\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Küldendő keret $m$ bitet tartalmaz. + \item Redundáns bitek száma $r$. + \item Az elküldött keret: $n = m+r$ bit. + \end{itemize} + + \paragraph*{Hamming-távolság\\} + + Az olyan bitpozíciók számát, amelyeken a két kódszóban különböző bitek állnak, a két kódszó \emph{Hamming távolságának} nevezzük. Jelölés: $d(x,y)$\\ + + \noindent Legyen $S$ az egyenlő hosszú bitszavak halmaza. $S$ Hamming-távolsága: + \begin{align*} + d(S) := \min_{x,y, \in S \ \land \ x \neq y} d(x,y) + \end{align*} + + \noindent \textbf{d(S) = 1} esetén:\\ + + \noindent Nincs hibafelismerés, ugyanis megengedett kódszóból 1 bit megváltoztatásával megengedett kódszó áll elő. + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/hamming1.png} + \caption{Kód Hamming-távolsága = 1} + \end{figure} +\newpage + \noindent \textbf{d(S) = 2} esetén:\\ + + \noindent Ha az $x$ kódszóhoz létezik olyan $v$ nem megengedett kódszó, amelyre $d(u,x)=1$, akkor hiba történt. Ha $x$ és $y$ megengedett kódszavak (távolságuk minimális = 2), akkor a következő összefüggésnek teljesülnie kell: + + \begin{align*} + 2 = d(x,y) \leq d(x,v)+d(v,y) + \end{align*} + + \noindent Azaz egy bithiba felismerhető, de nem javítható. + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/hamming2.png} + \caption{Kód Hamming-távolsága = 2} + \end{figure} + + \noindent \textbf{d(S) = 3} esetén:\\ + + \noindent Ekkor minden $u$, melyre $d(x,u)=1$ és $d(u,y) > 1$ nem megengedett.\\\\ + Ekkor három lehetőség áll fent: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item x került átvitelre és 1 bit hibával érkezett + \item y került átvitelre és 2 bit hibával érkezett + \item valami más került átvitelre és legalább 2 bit hibával érkezett + \end{itemize} + De valószínűbb, hogy $x$ került átvitelre, tehát ez egy 1 bit hiba javító, 2 bit hiba felismerő kód. + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/hamming3.png} + \caption{Kód Hamming-távolsága = 3} + \end{figure} + + \paragraph*{Hamming-korlát\\} + + \noindent$ C \subseteq \{0,1\}^n$ és $d(C) = k$. Ekkor a kódszavak $\frac{k-1}{2}$ sugarú környezeteiben található bitszavak egymással diszjunkt halmazainak uniója legfeljebb az $n$-hosszú bitszavak halmazát adhatja ki.\\ + + \noindent Formálisan: + \[ + |C|\sum_{i=0}^{\lfloor\frac{k-1}{2}\rfloor}\dbinom{n}{i} \leq 2^n + \] + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \emph{Hibafelismerés}: \\\\ + \textbf{$d$ bit hiba felismeréséhez} a keretek halmazában legalább $\textbf{d+1}$ Hamming távolság szükséges. + + \item \emph{Hibajavítás}: \\\\ + \textbf{$d$ bit hiba javításához} a megengedett keretek halmazában legalább $\textbf{2d+1}$ Hamming távolság szükséges. + + \item \emph{Kód rátája}: \\\\ + $R_S = \ddfrac{log_2|S|}{n}$ a kód rátája ($S \subseteq \{0,1\}^n$) - hatékonyságot karakterizálja + + \item \emph{Kód távolsága}: \\\\ + $\delta_S = \ddfrac{d(S)}{n}$ a kód távolsága ($S \subseteq \{0,1\}^n$) - hibakezelést karakterizálja + \end{itemize} + A jó kódnak a rátája és a távolsága is nagy. + + \paragraph*{Paritásbit\\} + + A paritásbit olyan bit, melyet a kódszóban lévő egyesek száma alapján választunk. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small Odd Parity} (páratlan paritás): Az 1-esek száma páratlan. A kódszóban lévő 1-esek számát 1 vagy 0 hozzáadásával \emph{páratlanra egészítjük ki}. + \item \textbf{\small Even Parity} (páros paritás): Az 1-esek száma páros. A kódszóban lévő 1-esek számát 1 vagy 0 hozzáadásával \emph{párosra egészítjük ki}. + \end{itemize} + Egy paritást használó módszer az ún. Hamming módszer: + \begin{itemize} + \item A biteket 1-től sorszámozzuk balról, jobbra. + \item Minden kettő-hatvány ($2^{i}$) helyen paritásbit van. + \item Az egyes paritásbitek nem az összes bitet "ellenőrzik". + \item A paritásbit ellenőrzi a teljes kódszó $i.$ bitjét, ha az $i$ kettes számrendszerbeli alakjában szerepel a $2^{i}$ helyiérték.\\ + \end{itemize} + + \noindent Például: a 6. bitet a 4-es és 2-es paritásbit ellenőrzi.\\ + + \noindent A csoportok a következőképp alakulnak: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item 1. bit: Minden első egyhosszú bitsorozat az első bittől kezdve (tehát: 1,3,5,7,...) + \item 2. bit: Minden első kéthosszú bitsorozat a második bittől kezdve (tehát: 2-3,6-7,10-11) + \item 4. bit: Minden első négyhosszú bitsorozat a negyedik bittől kezdve (tehát: 4-7,12-15) + \item stb. + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{img/paritasbit.png} + \caption{Paritásbitek csoportjai} + \end{figure} + \newpage + \noindent \emph{Példa}:\\ + + \noindent Legyen az átküldendő üzenet: 1000101 \\ + + \noindent Ekkor a kódszó a következőképp alakul: \\ + {\color[rgb]{1,0,0}$\heartsuit\heartsuit$}1{\color[rgb]{1,0,0}$\heartsuit$}000{\color[rgb]{1,0,0}$\heartsuit$}101\\ + A 8. bit a 8-11 bitsorozat paritását állítja be párosra:\\ + {\color[rgb]{1,0,0}$\heartsuit\heartsuit$}1{\color[rgb]{1,0,0}$\heartsuit$}000{\color[rgb]{0,0,1}0101}\\ + A 4. bit a 4-7 bitsorozat paritását állítja be párosra:\\ + {\color[rgb]{1,0,0}$\heartsuit\heartsuit$}1{\color[rgb]{0,0,1}0000}0101\\ + A 2. bit a 2-3, 6-7, 10-11 bitsorozat paritását állítja be párosra:\\ + {\color[rgb]{1,0,0}$\heartsuit$}{\color[rgb]{0,0,1}01}00{\color[rgb]{0,0,1}00}01{\color[rgb]{0,0,1}01}\\ + Az 1. bit az 1,3,5,7,9,11 bitsorozat paritását állítja be párosra: \\ + {\color[rgb]{0,0,1}1}0{\color[rgb]{0,0,1}1}0{\color[rgb]{0,0,1}0}0{\color[rgb]{0,0,1}0}0{\color[rgb]{0,0,1}1}0{\color[rgb]{0,0,1}1}\\ + + \noindent Tehát a elküldendő bitsorozat: + {\color[rgb]{1,0,0}10}1{\color[rgb]{1,0,0}0}000{\color[rgb]{1,0,0}0}101\\ + + \paragraph*{CRC - Polinom-kód, azaz ciklikus redundancia\\} + + A bitsorozatokat egy $\mathbb{Z}_2$ feletti polinom ($M(x)$) együtthatóinak tekintjük. \\ + Definiálunk egy $G(x)$ $r$-ed fokú generátorpolinomot, melyet a vevő és küldő egyaránt ismer.\\ + + \noindent Algoritmus: + \begin{enumerate} + \item Fűzzünk $r$ darab 0 bitet a keret alacsony helyi értékű végéhez. Azaz vegyük az $x^rM(x)$ polinomot (ez már $m+r$ fokú) + \item Osszuk el $x^rM(x)$-et $G(x)$-szel (mod 2). + \item A maradékot (mely mindig \emph{r} vagy kevesebb bitet tartalmaz) vonjuk ki \\ + $x^rM(x)$-ből (mod 2). Így az eredeti keret végére egy \emph{r} hosszú ellenőrző összeg kerül. Legyen ez a polinom $T(x)$. + \item A vevő egy $T(x)+E(x)$-nek megfelelő polinomot kap (ahol $E(x)$ a hiba polinom).\\ + Ezt elosztva a generátorpolinommal egy $R(x)$ polinomot kapunk. Ha ez a polinom nem nulla, akkor hiba történt. + \end{enumerate} + + \noindent Áttekintés: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item $G(x)$ legmagasabb és legalacsonyabb fokú tagjának együtthatója mindig 1. + \item A $G(x)$ többszöröseinek megfelelő bithibákat nem ismeri fel, azaz, ha + \begin{center} + $\forall j \in \mathbb{N}: E(x) = x^jG(x)$ + \end{center} + \item Szerkeszthető egy egyszerű, léptető regiszteres áramkör az ellenőrző összeg hardverben történő kiszámítására és ellenőrzésére. + \end{itemize} + \newpage + + \noindent Példa: Legyen az + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item átküldendő üzenet: 11010011100 + \item $G(x) = x^3 + x + 1 = \textbf{1} x^3 + \textbf{0} x^2 + \textbf{1} x^1 + \textbf{1} x^0 = x^3 + x + 1 \quad \rightarrow \textbf{r = 3}$ + \end{itemize} + + \noindent Minden lépésben a következő 1-es alá írom a generátorpolinomot első 1-sét, és ha két egyforma érték van egymás alatt, nullát írok alá, különben 1-et. \\ + + $\begin{array}{cccccccccccccc|l} + 1&1&0&1&0&0&1&1&1&0&0& & & &\text{\small eredeti üzenet} \\ + 1&1&0&1&0&0&1&1&1&0&0&0&0&0&\text{\small r darab 0-val kiegészítve} \\ + 1&0&1&1& & & & & & & & & & &\text{\small generátor polinommal osztás} \\ + 0&1&1&0&0&0&1&1&1&0&0&0&0&0&\text{\small eredmény} \\ + &1&0&1&1& & & & & & & & & &\text{\small generátor polinommal osztás} \\ + 0&0&1&1&1&0&1&1&1&0&0&0&0&0& \cdots \\ + & &1&0&1&1& & & & & & & & & \\ + 0&0&0&1&0&1&1&1&1&0&0&0&0&0& \\ + & & &1&0&1&1& & & & & & & & \\ + 0&0&0&0&0&0&0&1&1&0&0&0&0&0& \\ + & & & & & & &1&0&1&1& & & & \\ + 0&0&0&0&0&0&0&0&1&1&1&0&0&0& \\ + & & & & & & & &1&0&1&1& & & \\ + 0&0&0&0&0&0&0&0&0&1&0&1&0&0& \\ + & & & & & & & & & 1&0&1&1& & \\ + 0&0&0&0&0&0&0&0&0&0&0&0&1&0& \\ + \end{array}$\\\\ + + \noindent Az utolsó $r(=3)$ bitet hozzáfüzzük az eredeti üzenethez: 11010011100\textbf{010}\\ + + \noindent Ellenőrzés a vevő oldalon:\\ + + $\begin{array}{cccccccccccccc|l} + 1&1&0&1&0&0&1&1&1&0&0&0&1&0&\text{\small kódolt üzenet} \\ + 1&0&1&1& & & & & & & & & & &\text{\small generátor polinommal osztás} \\ + 0&1&1&0&0&0&1&1&1&0&0&0&1&0&\text{\small eredmény} \\ + &1&0&1&1& & & & & & & & & &\text{\small generátor polinommal osztás} \\ + 0&0&1&1&1&0&1&1&1&0&0&0&1&0& \cdots \\ + & &1&0&1&1& & & & & & & & & \\ + 0&0&0&1&0&1&1&1&1&0&0&0&1&0& \\ + & & &1&0&1&1& & & & & & & & \\ + 0&0&0&0&0&0&0&1&1&0&0&0&1&0& \\ + & & & & & & &1&0&1&1& & & & \\ + 0&0&0&0&0&0&0&0&1&1&1&0&1&0& \\ + & & & & & & & &1&0&1&1& & & \\ + 0&0&0&0&0&0&0&0&0&1&0&1&1&0& \\ + & & & & & & & & & 1&0&1&1& & \\ + 0&0&0&0&0&0&0&0&0&0&0&0&0&0& \\ + \end{array}$\\\\ + + \noindent Minden bit 0 lett, azaz az üzenet nem sérült. + +\newpage + \subsection*{Protokollok} + + \subsubsection*{Elemi adatkapcsolati protokollok\\} + + \noindent Feltevések: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A fizikai, az adatkapcsolati és a hálózati réteg független folyamatok, amelyek üzeneteken keresztül kommunikálnak egymással. + \item Az \emph{A} gép megbízható, összeköttetés alapú szolgálat alkalmazásával akar a \emph{B} gépnek egy hosszú adatfolyamot küldeni. (Adatok előállítására sosem kell várnia \emph{A} gépnek.) + \item A gépek nem fagynak le. + \item Adatkapcsolati fejrészben vezérlési információk. + \item Adatkapcsolati lábrészben ellenőrző összeg. + \end{itemize} + + \noindent Kommunikáció fajtái: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item szimplex kommunikáció – a kommunikáció pusztán egy irányba lehetséges + \item fél-duplex kommunikáció – mindkét irányba folyhat kommunikáció, de egyszerre csak egy irány lehet aktív. + \item duplex kommunikáció – mindkét irányba folyhat kommunikáció szimultán módon\\\ + \end{itemize} + + \noindent \textbf{\small Az összes protokoll esetében} + \begin{itemize} + \item Résztvevők: küldő és vevő + \end{itemize} + + \paragraph*{Korlátozás nélküli szimplex protokoll\\} + + \textbf{\small A környezet} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Mind az adó, mind a vevő hálózati rétegei mindig készen állnak + \item A feldolgozási időktől eltekintünk + \item Végtelen puffer-területet feltételezünk + \item Az adatkapcsolati rétegek közötti kommunikációs csatorna sosem rontja/veszíti el a\\ + kereteket + \end{itemize} + + \noindent \textbf{\small A protokoll} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Nincs sem sorszámozás, sem nyugta (szimplex) + \item A küldő végtelen ciklusban küldi kifelé a kereteket folyamatosan + \item A vevő kezdetben várakozik az első keret megérkezésére, keret érkezésekor a hardver puffer tartalmát változóba teszi és az adatrészt tovább küldi a hálózati rétegnek + \end{itemize} + + \paragraph*{Szimplex megáll és vár protokoll} + + \textbf{\small A környezet} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Mind az adó, mind a vevő hálózati rétegei mindig készen állnak + \item A vevőnek $\Delta t$ időre van szüksége a bejövő keret feldolgozására + \subitem nincs pufferelés és sorban állás sem + \item Az adatkapcsolati rétegek közötti kommunikációs csatorna sosem rontja/veszíti el a\\ + kereteket + \end{itemize} + + \noindent \textbf{\small A protokoll} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A küldő egyesével küldi kereteket és addig nem küld újat, még nem kap nyugtát a vevőtől (fél-duplex) + \item A vevő kezdetben várakozik az első keret megérkezésére, keret érkezésekor a hardver puffer tartalmát változóba teszi és az adatrészt továbbküldi a hálózati rétegnek, végül nyugtázza a keretet + \end{itemize} + + \paragraph*{Szimplex protokoll zajos csatornához} + \textbf{\small A környezet} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Mind az adó, mind a vevő hálózati rétegei mindig készen állnak + \item A vevőnek $\Delta t$ időre van szüksége a bejövő keret feldolgozására + \subitem nincs pufferelés és sorban állás sem + \item Az adatkapcsolati rétegek közötti kommunikációs csatorna hibázhat + \subitem keret megsérülése vagy elvesztése + \end{itemize} + + \noindent \textbf{\small A protokoll} + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A küldő egyesével küldi kereteket és addig nem küld újat, még nem kap nyugtát a vevőtől egy megadott határidőn belül, ha a határidő lejár, akkor ismételten elküldi az aktuális keretet. + \item A vevő kezdetben várakozik az első keret megérkezésére, keret érkezésekor a hardver puffer tartalmát változóba teszi, leellenőrzi a kontroll összeget: + \begin{itemize} + \item Nincs hiba: az adatrészt továbbküldi a hálózati rétegnek, végül nyugtázza a keretet. + \item Hiba történt: eldobja a keretet és nem nyugtáz (duplikátumok kellenek) + \end{itemize} + \end{itemize} + + \paragraph*{Csúszóablakos protokoll} + + \noindent Alapok (általános): + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Egy adott időpontban egyszerre több keret is átviteli állapotban lehet + \item A fogadó $n$ keretnek megfelelő méretű puffert allokál + \item A küldőnek legfeljebb $n$, azaz ablak méretnyi, nyugtázatlan keret küldése engedélyezett + \item A keret sorozatbeli pozíciója adja a keret címkéjét (sorozatszám)\\ + \end{itemize} + + \noindent Alapok (fogadó): + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A keret nyugtázója tartalmazza a következőnek várt keret sorozatszámát. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item kumulatív nyugta – Olyan nyugta, amely több keretet nyugtáz egyszerre. Például, ha a 2,3 és 4 kereteket is fogadnánk, akkor a nyugtát 5 sorszám tartalommal küldenénk, amely nyugtázza mind a három keretet. + \end{itemize} + \item A hibás kereteket el kell dobni. + \item A nem megengedett sorozatszámmal érkező kereteket el kell dobni.\\ + \end{itemize} + + \noindent Jellemzők (általános): + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A küldő nyilvántartja a küldhető sorozatszámok halmazát. (adási ablak) + \item A fogadó nyilvántartja a fogadható sorozatszámok halmazát. (vételi ablak) + \item A sorozatszámok halmaza minden esetben véges. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item $K$ bites mező esetén: $[0..2K-1]$ + \end{itemize} + \item A adási ablak minden küldéssel szűkül, illetve nő egy nyugta érkezésével.\\ + \end{itemize} + + \noindent Jellemzők (gyakorlati alkalmazás esetén): + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A gyakorlatban kétirányú adatfolyamot kell kezelni (duplex csatorna) + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item két különböző szimplex csatorna használata (két áramkör használata) + \item egy csatorna használata (egy áramkör használata) + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemiii}{$\vcenter{\hbox{\tiny$\diamond$}}$} + \item piggybacking módszer– a kimenő nyugtákat késleltetjük, hogy rá tudjuk akasztani a következő kimenő adatkeretre (ack mező használata) + \end{itemize} + \end{itemize} + \end{itemize} + + \noindent Mi van ha egy hosszú folyam közepén történik egy keret hiba? + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small "visszalépés N-nel" stratégia} + \item[] Stratégia: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Az összes hibás keret utáni keretet eldobja és nyugtát sem küld róluk. + \item Mikor az adónak lejár az időzítője, akkor újraküldi az összes nyugtázatlan keretet, kezdve a sérült vagy elveszett kerettel. + \end{itemize} + \item[] Következmények: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Egy méretű vételi ablakot feltételez. + \item Nagy sávszéleséget pazarolhat el, ha nagy a hibaarány. + \end{itemize} +\newpage + \item \textbf{\small "szelektív ismétlés" stratégia} + \item[] Stratégia: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item A hibás kereteket eldobja, de a jó kereteket a hibás után puffereli. + \item Mikor az adónak lejár az időzítője, akkor a legrégebbi nyugtázatlan keretet küldi el újra. + \end{itemize} + \item[] Következmények: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Javíthat a hatékonyságon a negatív nyugta használata. (NAK) + \item Egynél nagyobb méretű vételi ablakot feltételezünk. + \item Nagy memória igény, ha nagy vételi ablak esetén.\\\\ + \end{itemize} + \end{itemize} + + \subsection*{Példák adatkapcsolati protokollokra} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small HDLC - High-level Data Link Control} \\ + A HDLC protokoll 3 bites csúszó-ablak protokollt alkalmaz a sorszámozáshoz.\\ + Három típusú keretet használ: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item információs + \item felügyelő + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemiii}{$\vcenter{\hbox{\tiny$\diamond$}}$} + \item nyugtakeret (RECIEVE READY) + \item negatív nyugta keret (REJECT) + \item vételre nem kész (RECIEVE NOT READY) - nyugtáz minden keretet a következőig + \item szelektív elutasítás (SELECTIVE REJECT) - egy gy adott keret újraküldésére szólít fel + \end{itemize} + \item Számozatlan + \end{itemize} + + Általános keretfelépítése: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item FLAG bájt a keret határok jelzésére + \item \textit{cím} mező - több vonallal rendelkező terminálok esetén van jelentősége + \item \textit{vezérlés} mező - sorszámozás, nyugtázás és egyéb feladatok ellátására + \item \textit{adat} mező - tetszőleges hosszú adat lehet + \item \textit{ellenőrző összeg} mező - CRC kontrollösszeg (CRC-CCITT generátor polinom felhasználásával) + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/hdlc_keret.png} + \caption{HDLC keret felépítése} + \end{figure} +\newpage + \item \textbf{\small PPP - Point-to Point Protocol} \\ + + A PPP protokoll három dolgot biztosít: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Keretezési módszert (egyértelmű kerethatárok) + \item Kapcsolatvezérlő protokollt (a vonalak felélesztésére, tesztelésére, az opció egyeztetésére és a vonalak elengedésére.) + \item Olyan módot a hálózati réteg-opciók megbeszélésére, amely független az alkalmazott hálózati réteg-protokolltól. + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/ppp.png} + \caption{} + \end{figure} + \end{itemize} + Bájt alapú keretszerkezet használ (azaz a legkisebb adategység a bájt). + Vezérlő mező alapértéke a számozatlan keretet jelzi. Protokoll mezőben protokoll kód lehet az LCP, NCP, IP, IPX, AppleTalk vagy más protokollhoz. + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/ppp_keret.png} + \caption{PPP keret felépítése} + \end{figure} + \end{itemize} + + \paragraph*{MAC - Media Access Control\\} + + Egyetlen üzenetszórásos csatorna megosztása több egymással versengő felhasználó (állomás) között. A csatorna kiosztás történhet statikus vagy dinamikus módon. + + \subsubsection*{Statikus csatornamegosztási módszerek} + + \noindent Statikus esetben vagy frekvenciaosztásos nyalábolást vagy időosztásos nyalábolást használnak. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Frekvenciaosztásos (FDM) esetben + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item A sávszélességet osztják $n$ egyenlő részre, és mindegyik felhasználó egy sávot kap. + \item Mindenkinek külön frekvenciasávja van, így nincs interferencia. + \end{itemize} + \item Időosztásos (TDM) esetben + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Az időegységet osztják $n$ egyenlő időrésre. + \item Minden felhasználóhoz statikusan egy időrést rendel.\\ + (Az i. részben az i. felhasználó a teljes sávszélességet használhatja) + \end{itemize} + \end{itemize} + + \noindent Jellemzőik: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item kötött a felhasználószám + \item a keretek átlagos késleltetése n-szerese annak, mintha az egész csatorna egy felhasználóé lenne + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item FDM-nél kisebb (n-ed része) sávszélesség, + \item TDM-nél nagyobb várakozási idő van\\ + (a ciklusidő n-ed része csak az övé). + \end{itemize} + \item a keretek késleltetése állandó + \item a csatornakihasználtság + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item rossz kis és nem egyenletes forgalom esetén\\ + (ha foglalt csatorna üres, más akkor sem veheti át) + \item jó folytonos, egyenletes terheléskor\\ + (pl. telefonközpontközi trönk – kevés rögzített számú felhasználó, nagy egyenletes terhelés). + \end{itemize} + \end{itemize} + + \subsection*{Dinamikus csatornamegosztási módszerek} + + \subsubsection*{Verseny protokollok\\} + + $N$ független állomás van, amelyeken egy program vagy egy felhasználó továbbítandó kereteket generál. Ha egy állomás generált egy keretet, akkor blokkolt állapotban marad mindaddig, amíg a keretet sikeresen nem továbbította. Egyetlen csatorna van, melyen mindenféle kommunikáció zajlik. Minden állomás tud adatot küldeni és fogadni ezen a csatornán. Ha két keret egy időben kerül átvitelre, akkor átlapolódnak, és az eredményül kapott jel értelmezhetetlenné válik. Ezt nevezzük ütközésnek. Ez minden állomás számára felismerhető. Az ütközésben érintett kereteket később újra kell küldeni. (Ezen a hibán kívül egyéb hiba nem történhet.)\\ + + \noindent Kétféle időmodellt különböztetünk meg: + \begin{enumerate} + \item \textbf{\small Folytonos} – Mindegyik állomás tetszőleges időpontban megkezdheti a küldésre kész keretének sugárzását. + \item \textbf{\small Diszkrét} – Az időt diszkrét résekre osztjuk. Keret továbbítás csak időrés elején lehetséges. Az időrés lehet üres, sikeres vagy ütközéses + \end{enumerate} + + \noindent Az egyes állomások vagy rendelkeznek vivőjel érzékeléssel vagy nem. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Ha nem, akkor az állomások nem tudják megvizsgálni a közös csatorna állapotát, ezért egyszerűen elkezdenek küldeni, ha van rá lehetőségük. + \item Ha igen, akkor az állomások meg tudják vizsgálni a közös csatorna állapotát a küldés előtt. A csatorna lehet: foglalt vagy szabad. Ha a foglalt a csatorna, akkor nem próbálják használni az állomások, amíg fel nem szabadul + \end{itemize} + + \paragraph*{Egyszerű ALOHA \\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item A felhasználó akkor vihet át adatot, amikor csak szeretne. + \item Ütközés esetén véletlen ideig várakozik az állomás, majd újra próbálkozik. + \item Keret idő–egy szabványos, fix hosszúságú keret átviteléhez szükséges idő (T). + \item Egy keret akkor nem szenved ütközést, ha elküldésének első pillanatától kezdve egy keretideig nem próbálkozik más állomás keretküldéssel. + \item 2T ideig ütközésveszélyes. + \end{itemize} + \begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{img/egyszeru_aloha.png} + \caption{Egyszerű ALOHA keret ütközések} + \end{figure} + + \paragraph*{Réselt ALOHA \\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Az időt keretidőnyi (T) résekre osztják + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item külön meg kell oldani az állomások szinkronizációját, pl. egy külön állomás küld egy speciális jelet minden rés elején. + \end{itemize} + \item Adást csak az időrés elején lehet kezdeni! + \item Az ütközésveszélyes kritikus időszakasz 2T-ről T-re csökken az egyszerű ALOHA-hoz képest. + \end{itemize} + + \paragraph*{1-prezisztens CSMA \\} + + Vivőjel érzékelés van, azaz minden állomás belehallgathat a csatornába. Folytonos időmodellt használ a protokoll. \\ + + \noindent Algoritmus: + \begin{enumerate} + \item Keret leadása előtt belehallgat a csatornába: + \begin{enumerate} + \item Ha foglalt, akkor addig vár, amíg fel nem szabadul. Szabad csatorna esetén azonnal küld. (perzisztens) + \item Ha szabad, akkor küld. + \end{enumerate} + \item Ha ütközés történik, akkor az állomás véletlen hosszú ideig vár, majd újrakezdi a keret leadását. + \end{enumerate} + + \paragraph*{Nem-prezisztens CSMA} + + Vivőjel érzékelés van, azaz minden állomás belehallgathat a csatornába. Folytonos időmodellt használ a protokoll. Mohóságot kerüli, azaz nem küld azonnal, ha foglalt.\\ + + \noindent Algoritmus: + \begin{enumerate} + \item Keret leadása előtt belehallgat a csatornába: + \begin{enumerate} + \item Ha foglalt, akkor véletlen ideig vár (nem figyeli a forgalmat), majd kezdi előröl a küldési algoritmust. (nem-perzisztens) + \item Ha szabad, akkor küld. + \end{enumerate} + \item Ha ütközés történik, akkor az állomás véletlen hosszú ideig vár, majd újrakezdi a keret leadását. + \end{enumerate} + + \paragraph*{p-prezisztens CSMA} + + Vivőjel érzékelés van, azaz minden állomás belehallgathat a csatornába. Diszkrét időmodellt használ a protokoll.\\ + + \noindent Algoritmus: + \begin{enumerate} + \item Adás kész állapotban az állomás belehallgat a csatornába: + \begin{enumerate} + \item Ha foglalt, akkor vár a következő időrésig, majd megismétli az algoritmust. + \item Ha szabad, akkor $p$ valószínűséggel küld, illetve $1-p$ valószínűséggel visszalép a szándékától a következő időrésig. Várakozás esetén a következő időrésben megismétli az algoritmust. Ez addig folytatódik, amíg el nem küldi a keretet, vagy amíg egy másik állomás el nem kezd küldeni, mert ilyenkor úgy viselkedik, mintha ütközés történt volna. + \end{enumerate} + \item Ha ütközés történik, akkor az állomás véletlen hosszú ideig vár, majd újrakezdi a keret leadását. + \end{enumerate} + + \paragraph*{CSMA/CD} + + Ütközés érzékelés esetén meg lehessen szakítani az adást. Minden állomás küldés közben megfigyeli a csatornát, ha ütközést tapasztalna, akkor megszakítja az adást, és véletlen ideig várakozik, majd újra elkezdi leadni a keretét. + + \begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{img/aloha_csma.jpg} +% \caption{ALOHA és CSMA protokollok összehasonlítása} + \end{figure} + + \subsubsection*{Verseny mentes protokollok} + + Motiváció: Az ütközések hátrányosan hatnak a rendszer teljesítményére, és a CSMA/CD nem mindenhol alkalmazható.\\ + + \noindent N állomás van. Az állomások 0-ától N-ig egyértelműen sorszámozva vannak. Réselt időmodellt feltételezünk. + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small Egy helyfoglalásos protokoll} \\ + Ha az i-edik állomás küldeni szeretne, akkor az i-edik versengési időrésben egy 1-es bit elküldésével jelezheti. Így a versengési időszak végére minden állomás ismeri a küldőket. A küldés a sorszámok szerinti sorrendben történik meg. + \item \textbf{\small Bináris visszaszámlálás protokoll} \\ + Minden állomás azonos hosszú bináris azonosítóval rendelkezik. A forgalmazni kívánó állomás elkezdi a bináris címét bitenként elküldeni a legnagyobb helyi értékű bittel kezdve. Az azonos pozíciójú bitek logikai VAGY kapcsolatba lépnek ütközés esetén. Ha az állomás nullát küld, de egyet hall vissza, akkor feladja a küldési szándékát, mert van nála nagyobb azonosítóval rendelkező küldő. + \end{itemize} + + \paragraph*{Korlátozott verseny protokollok} + + Olyan protokoll, amely kis terhelés esetén versenyhelyzetes technikát használ a kis késleltetés érdekében, illetve nagy terhelés mellett ütközésmentes technikát alkalmaz a csatorna jó kihasználása érdekében. + + \paragraph*{\small Adaptív fabejárás} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Minden állomást egy egyértelmű, bináris ID reprezentál. + \item Az ID-k egy (bináris) fa leveleinek felelnek meg. + \item Az időrések a fa egyes csomópontjaihoz vannak rendelve. + \item Minden időrésben megvizsgáljuk az adott csomópont alatti részfát. + \item A fa egy $u$ csomópontjánál 3 esetet különböztethetünk meg: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Egy állomás sem küld az $u$ részfában. + \item Pontosan egy állomás küld az $u$ részfában. + \item Több állomás küld az $u$ részfában. Ezt nevezzük kollíziónak. + \end{itemize} + \end{itemize} + Kollízió esetén hajtsuk végre az ellenőrzést $u$ bal, és jobb oldali gyerekére egyaránt. Ezzel a módszerrel könnyen megállapítható, hogy melyik állomás küldhet az adott időszeletben. + \begin{figure}[H] + \centering + \includegraphics[width=0.5\textwidth]{img/adaptivfa.png} + \caption{Adaptív fabejárás protokoll bináris fája} + \end{figure} + + \section*{3. Hálózati réteg} + + A hálózati réteg fő feladata a csomagok továbbítása a forrás és a cél között. Ez a legalacsonyabb olyan réteg, amely két végpont közötti átvitellel foglalkozik. Ismernie kell a kommunikációs alhálózat topológiáját. Ügyelni kell, hogy ne terheljen túl se bizonyos kommunikációs útvonalakat, se bizonyos routereket úgy, hogy mások tétlen maradnak.\\ + + \noindent A szállítási réteg felé nyújtott szolgálatok: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Függetlenek az alhálózatok kialakításától + \item Eltakarják a jelen lévő alhálózatok számát, típusát és topológiáját + \item A szállítási réteg számára rendelkezésre bocsájtott hálózati címek egységes számozási rendszert kell alkotnak + \end{itemize} + + \subsection*{Forgalom irányítás típusai} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small Hierarchikus forgalomirányítás}\\\\ + Routereket tartományokra osztjuk. A saját tartományát az összes router ismeri, de a többi belső szerkezetéről nincs tudomása. Nagy hálózatok esetén többszintű hierarchia lehet szükséges. + \item \textbf{\small Adatszóró forgalomirányítás}\\\\ + Egy csomag mindenhová történő egyidejű küldése. + \item \textbf{\small Többküldéses forgalomirányítás}\\\\ + Egy csomag meghatározott csoporthoz történő egyidejű küldése. + \end{itemize} +\newpage + \subsubsection*{Forgalom irányító algoritmusok} + + A hálózati réteg szoftverének azon része, amely azért a döntésért felelős, hogy a bejövő csomag melyik kimeneti vonalon kerüljön továbbításra. A folyamat két lépésre bontható: + \begin{enumerate} + \item Forgalomirányító táblázatok feltöltése és karbantartása. + \item Továbbítás. + \end{enumerate} + + A forgalomirányító algoritmusok osztályai: + \begin{enumerate} + \item Adaptív algoritmusok + \begin{enumerate} + \item távolság alapú + \item kapcsolat alapú + \end{enumerate} + A topológia és rendszerint a forgalom is befolyásolhatja a döntést. + \item Nem-adaptív algoritmusok \\ + Offline meghatározás, betöltés a routerekbe induláskor + \end{enumerate} + + \paragraph*{Dijkstra algoritmus\\} + + A Dijkstra algoritmus egy statikus algoritmus, melynek célja két csomópont közötti legrövidebb út meghatározása.\\ + + \noindent Minden csomópontot felcímkézünk a kezdőpontból az addig megtalált legrövidebb út távolságával. Kezdetben minden távolság végtelen, mivel nem ismerünk útvonalat.\\ + + \noindent Az algoritmus működése során a címkék változhatnak az utak megtalálásával. Két fajta címkét különböztetünk meg: ideiglenes és állandó. Kezdetben minden címke ideiglenes. A legrövidebb út megtalálásakor a címke állandó címkévé válik, és továbbá nem változik. + + \paragraph*{Elárasztás algoritmus\\} + + Elárasztás algoritmusa egy statikus algoritmus.\\ + + \noindent Minden bejövő csomagot minden kimenő vonalon továbbítunk kivéve azon, amin érkezett. Így azonban nagyon sok duplikátum keletkezne. Ezért + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Ugrásszámlálót vezetünk be, melyet minden állomás eggyel csökkent. Ha 0-ra csökken, eldobják. + \item Az állomások nyilvántartják a már kiküldött csomagokat. Így egy csomagot nem küldenek ki többször. + \end{itemize} + + \paragraph*{Elosztott Bellman-Ford algoritmus\\} + + \noindent Az Elosztott Bellman-Ford algoritmus adaptív, távolság alapú forgalomirányító algoritmus. Minden csomópont csak a közvetlen szomszédjaival kommunikálhat. Minden állomásnak van saját távolság vektora. Ezt periodikusan elküldi a direkt szomszédoknak. Minden router ismeri a közvetlen szomszédjaihoz a költséget. A kapott távolság vektorok alapján minden csomópont aktualizálja a saját vektorát. + + \paragraph{Kapcsolatállapot alapú forgalomirányítás\\} + + A kapcsolatállapot alapú forgalomirányító algoritmusnak a motivációja, hogy a távolság alapú algoritmusok lassan konvergáltak, illetve az eltérő sávszélek figyelembevétele. \\ + + \noindent A kapcsolatállapot alapú forgalomirányító algoritmus lépései: + \begin{enumerate} + \item Szomszédok felkutatása, és hálózati címeik meghatározása + \item Megmérni a késleltetést vagy költséget minden szomszédhoz + \item Egy csomag összeállítása a megismert információkból + \item Csomag elküldése az összes többi routernek + \item Kiszámítani a legrövidebb utat az összes többi routerhez.\\ + \end{enumerate} + + \paragraph*{Hálózati réteg az Interneten\\} + + A hálózati réteg szintjén az internet autonóm rendszerek összekapcsolt együttesének tekinthető. Nincs igazi szerkezete, de számos főbb gerinchálózata létezik.\\ + + \noindent A gerinchálózatokhoz csatlakoznak a területi illetve regionális hálózatok. A regionális és területi hálózatokhoz csatlakoznak az egyetemeken, vállalatoknál és az internet szolgáltatóknál lévő LAN-ok. Az internet protokollja, az IP.\\ + + \noindent Az Interneten a kommunikáció az alábbi módon működik: + \begin{enumerate} + \item A szállítási réteg viszi az adatfolyamokat és datagramokra tördeli azokat. + \item Minden datagram átvitelre kerül az Interneten, esetleg menet közben kisebb egységekre darabolva. + \item A célgép hálózati rétege összeállítja az eredeti datagramot, majd átadja a szállítási rétegének. + \item A célgép szállítási rétege beilleszti a datagramot a vételi folyamat bemeneti adatfolyamába. + \end{enumerate} + + \paragraph*{Internet Protokoll - IP\\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item Az IP fejrésze: + \begin{itemize} + \item verzió: IP melyik verzióját használja + \item IHL: a fejléc hosszát határozza meg + \item szolgálat típusa: szolgálati osztályt jelöl + \item teljes hossz: fejléc és adatrész együttes hossza bájtokban + \item azonosítás: egy datagram minden darabja ugyanazt az azonosításértéket hordozza. + \item DF: "ne darabold" flag a routereknek + \item MF: "több darab" flag minden darabban be kell legyen állítva, kivéve az utolsót. + \item darabeltolás: a darab helyét mutatja a datagramon belül. + \item élettartam: másodpercenként kellene csökkenteni a mező értékét, minden ugrásnál csökkentik eggyel az értékét + \item protokoll: szállítási réteg protokolljának azonosítóját tartalmazza + \item ellenőrző összeg: a routereken belüli rossz memóriaszavak által előállított hibák kezelésére használt ellenőrző összeg a fejrészre, amelyet minden ugrásnál újra kell számolni + \item forrás cím és cél cím: IP cím + \item opciók: következő verzió bővíthetősége miatt hagyták benne. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{img/ip_fejresz.png} + \caption{IPv4 fejléce} + \end{figure} + + \item Az IP cím \\ + Minden hoszt és minden router az Interneten rendelkezik egy IP-címmel, amely a hálózat számát és a hoszt számát kódolja. 4 bájton ábrázolják az IP-címet. Az IP-t pontokkal elválasztott decimális rendszerben írják. (Például: 192.168.0.1)\\ + Van pár speciális cím (ábra \ref{fig:ip_spec_cimek}). + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{img/ip_spec_cimek.png} + \caption{Speciális IP címek} + \label{fig:ip_spec_cimek} + \end{figure} + + \paragraph*{Alhálózatok} + + Az azonos hálózatban lévő hosztok ugyanazzal a hálózatszámmal rendelkeznek. Egy hálózat belső felhasználás szempontjából több részre osztódhat, de a külvilág számára egyetlen hálózatként jelenik meg. Azonosításnál az alhálózati maszk ismerete kell a routernek. A forgalomirányító táblázatba a routereknél (hálózat,0) és (saját hálózat, hoszt) alakú bejegyzések. Ha nincs találat, akkor az alapértelmezett router felé továbbítják a csomagot. + + \paragraph*{IP címek fogyása} + + Az IP címek gyorsan fogytak. Megoldás: osztályok nélküli környezetek közötti forgalomirányítás (CIDR). A forgalomirányítás megbonyolódik: Minden bejegyzés egy 32-bites maszkkal egészül ki. Egy bejegyzés innentől egy hármassal jellemezhető: (ip-cím, alhálózati maszk, kimeneti vonal). Új csomag esetén a cél címből kimaszkolják az alhálózati címet, és találat esetén a leghosszabb illeszkedés felé továbbítják. + + Másik módszer a NAT, ami gyors javítás az IP címek elfogyásának problémájára. Az internet forgalomhoz minden cégnek egy vagy legalábbis kevés IP-címet adnak, míg vállalaton belül minden számítógéphez egyedi IP-címet használnak a belső forgalomirányításra: \\ + + \begin{center} + \renewcommand{\arraystretch}{2} + $\begin{array}{r|r|r} + 10.0.0.0 & 10.255.255.255 & 16.777.216\ \text{egyedi cím} \\ + 172.16.0.0 & 172.31.255.255 & 1.048.576\ \text{egyedi cím} \\ + 192.168.0.0 & 192.168.255.255 & 65.536\ \text{egyedi cím} \\ + \end{array}$ + \renewcommand{\arraystretch}{1} + \end{center} + + \paragraph*{IPv6:\\} + + Az IPv4-gyel szemben 16 bájt hosszú címeket használ; 8 darab, egyenként \\ + négy-négy hexadecimális számjegyből álló csoportként írjuk le. \\ + (Például: 8000:0000:0000:0000:0123:4567:89AB:CDEF) Az IP fejléc egyszerűsödött, amely lehetővé teszi a routereknek a gyorsabb feldolgozást. A biztonság irányába jelentős lépés történt. + + \begin{figure}[H] + \centering + \includegraphics[width=0.65\textwidth]{img/ipv6.png} + \caption{IPv6 fejléce} + \end{figure} + + \end{itemize} +\newpage + \paragraph*{Protokollok\\} + + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemi}{$\vcenter{\hbox{\tiny$\bullet$}}$} + \item \textbf{\small Internet Control Message Protocol - ICMP} \\ + Feladata a váratlan események jelentése. Többféle ICMP-üzenetet definiáltak: + \begin{itemize}[leftmargin=7.5mm] + \renewcommand{\labelitemii}{$\vcenter{\hbox{\tiny$\circ$}}$} + \item Elérhetetlen cél + \item Időtúllépés + \item Paraméterprobléma + \item Forráslefojtás + \item Visszhang kérés + \item Visszhang válasz + \item etc. + \end{itemize} + \item \textbf{\small Address Resolution Protocol - ARP} \\\\ + Feladata az IP cím megfeleltetése egy fizikai címnek. Egy "Kié a 192.60.34.12-es IP-cím?" csomagot küld ki az Ethernet-re adatszórással az alhálózaton. Minden egyes host ellenőrzi, hogy övé-e a kérdéses IP-cím. Ha egyezik az IP a hoszt saját IP-jével, akkor a saját Ethernet címével válaszol. + \item \textbf{\small Reverse Address Resolution Protocol - RARP} \\\\ + Feladatat a fizikai cím megfeleltetése egy IP címnek. Az újonnan indított állomás adatszórással csomagot küld ki az Ethernetre: "A 48-bites Ethernet-címem 14.04.05.18.01.25. Tudja valaki az IP címemet?" Az RARP-szerver pedig válaszol a megfelelő IP címmel, mikor meglátja a kérést. + \item \textbf{\small Open Shortest Path First - OSPF} \\\\ + Az OSPF az AS-eken (Autonomus System) belüli forgalomirányításért felel. A hálózat topológiáját térképezi fel, és érzékeli a változásokat. A topológiát egy súlyozott irányított gráffal reprezentálja, melyben legolcsóbb utakat keres. + \item \textbf{\small Border Gateway Protocol - BGP} \\\\ + Feladata hogy a politikai szempontok szerepet játsszanak az AS-ek közötti forgalomirányítási döntésekben.\\\\ + {\small Például: Az IBM-nél kezdődő illetve végződő forgalom ne menjen át a Microsoft-on vagy Csak akkor haladjunk át Albánián, ha nincs más út a célhoz.}\\\\ + A BGP router szempontjából a világ AS-ekből és a közöttük átmenő vonalakból áll. (Két AS összekötött, ha van köztük a BGP-routereiket összekötő vonal.)\\ + Az átmenő forgalom szempontjából 3 féle hálózat van: + \begin{itemize} + \item Csonka hálózatok, amelyeknek csak egyetlen összeköttetésük van a BGP gráffal + \item Többszörösen bekötött hálózatok, amelyeket használhatna az átmenő forgalom, de ezek ezt megtagadják + \item Tranzit hálózatok, amelyek némi megkötéssel, illetve általában fizetség ellenében, készek kezelni harmadik fél csomagjait + \end{itemize} + \end{itemize} + + \section*{4. Szállítói réteg} + + \begin{itemize} + \item A szállítási réteg biztosítja, hogy a felhasználók közötti adatátvitel transzparens (átlátszó) legyen. + \item A réteg biztosítja, és ellenőrzi egy adott kapcsolat megbízhatóságát. + \item Az alkalmazási rétegtől kapott adat elejére egy úgynevezett fejlécet csatol, mely jelzi, hogy melyik szállítási rétegbeli protokollal küldik az adatot. + \item Néhány protokoll kapcsolat orientált. Ez azt jelenti, hogy a réteg nyomon követi az adatcsomagokat, és hiba esetén gondoskodik a csomag vagy csomagok újraküldéséről. + \end{itemize} + + \subsubsection*{Kapcsolat nélküli és kapcsolatorientált} + + \noindent A kapcsolatorientált protokoll elfedi az alkalmazások előtt az átvitel esetleges hibáit, nem kell törődnünk az elveszett, vagy duplán megérkezett, illetve sérült csomagokkal, és azzal sem, hogy milyen sorrendben érkeztek meg. Viszont ez rontja a teljesítményét. + + \noindent Kapcsolat nélküli esetben nincs szükség az adat keretekre bontására, és nincs csomagújraküldés. + + \paragraph*{Megbízhatóság} + + A megbízhatóság ismérvei: + \begin{itemize} + \item Minden csomag megérkezése nyugtázásra kerül. + \item A nem nyugtázott adatcsomagokat újraküldik. + \item A fejléchez és a csomaghoz ellenőrzőösszeg van rendelve. + \item A csomagokat számozza, és a fogadónál sorba rendezésre kerülnek a csomagok a sorszámaik alapján. + \item Duplikátumokat törli. + \end{itemize} + + \subsubsection*{Torlódásfelügyelet} + + Minden hálózaton korlátos az átviteli sávszélessége. Ha több adatot vezetünk a hálózatba, akkor az torlódáshoz (congestion) vezet, vagy akár a hálózat összeomlásához (congestive collapse). Következmény: Az adatcsomagok nem érkeznek meg.\\ + + \noindent \textbf{Lavina jelenség:} A hálózat túlterhelése csomagok elvesztését okozza, ami csomag újraküldését eredményezi. Az újraküldés tovább növeli a hálózat terhelését így még nagyobb lesz csomagvesztés. Ez még több újraküldött csomagot eredményez. ... \\ + A torlódás felügyelet feladata a lavina jelenség elkerülése. + + \paragraph*{Követelmények a torlódásfelügyelettel szemben} + + \begin{itemize} + \item Hatékonyság: Az átvitel nagy, míg a késés kicsi. + \item Fairness: Minden folyamat megközelítőleg azonos részt kap a sávszélességből. (Priorizálás lehetősége fennáll) + \end{itemize} + + \paragraph*{A torlódásfelügyelet eszközei} + \begin{itemize} + \item Kapacitásnövelés + \item Erőforrás foglalás és hozzáférés szabályzás + \item Terhelés csökkentése és szabályzása + \end{itemize} + + \paragraph*{Stratégiák} + \begin{itemize} + \item \textbf{Csúszóablak} \\ + Adatráta szabályozása ablak segítségével. A fogadó határozza meg az ablak (wnd) méretét. Ha a fogadási puffere tele van, lecsökkenti 0-ra, egyébként \textgreater0-t küld. A küldő nem küld több csomagot, ha az elküldött még nem nyugtázott csomagok száma elérte az ablak méretét. + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/csuszoablak.png} + \caption{Csúszóablak} + \end{figure} + \item \textbf{Slow-start} \\ + A küldőnek nem szabad a fogadó által küldött ablakméretet azonnal kihasználni. Meghatároz egy másik ablakot (cwnd - Congestion Window), melyet ő választ. Ezután végül amiben küld: min\{wnd, cwnd\}. Kezdetben cwnd = MSS (Maximum Segment Size). Minden csomagnál a megkapott nyugta után növeli: cwnd = cwnd + MSS (azaz minden RTT után duplázódik). Ez addig megy, míg a nyugta egyszer kimarad. + \item \textbf{TCP-Nagle} \\ + Biztosítani kell, hogy a kis csomagok időben egymáshoz közel kerüljenek kiszállításkor, illetve hogy sok adat esetén a nagy csomagok részesüljenek előnyben. + \begin{itemize} + \item A kis csomagok nem kerülnek kiküldésre, míg nyugták hiányoznak (egy csomag kicsi, ha az adathossz \textless MSS). + \item Ha a korábban küldött csomag nyugtája megérkezik, küldi a következőt. + \end{itemize} + \item \textbf{TCP Tahoe és Reno} \\ + A TCP csúszóablakot és a Slow-start mechanizmusát is használja. Habár a kezdő ráta kicsi, az ablak mérete rohamosan nő. Amikor a cwnd eléri az ssthresh (slow start threshold) értéket átvált torlódás elkerülési állapotba. A TCP Tahoe és Reno torlódás elkerülési algoritmusok. A két algoritmus abban különbözik, hogy hogyan detektálják és kezelik a csomag vesztést. \\ + + \noindent \emph{TCP Tahoe}: A torlódás detektálására egy időzítőt állít a várt nyugta megérkezésére. + \begin{itemize} + \item Kapcsolatfelvételkor: + \begin{itemize} + \item cwnd = MSS, + \item ssthresh = $2^{16}$ + \end{itemize} + \item Csomagvesztésnél : Multiplicative decrease + \begin{itemize} + \item cwns = MSS, + \item ssthresh = max $\left\{2MSS, \frac{min\{cwnd, wnd\}}{2}\right\}$ + \end{itemize} + \item cwnd $\leq$\ ssthresh : Slow-start \\ + cwnd = cwnd + MSS + \item cwnd $>$ ssthresh : Additive Increase \\ + cwnd = cwnd + MSS$\frac{MSS}{cwnd}$ + \end{itemize} + \noindent \emph{TCP Reno}: A torlódás detektálásához időzítőt és gyors újraadást is használ. [Gyors újraadás: ugyanazon csomaghoz 3 nyugta duplikátum érkezik (4 azonos nyugta), akkor újraküldi a csomagot és Slow-start fázisba lép.] \\\\ + Gyors újraadás után: + \begin{itemize} + \item ssthresh = max\{$\frac{min\{wnd,cwnd\}}{2}$, 2MSS\}, + \item cwnd = sstresh + 3MSS. + \end{itemize} + Gyors visszaállítás a gyors újraadás után minden további nyugta után növeli a rátát: + \begin{itemize} + \item cwnd = cwnd + MSS. + \end{itemize} + \end{itemize} + + \noindent Hatékonyság és Fairness: \\ + Az átvitel maximális, ha a terhelés a hálózat kapacitását majdnem eléri. Ha a terhelés tovább nő, túlcsordulnak a pufferek, csomagok vesznek el, újra kell küldeni, drasztikusan nő a válaszidő. Ezt a torlódásnak nevezzük. Ezért a maximális terhelés helyett, ajánlatos a hálózat terhelését a könyök közelében beállítani. Itt a válaszidő csak lassan emelkedik, míg az adatátvitel már a maximum közelében van.\\ + + \noindent Egy jó torlódáselkerülési (angolul congestion avoidance) stratégia a hálózat terhelését a könyök közelében tartja: \textit{hatékonyság}. Emellett fontos, hogy minden résztvevőt egyforma rátával szolgáljunk ki: \textit{fairness}\\ + + \noindent Jelölje az $i$-edik résztvevő adatrátáját a $t$ időpontban $x_i(t)$. + Minden résztvevő aktualizálja az adatrátáját a $t+1$-ik fordulóban: + \begin{align*} + x_i(t+1) = f_0(t) \quad ha \ \sum_{i=1}^{n}x_i(t) \leq K \\ + x_i(t+1) = f_1(t) \quad ha \ \sum_{i=1}^{n}x_i(t) > K + \end{align*} + ahol $f_0(x) = a_I + b_Ix$ a növelési, $f_1(x) = a_D + b_Dx$ a csökkentési stratégia. + + \paragraph*{Speciális esetek} + + \begin{itemize} + \item \textbf{M}ultiplcative \textbf{I}ncrease \textbf{M}ultiplcative \textbf{D}ecrease - MIMD: + \begin{align*} + f_0(x) = b_Ix \quad (b_I > 1) \qquad + f_1(x) = b_Dx \quad (b_D < 1) + \end{align*} + \item \textbf{A}dditive \textbf{I}ncrease \textbf{A}dditive \textbf{D}ecrease - AIAD: + \begin{align*} + f_0(x) = a_I+x \quad (a_I > 0) \qquad + f_1(x) = a_D+x \quad (a_D < 0) + \end{align*} + \item \textbf{A}dditive \textbf{I}ncrease \textbf{M}ultiplcative \textbf{D}ecrease - AIMD: + \begin{align*} + f_0(x) = a_I+x \quad (a_I > 0) \qquad + f_1(x) = b_Dx \quad (b_D < 1) + \end{align*} + \end{itemize} + + \paragraph{Multiplexálás, demultiplexálás} + + Multiplexelés alatt a telekommunikációban azt az eljárást értik, amikor két vagy több csatornát összefognak egy csatornába úgy, hogy az inverz multiplexelés művelettel, vagy demultiplexeléssel, vagy demuxálással elő tudják állítani az eredeti csatornákat. Az eredeti csatornák egy úgynevezett kódolási sémával azonosíthatóak. + + \paragraph{Interakciós modellek} + + \begin{itemize} + \item \textbf{\small Kétirányú bájtfolyam} \\ + {\small Az adatok két egymással ellentétes irányú bájt-sorozatként kerülnek átvitelre. A tartalom nem interpretálódik Az adatcsomagok időbeli viselkedése megváltozhat: átvitel sebessége növekedhet, csökkenhet, más késés, más sorrendben is megérkezhetnek. Megpróbálja az adatcsomagokat időben egymáshoz közel kiszállítani. Megpróbálja az átviteli közeget hatékonyan használni.} + + \item \textbf{\small RPC} \\ + {\small A távoli gépen futtatandó eljárás eléréséhez hálózati kommunikációra van szükség, ezt az eljáráshívási mechanizmust az RPC (Remote Procedure Call) fedi el.} + + A hívás lépései: + \begin{enumerate} + \small + \item A kliensfolyamat lokálisan meghívja a klienscsonkot. + \item Az becsomagolja az eljárás azonosítóját és paramétereit, meghívja az OS-t. + \item Az átküldi az üzenetet a távoli OS-nek. + \item Az átadja az üzenetet a szervercsonknak. + \item Az kicsomagolja a paramétereket, átadja a szervernek. + \item A szerver lokálisan meghívja az eljárást, megkapja a visszatérési értéket. + \item Ennek visszaküldése a klienshez hasonlóan zajlik, fordított irányban. + \end{enumerate} + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/rpc.png} + \caption{RPC} + \end{figure} + \end{itemize} + + \subsection*{Protokollok\\} + + \subsubsection*{TCP} + + \begin{itemize} + \item Megbízható adatfolyam létrehozása két végpont között + \item Az alkalmazási réteg adatáramát osztja csomagokra + \item A másik végpont a csomagok fogadásról nyugtát küld + \end{itemize} + + \noindent A TCP fejléc tartalma:\\ + + \renewcommand{\arraystretch}{2} + {\footnotesize + $\begin{array}{l|c|l} + \text{Küldő port} & \text{16 bit} & \text{A küldő folyamatot azonosítja} \\ \hline + \text{Cél port} & \text{16 bit} & \text{A címzett folyamat azonosítója} \\ \hline + \text{Sorszám} & \text{32 bit} & \makecell[l]{\text{Az első adatbájt sorszáma az aktuális szegmensen belül}.\\\text{Ha a SYN jelzőbit értéke 1, akkor ez a sorszám a kezdeti sorszám, azaz}\\\text{az első adatbájt sorszáma a kezdeti sorszám + 1 lesz.}} \\ \hline + \text{Nyugtaszám} & \text{32 bit} & \makecell[l]{\text{Ha az ACK jelzőbit értéke 1, akkor}\\\text{a fogadó által következőnek fogadni kívánt sorszámot tartalmazza.}\\\text{Minden kapcsolat felépítés esetén elküldésre kerül.}} \\ \hline + \text{Fejléc hossza} & \text{4 bit} & \text{A TCP fejléc hossza 32-bites egységekben.} \\ \hline + \text{Ablak} & \text{16 bit} & \makecell[l]{\text{A nyugtázott bájttal kezdődően hány bájtot lehet elküldeni.}\\\text{(A 0 érték is érvényes.)}} \\ \hline + \text{Ellenőrzőösszeg} & \text{16 bit} & \text{Az adat-, fej-, és pszeudofejrész ellenőrzésére.} \\ \hline + \text{Opciók} & \text{0-40 bájt} & \makecell[l]{\text{A szabványos fejlécen kívüli lehetőségekre tervezték.}\\\text{Legfontosabb ilyen lehetőség az MSS, azaz}\\\text{a legnagyobb szegmens méret megadása.}\\\text{További opciók: MD5-aláírás, TCP-AO, "usertimeout", stb.}} \\ \hline + \text{Sürgősségi mutató} & \text{16 bit} & \makecell[l]{\text{A sürgős adat bájtban mért helyét jelzi a}\\\text{jelenlegi bájtsorszámhoz viszonyítva.}} \\ \hline + \text{Jelző bitek} & & + \renewcommand{\arraystretch}{1} + \begin{array}{l} + \text{URG – Sürgős jelzőbit.} \\ + \text{ACK – nyugta jelzés.} \\ + \text{PSH – Az jelzi, hogy gyors adattovábbítás kell a felhasználói rétegnek.} \\ + \text{RST – Kapcsolat egyoldalú bontását jelzi.} \\ + \text{SYN – Sorszám szinkronizációtjelez.} \\ + \text{FIN – Adatfolyam végét jelzi.} \\ + \end{array} + \renewcommand{\arraystretch}{2} + \end{array}$ + } + \renewcommand{\arraystretch}{1} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{img/tcp_fejlec.png} + \caption{TCP Fejléc} + \end{figure} + \noindent TCP jellemzői: + \begin{itemize} + \item Kapcsolatorientált + \item Megbízható + \item Kétirányú bájtfolyam + \end{itemize} + + \subsubsection*{UDP} + + Az UDP egy kapcsolat nélküli protokoll. A kommunikáció UDP csomagokkal (packet) történik, és a csomagok megérkezése nem garantált (elveszhetnek útközben). Továbbá, mivel az egyes csomagok akár más-más útvonalon is eljuthatnak a célhoz, a csomagok megérkezésének sorrendje is eltérhet a küldési sorrendtől. + + \begin{itemize} + \item Egyszerű, nem megbízható szolgáltatás csomagok küldésére + \item Az alkalmazási réteg határozza meg a csomag méretét + \item Az inputot egy datagrammá alakítja + \end{itemize} + Összeköttetés nélküli protokoll. Olyan szegmenseket használ az átvitelhez, amelyek egy 8 bájtos fejrészből, valamint a felhasználói adatokból állnak.\\ + + \noindent A fejrész tartalmaz: + \begin{itemize} + \item egy forrásportot(2 bájt) + \item egy célportot(2 bájt) + \item egy UDP szegmens hossz értéket (2 bájt) + \item egy UDP ellenőrzőösszeget (2 bájt) + \end{itemize} + Az UDP nem végez forgalomszabályozást, hibakezelést vagy újraküldést egy rossz szegmens fogadása után. \\ + + \noindent Kliens-szerver alkalmazások esetén kifejezetten hasznos lehet az UDP a rövid üzenetek miatt. \\ + + \noindent UDP-t alkalmaznak például olyan esetekben, ahol egy csomagot érdemes inkább eldobni, mint várni annak újraküldésére. \\ + + \noindent Ilyen lehet például: video-streaming, voice-over-IP alkalmazások (pl. internetes telefon), illetve bizonyos online játékok. + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/atlatszosag.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/atlatszosag.png new file mode 100644 index 0000000..150afe5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/atlatszosag.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/clockspeed.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/clockspeed.png new file mode 100644 index 0000000..56f0742 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/clockspeed.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dht.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dht.png new file mode 100644 index 0000000..5bedba8 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dht.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dns.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dns.png new file mode 100644 index 0000000..de3a083 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/dns.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/hls_insert.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/hls_insert.png new file mode 100644 index 0000000..2b8f98a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/hls_insert.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_elosztott.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_elosztott.png new file mode 100644 index 0000000..4ae18b6 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_elosztott.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_kozp.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_kozp.png new file mode 100644 index 0000000..3a5825a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/kolcskizar_kozp.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_okozati.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_okozati.png new file mode 100644 index 0000000..1678ea0 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_okozati.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_soros.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_soros.png new file mode 100644 index 0000000..ffd7369 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/konz_soros.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/nevter.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/nevter.png new file mode 100644 index 0000000..aa85291 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/nevter.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/rpc.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/rpc.png new file mode 100644 index 0000000..2a2f8cb Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/rpc.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/socket.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/socket.png new file mode 100644 index 0000000..6781708 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/socket.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/zsarnok.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/zsarnok.png new file mode 100644 index 0000000..3bc1924 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/img/zsarnok.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.pdf new file mode 100644 index 0000000..5e018ee Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.tex new file mode 100644 index 0000000..e357f9a --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/17.Osztott rendszerek/tetel17.tex @@ -0,0 +1,888 @@ +\documentclass[12pt]{article} + +\usepackage{caption} +\usepackage{subcaption} +\usepackage{multirow} +\usepackage[hungarian]{babel} +\usepackage{listings} +\usepackage{hhline} +\usepackage{graphicx} +\usepackage{float} +\usepackage{fancyhdr} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{makecell} +\usepackage[utf8]{inputenc} +\usepackage[thinlines]{easytable} +\usepackage[table,xcdraw]{xcolor} +\usepackage[normalem]{ulem} +\usepackage[a4paper, margin=1in]{geometry} +\usepackage{enumitem} +\usepackage{xcolor} + + \geometry{ + a4paper, + total={210mm,297mm}, + left=20mm, + right=20mm, + top=20mm, + bottom=20mm + } + +\DeclareCaptionType{mycapequ}[][List of equations] +\captionsetup[mycapequ]{labelformat=empty} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{17. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + {\Large\bfseries\noindent 17. Osztott rendszerek} \\ + + \section{Folyamatok, szálak} + + \noindent \textbf{Szál}: A szál (thread) a processzor egyfajta szoftveres megfelelője, minimális kontextussal. Ha a szálat + megállítjuk, a kontextus elmenthető és továbbfuttatáshoz visszatölthető.\\ + + \noindent \textbf{Folyamat}: A folyamat (process vagy task) egy vagy több szálat összefogó nagyobb egység. Egy folyamat + szálai közös memóriaterületen (címtartományon) dolgoznak, azonban különböző folyamatok nem látják egymás memóriaterületét.\\ + + \noindent \textbf{Kontextusváltás}: A másik folyamatnak/szálnak történő vezérlésátadás, így egy processzor több szálat/ folyamatot + is végre tud hajtani.\\ + + \noindent \textbf{Szál vs. folyamat}: A szálak közötti váltáshoz nem kell igénybe venni az oprendszer szolgáltatásait, míg + a folyamatok közötti váltásnál ahhoz, hogy a régi és új folyamat memóriaterülete elkülönüljön a memóriavezérlő (MMU) + tartalmának jó részét át kell írni, amihez csak a kernel szintnek van joga. A folyamatok létrehozása, törlése és a kontextusváltás + közöttük sokkal költségesebb a szálakénál. + + \section{Elosztott rendszerek tulajdonságai és felépítése} + + \noindent \textbf{Elosztott rendszer fogalma}: Az elosztott rendszer önálló számítógépek olyan összessége, amely kezelői számára + egyetlen koherens rendszernek tűnik. + + \subsection{Az elosztott rendszer céljai, tulajdonságai} + + Az elosztott rendszer céljai a következők: + + \begin{itemize} + \item Távoli erőforrások elérhetővé tétele + + \item Átlátszóság (transparency) + + \item Nyitottság (openness) + + \item Skálázhatóság + \end{itemize} + + \subsubsection{Átlátszóság} + + Az átlátszóság nem más, mint az erőforrásokkal kapcsolatos különböző információk elrejtése a felhasználó elől. + Az alapján, hogy mit rejtünk el, többféle fajtája létezik: + + \begin{figure}[H] + \centering + \includegraphics[width=0.8\linewidth]{img/atlatszosag} + \caption{Az átlátszóság különböző típusai.} + \label{fig:atlatszosag} + \end{figure} + + \subsubsection{Nyitottság} + + A rendszer képes más nyitott rendszerek számára szolgáltatásokat nyújtani, és azok szolgáltatásait igénybe venni: + + \begin{itemize} + \item A rendszerek jól definiált interfészekkel rendelkeznek. + \item Az alkalmazások hordozhatóságát (portability) minél inkább támogatják. + \item Könnyen elérhető a rendszerek együttműködése. + \end{itemize} + + \noindent A nyitott elosztott rendszer legyen könnyen alkalmazható heterogén környezetben, azaz + különböző hardvereken, platformokon, programozási nyelveken.\\ + + \noindent \textbf{Implementálása}: + + \begin{itemize} + \item Fontos, hogy a rendszer könnyen cserélhető elemekből álljon. + \item Belső interfészek használata, nem egyetlen monolitikus rendszer. + \item A rendszernek minél jobban paraméterezhetőnek kell lennie. + \item Egyetlen komponens megváltoztatása/cseréje lehetőleg minél kevésbé + hasson a rendszer más részeire. + \end{itemize} + + \subsubsection{Skálázhatóság} + + Többféle jelentése van, 3 fontos dimenzió: + + \begin{enumerate} + \item méret szerinti skálázhatóság: a felhasználók és/vagy folyamatok száma + \item földrajzi skálázhatóság: a csúcsok közötti legnagyobb távolság + \item adminisztrációs skálázhatóság: az adminisztrációs tartományok száma + \end{enumerate} + + \noindent Ezek közül a legtöbb rendszer a méret szerinti skálázhatóságot kezeli, ennek egy lehetséges megvalósítási + módja erősebb szerverek használata. A másik kettőt nehezebb kezelni.\\ +\newpage + \noindent Technikák a skálázhatóság megvalósítására: + + \begin{itemize} + \item A kommunikációs késleltetés elfedése azzal, hogy a válaszra várás közben más tevékenységet végzünk. Ehhez + aszinkron kommunikáció szükséges. + + \item Elosztás: az adatokat és számításokat több számítógép tárolja/végzi (pl. amit lehet, a klienssel számoltatunk ki, + elosztott elnevezési rendszerek használata, stb.) + + \item Replikáció/cache-elés: Több számítógép tárolja egy adat másolatait + \end{itemize} + + \noindent A skálázhatóságnak ára van. Több másolat fenntartása inkonzisztenciához vezethet (ha módosítjuk az egyiket, az eltérhet a többitől). + Ez globális szinkronizációval kikerülhető (minden egyes változtatás után az összes másolatot frissítjük), viszont a globális + szinkronizáció rosszul skálázódik. Emiatt sok esetben fel kell hagynunk a globális szinkronizációval, ez viszont bizonyos + mértékű inkonzisztenciát eredményez. Rendszerfüggő, hogy ez milyen mértékben megengedett. A cél az, hogy az inkonzisztencia mértéke + a megengedett szint alatt maradjon. + + \subsection{Elosztott rendszerek típusai} + + \noindent \textbf{Főbb típusok}: + \begin{itemize} + \item Elosztott számítási rendszerek: + \item Elosztott információs rendszerek + \item Elosztott átható rendszerek + \end{itemize} + + \subsubsection{Elosztott számítási rendszerek} + + Célja számítások végzése nagy teljesítménnyel.\\ + + \noindent \textbf{Cluster (fürt)}: Lokális hálózatra kapcsolt számítógépek összessége. Homogén rendszer (ugyanaz az oprendszer, + hardveresen hasonlóak), központosított vezérléssel (általában egy gépre).\\ + + \noindent \textbf{Grid (rács)} Nagyméretű hálózatokra is kiterjedhet, akár több szervezeti egységen is átívelhet. Heterogén + architektúra jellemzi.\\ + + \noindent \textbf{Cloud(felhő)}: Többrétegű architektúra: hardver, infrastruktúra, platform, alkalmazás. + + \subsubsection{Elosztott információs rendszerek} + + Az elsődleges cél általában adatok kezelése, illetve más információs rendszerek elérése. Például tranzakciókezelő rendszerek.\\ + + \noindent A tranzakció adatok összességén (pl. egy adatbázison, adatbázis objektumon, stb.) végzett művelet (lehetnek részműveletei).\\ + + \noindent A tranzakciókkal szemben az alábbi követelményeket szokás támasztani (ACID): + + \begin{itemize} + \item Oszthatatlan, elemi (atomicity): Vagy a teljes tranzakció végbemegy minden részműveletével, vagy az + adattárház egyáltalán nem változik. + + \item Konzisztens (consistency): Az adattárra akkor mondjuk, hogy érvényes, ha bizonyos, az adott adattárra + megfogalmazott feltételek teljesülnek. Egy tranzakció konzisztens, ha érvényes állapotot állít elő a tranzakció + végén. + + \item Elkülöníthető, sorosítható (isolation): Egyszerre zajló tranzakciók olyan eredményt adnak, mintha + egymás után hajtódtak volna végre. + + \item Tartósság (durability): Végrehajtás után az eredményt tartós adattárolóra mentjük, így az összeomlás esetén + visszaállítható. + \end{itemize} + + + \subsection{Elosztott rendszerek felépítése} + Alapötlet: A rendszer elemeit szervezzük logikai szerepük szerint különböző komponensekbe, és ezeket osszuk + el a rendszer gépein.\\ + + \subsubsection{Központosított architektúrák} + + \noindent \textbf{Kliens-szerver modell}: Egyes folyamatok (szerverek) szolgáltatásokat ajánlanak, míg más folyamatok (kliensek) + ezeket a szolgáltatásokat szeretnék használni. A kliens kérést küld a szervernek, amire a szerver válaszol, így veszi igénybe + a szolgáltatást. A kliens és szerver folyamatok különböző gépeken lehetnek. + + \subsubsection{Többrétegű architektúrák} + + Az elosztott információs rendszerek gyakran három logikai rétegre (layer vagy tier) vannak tagolva: + + \begin{itemize} + \item Megjelenítés: az alkalmazás felhasználói felületét alkotó komponensekből áll. + \item Üzleti logika: az alkalmazás működését írja le konkrét adatok nélkül + \item Perzisztencia: az adatok tartós tárolása + \end{itemize} + + \subsubsection{Decentralizált architektúrák} + + \noindent \textbf{Peer-to-peer (P2P)}: A csúcsok (peer-ek) között többnyire nincsenek kitüntetett szerepűek.\\ + + \noindent \textbf{Overlay hálózat}: A gráfban szomszédos csúcsok fizikailag lehetnek távol egymástól, + a rendszer elfedi, hogy a köztük lévő kommunikáció több gépen keresztül zajlik. A legtöbb P2P + rendszer overlay hálózatra épül.\\ + + \noindent \textbf{P2P rendszerek fajtái}: + \begin{itemize} + \item Strukturált P2P: A csúcsok által kiadott gráfszerkezet rögzített. A csúcsokat valamilyen struktúra + szerint overlay hálózatba szervezzük és a csúcsoktól az azonosítójuk alapján lehet szolgáltatásokat + igénybe venni. Pl.: elosztott hasítótábla (DHT). + + \item Struktúrálatlan P2P: Az ilyen rendszerek igyekeznek véletlen gráfstruktúrát fenntartani. Mindegyik + csúcsnak csak részleges nézete van a gráfról. Minden $P$ csúcs időnként véletlenszerűen kiválaszt egy $Q$ + szomszédot. $P$ és $Q$ információt cserélnek és elküldik egymásnak az általuk ismert csúcsokat. + + \item Hibrid P2P: néhány csúcsnak speciális szerepe van + \end{itemize} + + \noindent \textbf{Superpeer}: Olyan csúcs, aminek külön feladata van, pl. kereséshez index fenntartása, a hálózat + állapotának felügyelete, csúcsok közötti kapcsolatok létrehozása. + + \section{Elnevezési rendszerek} + + Az elosztott rendszerek entitásai a kapcsolódási pontjaikon (access point) keresztül érhetőek el. Ezeket távolról + a címük azonosítja, amely megnevezi az adott pontot.\\ + + \noindent Célszerű lehet az entitást a kapcsolódási pontjaitól függetlenül is elnevezni. Az ilyen nevek helyfüggetlenek (location + independent).\\ + + \noindent \textbf{Egyszerű név}: Nincs szerkezete, tartalmaz véletlen szöveg. Csak összehasonlításra használható.\\ + + \noindent \textbf{Azonosító}: Egy név azonosító, ha egy-egy kapcsolatban áll a megnevezett entitással, és ez + a hozzárendelés maradandó, azaz a név később nem hivatkozhat más egyedre. + + \subsection{Strukturálatlan nevek} + + \subsubsection{Egyszerű megoldások} + + \noindent \textbf{Broadcasting}: Kihirdetjük az azonosítót a hálózaton. Az egyed visszaküldi jelenlegi címét. + Hátrányai: + \begin{itemize} + \item Lokális hálózatokon túl nem skálázódik. + + \item A hálózaton minden gépnek figyelnie kell a beérkező kérésre. + \end{itemize} + + \noindent \textbf{Továbbítómutató}: Amikor az egyed elköltözik, egy mutató marad utána az új helyére. + \begin{itemize} + \item A kliens elől el van fedve, hogy a szoftver továbbítómutató-láncot old fel. + \item A megtalált címet vissza lehet küldeni a klienshez, így a további feloldások gyorsabban mennek. + \item Földrajzi skálázási problémák: + \begin{itemize} + \item A hosszú láncok nem hibatűrőek. + \item A feloldás hosszú időbe telik. + \item Külön mechanizmus szükséges a láncok rövidítésére. + \end{itemize} + \end{itemize} + + \subsubsection{Otthon alapú megoldások} + + \noindent \textbf{Egyrétegű rendszer}: Az egyedhez tartozik egy otthon, ez tartja számon az egyed jelenlegi címét. Az + egyed otthoni címe (home address - HA) be van jegyezve egy névszolgáltatásba. Az otthon számon tartja a jelenlegi + címet (foreign address - FA). A kliens az otthonhoz kapcsolódik, onnan kapja meg a címet.\\ + + \noindent \textbf{Kétrétegű rendszer}: Az egyes környékeken feljegyezzük, hogy mely egyedek tartózkodnak a közelben. + A névfeloldás először ezt a jegyzéket vizsgálja meg és ha az egyed nincs a környéken, akkor kell az otthonhoz fordulni. + + \subsubsection{Elosztott hasítótábla} + + Elosztott hasítótáblát (DHT) készítünk, ebben csúcsok tárolnak egyedeket. Az $N$ csúcs gyűrű overlay szerkezetbe + van szervezve. Minden csúcshoz hozzárendelünk egy $m$ bites azonosítót, és mindegyik entitáshoz egy $m$ bites kulcsot + ($N \leq 2^{m}$). A $k$ kulcsú egyed felelőse az az $id$ azonosítójú csúcs, amelyre $k \leq id$, és nincs köztük másik + csúcs. Ezt a csúcsot a kulcs rákövetkezőjének is szokás nevezni: $succ(k)$. Mindegyik $p$ csúcs egy $FT_{p}$ finger + table-t tárol $m$ bejegyzéssel: $FT_{p}[i] = succ (p+2^{i-1})$. Bináris (jellegű) keresést szeretnénk elérni, ezért + minden lépés felezi a keresési tartományt. A $k$ kulcsú egyed kikereséséhez (ha nem a jelenlegi csúcs tartalmazza) + a kérést továbbítjuk ahhoz a $j$ indexű csúcshoz, melyre $FT_{p}[j] \leq k < FT_{p}[j+1]$, illetve, ha + $p\frac{n}{2}$. + Feltesszük, hogy egy esetleges összeomlás után a koordinátor felépül, de a kiadott engedélyeket + elfelejti. + + \subsubsection{Elosztott kölcsönös kizárás} + + Többszörözött az erőforrás. Amikor a kliens hozzá szeretne férni az erőforráshoz, kérést küld a koordinátornak + időbélyeggel ellátva. Választ (hozzáférési engedélyt) akkor kap, ha: + + \begin{itemize} + \item A koordinátor nem igényli az erőforrást, vagy + \item a koordinátor is igényli az erőforrást, de kisebb az időbélyege. + \item Különben a koordinátor átmenetileg nem válaszol. + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/kolcskizar_elosztott} + \caption{Példa elosztott kölcsönös kizárásra.} + \label{fig:kolcskizar_elosztott} + \end{figure} + + \subsubsection{Kölcsönös kizárás token ring-gel} + + A folyamatokat egy logikai gyűrűbe szervezzük. Egy tokent küldünk körbe. Amelyik folyamat birtokolja a tokent, az + férhet hozzá az erőforráshoz. + + \subsection{Vezetőválasztás} + + Sok algoritmusnak szüksége van arra, hogy kijelöljön egy folyamatot, amely a további lépéseket koordinálja. + + \subsubsection{Zsarnok-algoritmus} + + A folyamatoknak sorszámot adunk, melyek közül a legnagyobb sorszámút szeretnénk vezetőnek választani.\\ + + \noindent A zsarnok-algoritmus lépései: + \begin{enumerate} + \item A vezetőválasztás kezdeményezése. Bármelyik folyamat kezdeményezheti. Mindegyik olyan folyamatnak, + amelyről nem tudja, hogy kisebb lenne az övénél a sorszáma, elküld egy üzenetet. + + \item Ha a nagyobb sorszámú folyamat üzenetet kap egy kisebb sorszámútól, akkor visszaküld neki egy + olyan üzenetet, amivel kiveszi a kisebb sorszámút a választásból. + + \item Amelyik folyamat nem kap letiltó üzenet egy bizonyos időn belül, akkor ő lesz a vezető. Erről + értesíti a többi folyamatot egy-egy üzenettel. + \end{enumerate} + + \begin{figure}[H] + \centering + \includegraphics[width=0.6\linewidth]{img/zsarnok} + \caption{Példa a zsarnok-algoritmus működésére.} + \label{fig:zsarnok} + \end{figure} + + \subsubsection{Vezetőválasztás gyűrűben} + + Logikai gyűrűnk van, a folyamatoknak vannak sorszámai. A legnagyobb sorszámú folyamatot szeretnénk vezetőnek választani. + Bármelyik folyamat kezdeményezhet vezetőválasztást: elindít egy üzenetet a gyűrűn körbe, amelyre mindenki ráírja a + a sorszámát. Ha egy folyamat összeomlott, az kimarad az üzenetküldésből. Amikor az üzenet visszajut a kezdeményezőhöz, + minden aktív folyamat sorszáma szerepel rajta. Ezek közül a legnagyobb sorszámú lesz a vezető. Ezt egy másik + üzenet körbeküldése tudatja mindenkivel.\\ + + \noindent Ha több folyamat kezdeményez egyszerre választást, az nem probléma, ugyanaz az eredmény adódik. Ha az üzenetek + elvesznének, akkor újra lehet kezdeni a választást. + + \subsubsection{Superpeer-választás} + + A superpeer-eket úgy szeretnénk megválasztani, hogy teljesüljön rájuk: + + \begin{itemize} + \item A többi csúcs alacsony késleltetéssel éri el őket. + \item Egyenletesen vannak elosztva a hálózaton. + \item A csúcsok megadott hányadát választjuk superpeer-nek. + \item Egy superpeer korlátozott számú peer-t szolgál ki. + \end{itemize} + + \noindent \textbf{Megvalósítás DHT esetén}: Ha $m$-bites azonosítókat használunk, és $S$ superpeer-re van szükség, akkor + a $k= \lceil \log_{2} S \rceil$ felső bitet foglaljuk le a superpeer-ek számára. Így N csúcs esetén kb. $2^{k-m}N$ + superpeer lesz.\\ + + \noindent A $p$ kulcshoz tartozó superpeer a $p$ AND $\underbrace{11...11}_{k}\underbrace{00..00}_{m-k}$ kulcs felelőse lesz. + + \section{Konzisztencia} + + \noindent \textbf{Konfliktusos műveletek}: A replikátumok konzisztensen tartásához biztosítani kell, hogy az egymással + konfliktusba kerülhető műveletek minden replikátumon egyforma sorrendben futnak le. Írás-olvasás és írás-írás + konfliktusok fordulhatnak elő.\\ + + \noindent \textbf{Konzisztenciamodell}: A konzisztenciamodell megszabja, milyen módokon használhatják a folyamatok + az adatbázist. Ha a feltételek teljesülnek, az adattárat érvényesnek tekintjük.\\ + + \noindent \textbf{Konzisztencia mértéke}: A konzisztencia többféle módon is sérülhet: eltérhet a replikátumok + számértéke, frissessége, meg nem történt frissítési műveletek száma.\\ + + \noindent \textbf{Conit}: Az olyan adategység, amelyre közös feltételrendszer vonatkozik, a conit (consistency unit). + + \subsection{Soros konzisztencia} + + A feltételeket nem számértékekre, hanem írások/olvasások tényére alapozzuk. + Jelölések: + \begin{itemize} + \item W(x) : x változót írta a folyamat + \item R(x) : x változót olvasta a folyamat + \end{itemize} + + \noindent Soros konzisztencia esetén azt várjuk el, hogy a végrehajtás eredménye olyan legyen, mintha az összes folyamat + összes művelete egy meghatározott sorrendben történt volna meg, megőrizve bármely adott folyamat saját műveletinek + sorrendjét. + + \begin{figure}[H] + \centering + \includegraphics[width=0.7\linewidth]{img/konz_soros} + \caption{Példa: az (a) teljesíti, (b) nem a soros konzisztencia követelményeit.} + \label{fig:konz_soros} + \end{figure} + + \subsection{Okozati konzisztencia} + + A potenciálisan okozati összefüggésben álló műveleteket kell mindegyik folyamatnak azonos sorrendben látnia. + A konkurens írásokat a különböző folyamatok különböző sorrendben láthatják. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\linewidth]{img/konz_okozati} + \caption{Példa: a (b) teljesíti, (a) nem az okozati konzisztencia követelményeit.} + \label{fig:konz_okozati} + \end{figure} + + \subsection{Kliensközpontú konzisztencia} + + Azt helyezzük most előtérbe, hogy a szervereken tárolt adatok hogyan látszanak egy adott kliens számára. A kliens + mozog: különböző szerverekhez csatlakozik, és írási/olvasási műveleteket hajt végre.\\ + + \noindent Az $A$ szerver után a $B$ szerverhez csatlakozva különböző problémák léphetnek fel: + + \begin{itemize} + \item Az $A$-ra feltöltött frissítések lehet, hogy nem jutottak még el $B$-hez. + \item $B$-n lehet, hogy újabb adatok találhatóak, mint $A$-n. + \item A $B$-re feltöltött frissítések ütközhetnek az $A$-ra feltöltöttekkel. + \end{itemize} + + \noindent A cél az, hogy a kliens azokat az adatokat, amiket az $A$ szerveren kezelt, ugyanolyan állapotban + lássa $B$-n is. Ekkor az adatbázis konzisztensnek látszik a kliens számára.\\ + + \paragraph*{Monoton olvasás} + Ha egyszer a kliens kiolvasott egy értéket $x$-ből, minden ezután következő + olvasás ezt adja, vagy ennél frissebb értéket.\\ + + {\small \noindent Például levelezőkliens esetén minden korábban letöltött levelünknek meg kell lennie az új szerveren is.} + + \subsubsection*{Monoton írás} + + A kliens akkor írhatja $x$-et, ha kliens korábbi írásai $x$-re már befejeződtek.\\ + + {\small \noindent Például verziókezelésnél minden korábbi verziónak meg kell lennie a szerveren, ha új verziót akarunk feltölteni.} + + \paragraph*{Olvasd az írásodat} + + Ha kliens olvassa $x$-et, a saját legutolsó írásának eredményét kapja, vagy frissebbet.\\ + + {\small \noindent Például a kliens a honlapját szerkeszti, majd megnézi az eredményt. Ahelyett, hogy a böngésző gyorsítótárából + egy régebbi változat kerülne elő, a legfrissebbet szeretné látni.} + + \paragraph*{Írás olvasás után} + + Ha a kliens kiolvasott egy értéket $x$-ből, minden ezután kiadott frissítési művelete $x$-nek legalább + ennyire friss értékét módosítja.\\ + + {\small \noindent Például egy fórumon a kliens csak olyan hozzászólásra tud válaszolni, amit már látott.} + + \paragraph*{Tartalom replikálása} + + Különböző jellegű folyamatok tárolhatják a másolatokat: + + \begin{itemize} + \item Tartós másolat: eredetszerver (origin server) + \item Szerver által kezdeményezett másolat: replikátum kihelyezése egy szerverre, amikor az igényli + az adatot + \item Kliens által kezdeményezett másolat: kliensoldali gyorsítótár + \end{itemize} + + \paragraph*{Frissítés terjesztése} + + Megváltozott tartalmat több különféle módon lehet kliens-szerver architektúrában átadni: + + \begin{itemize} + \item Kizárólag a frissítésről szóló értesítés/érvénytelenítés elterjesztése. + \item Passzív replikáció: adatok átvitele egyik másolatról a másikra + \item Aktív replikáció: frissítési művelet átvitele + \end{itemize} + + A frissítést kezdeményezheti a szerver (küldésalapú frissítés), ekkor a szerver a kliens kérése nélkül elküldi a frissítést + a kliensnek, vagy kezdeményezheti a kliens, aki kérvényezi a frissítést a szervertől (rendelésalapú frissítés).\\ + + \noindent \textbf{Haszonbérlet (lease)}: A szerver ígéretet tesz a kliensnek, hogy átküldi a frissítést, amíg a haszonbérlet aktív. +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/cross-join.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/cross-join.png new file mode 100644 index 0000000..72d4d05 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/cross-join.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/dekomp1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/dekomp1.png new file mode 100644 index 0000000..1af661b Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/dekomp1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/diagram.drawio new file mode 100644 index 0000000..3bad567 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/diagram.drawio @@ -0,0 +1 @@ +7Vvfd6I4FP5rfBwPIYLyqLbdeZg5nbPuObv7SCVKtkCcGEc7f/0mkABKqLRKahVflEvIr++7X24itwen8e4P6q/C7yRAUc+2gl0P3vVsG1hDm38Jy0tm8RxpWFIcyEKFYYZ/I/WktG5wgNZ7BRkhEcOrfeOcJAmasz2bTynZ7hdbkGi/1ZW/RBXDbO5HVevfOGBhZh05VmH/ivAyVC0DS96JfVVYGtahH5BtyQTve3BKCWHZr3g3RZGYPDUv2XMPNXfzjlGUsCYP/PPkju58+3n4L/H/epw8PnyLZ19kLb/8aCMHLDvLXtQMhCyO+C/Qg5N8CBa/CPx1iAJ5we+sRPl4txQ86D/xYa0Z/9mnNIVlQiW2jijNKHlGUxIRmrYBh/dj917Us8BRVLIv0g+3b0PM0Gzlz0UVW16vKEsSViprpZ+8doWWLUvK5oFoXw4aUYZ2tbMJcow4uRGJEaMvvIh8YCRRlbR25eW24IirOBKW+JE/50teLvOaC+j4D4neG5C0NUi6EZOjTz1ETZX7cyNIN5GT5nllUwl6ZRQVfFmn8zfmBYCz2qVFi4fcpfj+k/v+FPbGYI7F9wSqHvABZZ3Iyp2bYoysJhvGSPIqzXASIopZlWQ5cYT9kXMMM4EqrFLMSz8aQqXXcjxiFH6El7w3dxFaiAbXotJk+S29ugNWDaEpEpOsiAuaErXesavsPcbPgbRRFPkM/9oXwbNzdtC++mTiczoTmuH1LqH5UPxkEz8ITkXiZb8a9QRZLNaIVfDOO/Z+CrgVCoyVanCvSer1aCtHLRQpITT2o0y+mooVYxQ/pTI1Zpu4pFRZs0qpZFc2TycpIyjXL+pqRwi1bE9Igg6orkxvU7F6F8gjoNM0a3CU86ANzh+s6O1zfngTnLc7zl885/mSZ4r0owrp+/1+R4YLIgM0p4De51DAV7vSoLVzSWlcJ6U13e+c6m1OZbXnVI5lzKmgc3w71WQjVFg5EwKMii1wcec8lLqQTZXc9ICmhziHu6Pj+ylzygqrweXlrbOmJSDzjBvYWcDPEGXdGPoGY2xYjas6+D8YfoNRtepxB38D+BU8XnXRBzboj4bOSQu/cekHDf7K66K/jztSB7Y5KsAqFcT/ch5l2ffzezamukPt6ec42DatOeA41a4j3gSaf/BaYtrnOE6+MaYZjG1B9XSjC24+GH6DsS00t6bVnrZ2VLuBOHrQxdEnnaLa1hWcog7MqE3SRdCveuENRNADfQQ9Oo1puj8Rky6IvkyyGQyiB10QfXHwmzwgrr5t2day1gXRb6HatQXRjiZ+OkSekk0SpBCDmqkvcUODZSWJROYyHCaAQA3ujRA8gpWKc+szQLTvlbSXAeLoXqfPnPC0yOEgkeT9FT2uf0dkVZsVkpvr5YLjdbhxauj6ytXnHF/E7ROBPp770VjeiHEQiGb0KpCTVegRyVMDHKunTUTSZomcg3Vwn3V2lXUDHela45zunaOL4tyMw3L1hHNd2JLM2ft8A5oVyizhNCGMgZXF8zSphS1N+UFqIRid4UDltDmvvlN2YU7+gP7LUg+9+fU7u8pRa9/ZQWvOzi+LzOcs6izyx+H9/w== \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek.png new file mode 100644 index 0000000..568fef4 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek1.png new file mode 100644 index 0000000..e19cfa5 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek2.png new file mode 100644 index 0000000..63c1132 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek3.png new file mode 100644 index 0000000..bdda02a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek4.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek4.png new file mode 100644 index 0000000..4af4431 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek4.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek5.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek5.png new file mode 100644 index 0000000..0e8f4b1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek5.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek6.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek6.png new file mode 100644 index 0000000..1702005 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek6.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek7.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek7.png new file mode 100644 index 0000000..068b8b1 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek7.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek8.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek8.png new file mode 100644 index 0000000..8b6b687 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek8.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek9.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek9.png new file mode 100644 index 0000000..a961ca2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/ek9.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.gif b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.gif new file mode 100644 index 0000000..ace249e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.gif differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.jpg new file mode 100644 index 0000000..ce90927 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_fulljoin.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.gif b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.gif new file mode 100644 index 0000000..db00126 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.gif differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.jpg new file mode 100644 index 0000000..e519f4d Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_innerjoin.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.gif b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.gif new file mode 100644 index 0000000..f205846 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.gif differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.jpg new file mode 100644 index 0000000..e1b81dc Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_leftjoin.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.gif b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.gif new file mode 100644 index 0000000..f34c021 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.gif differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.jpg new file mode 100644 index 0000000..bac687f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/img_rightjoin.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/null.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/null.png new file mode 100644 index 0000000..a994557 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/null.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/oo.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/oo.png new file mode 100644 index 0000000..c8d8e7a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/oo.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/plsql1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/plsql1.png new file mode 100644 index 0000000..17093ef Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/plsql1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm1.png new file mode 100644 index 0000000..91a893c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm2.png new file mode 100644 index 0000000..3c725a7 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm3.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm3.png new file mode 100644 index 0000000..b78bebf Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/psm3.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/relalg1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/relalg1.png new file mode 100644 index 0000000..95316bf Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/relalg1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql1.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql1.png new file mode 100644 index 0000000..a8e7809 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql1.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql2.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql2.png new file mode 100644 index 0000000..5c5e28a Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/sql2.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/table_relation.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/table_relation.png new file mode 100644 index 0000000..6ba593c Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/img/table_relation.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.pdf new file mode 100644 index 0000000..c774eaa Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.tex new file mode 100644 index 0000000..de2e80b --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/18.Adatbázisok tervezése és lekérdezése/tetel18.tex @@ -0,0 +1,2722 @@ +\documentclass[tikz,12pt,margin=0px]{article} + +\usepackage[a4paper,bindingoffset=0.2in, + left=1.5cm,right=1.5cm,top=1.25cm,bottom=1.5cm,% + footskip=.3in]{geometry} +\usepackage[normalem]{ulem} +\usepackage[utf8]{inputenc} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{comment} +\usepackage{color, colortbl} +\usepackage[dvipsnames]{xcolor} +\usepackage{dsfont} +\usepackage{enumitem} +\usepackage{multirow} +\usepackage{fancyhdr} +\usepackage{float} +\usepackage{fontawesome} +\usepackage{makecell} +\usepackage{tikz} +\usepackage{titlesec} +\usepackage[hungarian]{babel} +\usetikzlibrary{positioning,calc,shapes.multipart,arrows,arrows.meta,matrix,automata,shapes.misc,er} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\titleformat*{\section}{\Large\bfseries} +\titleformat*{\subsection}{\large\bfseries} +\titleformat*{\subsubsection}{\normalsize\bfseries} +\titleformat*{\paragraph}{\small\bfseries} +\titleformat*{\subparagraph}{\footnotesize\bfseries} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} + +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{18. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\tikzstyle{line} = [draw,thick] + +\colorlet{notgray}{gray!20!white} +\colorlet{notblue}{green!25!white} +\colorlet{notgreen}{green!10!white} +\newcolumntype{g}{>{\columncolor{notgray}}c} +\newcolumntype{b}{>{\columncolor{notblue}}c} +\newcolumntype{e}{>{\columncolor{notgreen}}c} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 18. Adatbázisok tervezése és lekérdezése} \\ + \end{center} + + \section*{Relációs adatmodell, egyed-kapcsolat modell és átalakítása relációs adatmodellbe} + + \subsection*{Relációs adatmodell\\} + + \textbf{Adatmodell}: Egy adatmodell a valóság objektumait (egyedeit), azok tulajdonságait, ill. a köztük lévő kapcsolatokat ábrázolja. Az adatmodell a számítógép és felhasználó számára is megadja, hogy hogyan néznek ki az adatok. Az adatok leírására szolgáló jelölés, melynek részei: + + \begin{itemize} + \item \textbf{az adat struktúrája} (\emph{statikus elemek}) + \item \textbf{az adaton végezhető műveletek} (\emph{dinamikus elemek}) + \item \textbf{az adatokra tett megszorítások} (\emph{integritási feltételek)}\\ + {\small Például: egy személyi igazolvány számhoz nem tartozhat két különböző ember} + \end{itemize} + + \noindent \textbf{Relációs adatmodell}: A relációs adatmodellben egy adatbázis kétdimenziós adattáblák összessége, ahol minden adattábla egy reláció vagyis sorok (rekordok) halmaza.\\ + + \noindent \textbf{Reláció}: Az adatelemek megnevezett, összetartozó csoportjából kialakított olyan kétdimenziós táblázat, amelyik sorokból (rekordok) és oszlopokból (attribútumok) áll. A relációnak egyedi neve van és oszlopait az attribútumok címzik. A reláció rekordjait tetszőlegesen megcserélhetjük, sorok sorrendje lényegtelen (a halmazszemlélet miatt).\\ + + \noindent \emph{Formálisan}: Legyenek $H_{1}, \ldots, H_{n}$ alaphalmazok, akkor $r \subset H_{1} \times \ldots \times H_{n}$ részhalmazt relációnak nevezzük.\\ + + \noindent \textbf{Attribútumok}: A reláció fejrészében találhatóak az attribútumok. Minden attribútumhoz tartozik egy értékkészlet, amelyből felveheti értékeit. Az $i$-edik attribútum értékkészletét $dom(A_i)$ jelöli.\\ + + \noindent Adattípus vagy \emph{sortípus}: + \begin{center} + $\big<\textit{attr.név}_1 : \text{értéktípus}_1,\ \ldots,\ \textit{attr.név}_{n} : \text{értéktípus}_{n}\big>$, ahol $\text{attr.név}_{i} \boldsymbol{\neq} \text{attr.név}_{j}\quad (\forall i \neq j)$.\\ + \end{center} + + \noindent A reláció nevét és a reláció attribútumainak halmazát együtt nevezzük \emph{\textbf{relációsémának}}.\\ + \noindent \emph{Relációséma}: \textbf{\emph{Relációnév(sortípus)}}, azaz + \begin{center} + $R(\textit{attr.név}_1 : \text{értéktípus}_1, \ldots, \textit{attr.név}_{n} : \text{értéktípus}_{n})$\\ + $\Updownarrow$\\ + $R(A_{1}, \ldots, A_{n}) \Leftrightarrow R(U),\ U = \big\{A_{1}, \ldots, A_{n}\big\}$. + \end{center} + + \noindent A relációs modellben az adatbázis egy vagy több relációsémát tartalmaz. A relációsémákból álló halmazt az adatbázisban \emph{\textbf{relációs adatbázissémának}} vagy röviden \emph{\textbf{adatbázissémának}} nevezzük.\\ + + \noindent Adatbázis séma jelölése: $\mathds{R}$, ahol $\mathds{R} = \{R_1 , ... , R_k\}$. + +\newpage + \paragraph*{Relációs séma feletti reláció előfordulás (példány, instance)} + + A reláció azon sorait, amelyek különböznek az attribútumokból álló fejléc soraitól, \emph{\textbf{sor}}oknak (tuple) nevezzük. A reláció minden egyes attribútumához tartozik a sorban egy \emph{komponens}.\\ + + \noindent Egy reláció előfordulásainak halmaza a sor-típusnak megfelelő véges sok sor (sorok halmaza), azaz + \[ + {t_1, \ldots , t_n}\ \text{ahol}\ t_i\ \text{(tuple, sor, rekord)}\quad (i = 1, \ldots, n)\quad \text{(véges sok)} + \] + + \noindent Mit jelent egy konkrét sor (rekord)? + \begin{center} + $t_{i}: ,\ \text{ahol}\ \text{érték}_{i, j} \in dom(A_{j}) \quad (i \in 1, \ldots, n,\ j \in 1, \ldots, m)$ + \end{center} + \begin{itemize} + \item \emph{n} - számosság (sorok (rekordok) száma) + \item \emph{m} - dimenzió (oszlopok (attribútumok) száma) + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=0.66\textwidth]{img/table_relation.png} +% \caption{PSM kurzor ciklusának szerkezete} + \end{figure} + + \noindent Az attribútumok sorrendje nem rögzített a relációsémában. Azonban egy-egy előfordulás ábrázolása esetén viszont rögzítésre kerül.\\ + + \noindent A relációs modellben követelmény, hogy minden sor minden komponense atomi, azaz elemi típusú legyen (például egész vagy karaktersorozat).\\ + + \noindent \paragraph*{Kulcsok\\} + + \noindent A $K \subseteq \{A_1, \ldots, A_n\}$ attribútumhalmazt, amelyre az $r \in R(A_1, \ldots, A_n)$ reláció minden sorára különböző \emph{\textbf{szuperkulcs}}nak nevezzük: + \[ + \forall t_i, t_j \in r,\ i \neq j : t_1[K] \neq t_2[K] + \] + + \noindent A $K$ attribútumhalmazt \emph{\textbf{kulcs}}nak nevezzük, ha minimális szuperkulcs.\\ +% \begin{enumerate} +% \item Ezek az attribútumok funkcionálisan meghatározzák a reláció minden más attribútumát, azaz nincs az $R$-ben két olyan különböző sor, amely mindegyik $A_1, \ldots, A_{n}$-en megegyezne. +% \item Nincs olyan valódi részhalmaza $\{A_1, \ldots, A_{n}\}$-nek, amely funkcionálisan meghatározná az $R$ összes többi attribútumát, azaz a kulcsnak minimálisnak kell lennie. +% \end{enumerate} + + \noindent Egy relációsémában több kulcs is előfordulhat, vagyis több attribútumhalmazt is ki tudunk jelölni kulcsként. + + \begin{itemize} + \item A kulcs egy attribútumból áll: \textbf{\emph{egyszerű kulcs}} + \item A kulcsot több attribútum alkotja: \textbf{\emph{összetett kulcs}}. + \begin{itemize} + \item Ha több kulcs is meghatározható a sémában, akkor kijelöljük az egyiket, amelyet \textbf{\emph{elsődleges kulcs}}nak nevezünk. + \end{itemize} + \end{itemize} +\newpage + \noindent \textbf{Külső vagy idegen kulcs}: Ha egy attribútum egy másik séma elsődleges kulcsára hivatkozik. + \begin{itemize} + \item $R(A_1,...A_m)$ reláció, és $X=\{A_{i_1},...A_{i_k}\}$ kulcs. + \item $S(B_1,...B_n)$ reláció, és $Y=\{B_{j_1},...B_{j_k}\}$ idegen kulcs. + \item Az $Y$ az $X$-re hivatkozik a megadott attribútum sorrendben: $B_{j_1} \to A_{i_1}$-re, és így tovább.\\ + \end{itemize} + + \noindent \textbf{Hivatkozási épség}: Megszorítás a két tábla együttes előfordulására.\\ + Ha $s \in R_1$ sor, akkor $\exists t \in R_2$ sor, amelyre + \[ + s[B_{j_1},...B_{j_k}] = t[A_{i_1},...A_{i_k}] + \] + + {\small + \noindent A relációs adatmodell több szempontból is előnyös, amik miatt elterjedt és kifinomult. + \begin{itemize} + \item Az adatmodell egy egyszerű és könnyen megérthető strukturális részt tartalmaz. + \item A természetes táblázatos formát nem kell magyarázni, és jobban alkalmazható. + \item A relációs modellben a fogalmi-logikai-fizikai szint teljesen szétválik, nagyfokú logikai és fizikai adatfüggetlenség. + \item A felhasználó magas szinten, hozzá közel álló fogalmakkal dolgozik (implementáció rejtve). + \item Elméleti megalapozottság, több absztrakt kezelő nyelv létezik, például relációs algebra\\ + (ezen alapul az SQL automatikus és hatékony lekérdezés optimalizálása). + \item Műveleti része egyszerű kezelői felület, szabvány SQL. + \end{itemize} + } + + \subsection*{Egyed-kapcsolat (E/K) modell\\} + + \noindent Grafikus ábrázolási mód, amellyel egy-egy adatbázis sémája megtervezhető. Az egyed-kapcsolat modellben az adatok szerkezetét grafikusan, egyedkapcsolat diagramon ábrázoljuk. Az így elkészített ábra később könnyen átalakítható relációs adatmodellé. \\ + + \noindent A diagram elemei: + \begin{itemize} + \item egyedhalmazok + \item attribútumok + \item kapcsolatok\\ + \end{itemize} + + \noindent \textbf{\emph{Egyed}}: Az a valami, dolog, amit ismeretekkel akarunk leírni; valami ami van és megkülönbözhető. Az egyedek a valóság azon elemei, melyek számunkra valamilyen lényeges információt hordoznak, \emph{egymástól megkülönböztethetők}.\\ + + \noindent \textbf{\emph{Egyedhalmazok}}: Hasonló egyedek összessége. Diagrammon: \emph{téglalap}.\\ + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \node[entity] (node1) [top color=white, bottom color=blue!20, draw=blue!50!black!100] {Diák}; + \end{tikzpicture}\\ + \end{center} +\newpage + \noindent \textbf{\emph{Tulajdonság}} (\emph{attribútum}): A tulajdonság az, amivel az egyedet leírjuk, ami alapján az egyedhalmaz egyedei megkülönböztethetőek a többi egyedtől. A tulajdonság egy konkrét értéke a tulajdonság előfordulása. A tulajdonság előfordulások összességét \lword{tulajdonsághalmaznak} nevezzük. Az attribútumok atomiak, tehát nincs belső szerkezetük. Diagrammon: \emph{ovális}.\\ + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every attribute} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[entity] (node1) {Diák} + child {node[attribute] (name) [above of=node1] {Név}} + child {node[attribute] (birthdate) [left of=node1,node distance=3.5cm]{SzületésiDátum}} + child {node[attribute] (birthplace) [right of=node1,node distance=3.5cm] {SzületésiHely}}; + \end{tikzpicture} + \end{center} + + \noindent \emph{Összetett tulajdonság} (\emph{attribútum}): Olyan tulajdonság, amelynek magának is vannak tulajdonságai. + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every attribute} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[attribute] (attr1) {Lakcím}; + \node[attribute, node distance=2.5cm] (cityattr) [left of= attr1] {Város}; + \node[attribute, node distance=1.5cm] (streetattr) [below of=attr1]{Közterület}; + \node[attribute, node distance=3.0cm] (placenumberattr) [right of=attr1] {Házszám}; + \path [line] (attr1) -- (cityattr); + \path [line] (attr1) -- (streetattr); + \path [line] (attr1) -- (placenumberattr); + \end{tikzpicture} + \end{center} + + \noindent \emph{Többértékű tulajdonság}: nem egyetlen adat jellemzi a tulajdonságot, hanem adatok halmaza (sorrendiség nélkül) vagy listája (sorrend számít). + + \begin{center} + \begin{tikzpicture}[auto] + \tikzstyle{every attribute} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[entity] (node1) {Könyv}; + \node[attribute, node distance=3.0cm, double] (author) [right of=node1] {Szerző}; + \path[line] (node1) -- (author); + \end{tikzpicture} + \end{center} + + \noindent \textbf{\emph{Séma}}: $E(A_1,...A_n)$ egyedhalmaz séma ahol: + \begin{itemize} + \item $E$ név, + \item $A_i$ tulajdonság (attribútumok), + \item $dom(A_i)$ a lehetséges értékek halmaza. + \end{itemize} + + \noindent \textbf{\emph{Előfordulás}}: $E(A_1,...A_n)$ egyedhalmaz séma egy előfordulása $E=\{e_1,\ldots,e_m\}$ + \begin{itemize} + \item $e_i(k) \in dom(A_k)$ az egyedek halmaza. + \item Semelyik két egyed nem egyezik meg minden attribútumán $\to$ (vagyis az összes tulajdonság szuperkulcsot alkot), minimális szuperkulcs = kulcs. + \end{itemize} + + \noindent \textbf{\emph{Kapcsolatok}}: Kapcsolat két vagy több egyedhalmazt köthet össze egymással. A kapcsolatok tulajdonképpen egyedosztályok előfordulásai közötti relációk. A kapcsolatokat elláthatjuk névvel és a tartozhatnak hozzá attribútumok is. Diagrammon: \emph{rombusz}. + \begin{itemize} + \item $K(E_1,\ldots, E_{k}, A_1, \ldots, A_n)$ egy kapcsolat sémája, ahol: + \begin{itemize} + \item $K$ a kapcsolat neve, + \item $E_i$ az egyedhalmazok sémái, + \item $A_1, \ldots, A_n$ a kapcsolathoz tartozó attribútumok + \end{itemize} + \item Ha $k=2$, akkor bináris kapcsolatról, $k > 2$ esetén többágú kapcsolatról beszélünk. + \item $K(E_1, \ldots,E_p)$ sémájú kapcsolat előfordulása, $K=\{(e_1, \ldots, e_p)\}$ egyed $p$-esek halmaza, ahol $e_i \in E_i$. A kapcsolat előfordulásaira tett megszorítások határozzák meg a kapcsolat típusát. + \end{itemize} + + \noindent \textbf{\emph{Kapcsolat attribútum}}: A kapcsolattípusoknak is lehetnek attribútumaik, amelyek hasonlóak az egyedtípusokéihoz. A kapcsolat attribútuma a két egyedhalmaz együttes függvénye, de egyiké sem külön. + + \subsection*{Kapcsolatok típusai} + + \begin{itemize} + \item \emph{\textbf{egy-egy} (1:1)}: Egy $E_1$-beli egyedhez pontosan egy $E_2$-beli egyed tartozhat és fordítva.\\ + {\small Például: Ha a magyar nők és a magyar férfiak közötti jogi értelemben vett érvényes házastársi kapcsolatot szeretnénk modellezni, akkor egy-egy kapcsolatot kell alkalmaznunk.} + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every node} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[relationship] (joins) [right = of node1] {házasság} (node1); + \node[entity] (pgroup1) [right = of joins] {Férj} edge [<-, line width=1pt] (joins); + \node[entity] (pgroup2) [left = of joins] {Feleség} edge [<-, line width=1pt] (joins); + \end{tikzpicture} + \end{center} + \item \emph{\textbf{egy-sok} (1:n)}: Minden $E_2$-beli egyedhez legfeljebb $E_1$-beli egyed kapcsolódik, de egy $E_1$-beli egyedhez több $E_2$-beli egyed kapcsolódhat.\\ + {\small Például: Egy anyának egy vagy több gyermeke is lehet, de egy gyermeknek csak és kizárólag egy vér szerinti anyukája lehet.} + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every node} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[relationship] (joins) [right = of node1] {gyermeke} (node1); + \node[entity] (pgroup1) [right = of joins] {Gyerek} edge [-, line width=1pt] (joins); + \node[entity] (pgroup2) [left = of joins] {Anya} edge [<-, line width=1pt] (joins); + \end{tikzpicture} + \end{center} + + \item \emph{\textbf{sok-sok} (n:m)}: Minden $E_1$-beli egyedhez több $E_2$-beli egyedek egy halmazát rendelhetjük és fordítva. Ha sok-sok kapcsolat van $E_1$ és $E_2$ egyedhalmazok között, akkor $E_1$-et egyenes vonallal kötjük össze $E_2$-vel.\\ + {\small Például: Egy diák több nyelvet is tanulhat, valamint egy nyelvet több diák is tanulhat.} + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every node} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[relationship] (joins) [right = of node1] {tanul} (node1); + \node[entity] (pgroup1) [right = of joins] {Nyelv} edge [-, line width=1pt] (joins); + \node[entity] (pgroup2) [left = of joins] {Diák} edge [-, line width=1pt] (joins); + \end{tikzpicture} + \end{center} + \end{itemize} + + \subsubsection*{Speciális kapcsolatok} + + \begin{itemize} + \item \emph{Önamagára mutató kapcsolat}: Elképzelhető, hogy valamilyen oknál fogva egy egyed önmagával is kapcsolatban állhat, például: dolgozó és főnöke, hiszen a főnök is egy dolgozó, vagy sportoló és edzője, hiszen az edző is egy sportoló. + \begin{center} + \begin{tikzpicture}[auto,node distance=1.0cm] + \tikzstyle{every path} = [top color=white, draw=blue!50!black!100] + \node[entity] (pgroup1) {Dolgozó}; + \node[relationship] (pgroup2) [right = of pgroup1] {Főnök}; + \path [line] (pgroup1) -- ++(0,-30pt) -| (pgroup2); + \path [line] (pgroup2) -- ++(0,+30pt) -| (pgroup1); + % node[transition,pos=0.83,left] {$p_{repl}$}; + \end{tikzpicture} \qquad \qquad + \begin{tikzpicture}[auto,node distance=1.0cm] + \tikzstyle{every path} = [top color=white, draw=blue!50!black!100] + \node[entity] (pgroup1) {Sportoló}; + \node[relationship] (pgroup2) [right = of pgroup1] {Edző}; + \path [line] (pgroup1) -- ++(0,-30pt) -| (pgroup2); + \path [line] (pgroup2) -- ++(0,+30pt) -| (pgroup1); + % node[transition,pos=0.83,left] {$p_{repl}$}; + \end{tikzpicture} + \end{center} + \item \textbf{\textit{Alosztály} (,,isa"-,,az-egy")}: Gyakran előfordul, hogy egy egyedhalmaz egyedei között egyeseknek olyan speciális tulajdonságaik vannak, amelyekkel nem rendelkezik a halmaz minden egyede. Így célszerű speciális egyedhalmazokat, ún. alosztályokat definiálni, ahol minden alosztálynak vannak speciális attribútumai és/vagy kapcsolatai. \\ + + \noindent Ha egy egyedhalmazt alosztályival speciális kapcsolat köt össze, azt "az-egy" (angolul isa) kapcsolatnak nevezzük (például "egy A az egy B" állítás kifejezi a speciális "az-egy" kapcsolatot A-ból B-be). Az öröklési (az-egy) kapcsolatot a hagyományostól eltérően háromszöggel jelöljük, ezzel is kifejezve e kapcsolattípus különlegességét. A háromszög egyik oldalát az alosztállyal kötjük össze, ellenkező oldali csúcsát pedig az ősosztállyal (szuperosztállyal). Minden öröklési kapcsolat egy-egy kapcsolat, de az ezt kifejező nyilakat nem tüntetjük fel külön a diagramon. + \begin{center} + \begin{tikzpicture}[auto,node distance=1.25cm, + amp/.style = {regular polygon, regular polygon sides=3, + draw, text width=0.5em, + inner sep=1mm, outer sep=0mm}] + \node[entity] (node1) {Alakzat}; + \node[amp] (amp1) [amp, node distance=1.25cm, below left = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \node[amp] (amp2) [amp, node distance=0.525cm, below = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \node[amp] (amp3) [amp, node distance=1.25cm, below right = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \path [line, line width=1pt] (node1) -- ++(-28.8pt,0pt) -| (amp1); + \path [line, line width=1pt] (node1) -- ++(0,-20pt) -| (amp2); + \path [line, line width=1pt] (node1) -- ++(+28.8pt,0pt) -| (amp3); + \node[entity, node distance=0.5cm] (node2) [below = of amp1] {Kör}; + \node[entity, node distance=0.5cm] (node3) [below = of amp2, node distance=1.25cm] {Hatszög}; + \node[entity, node distance=0.5cm] (node4) [below = of amp3, node distance=1.25cm] {Téglalap}; + \path [line, line width=1pt] (amp1) -- ++(0pt,-10pt) -| (node2); + \path [line, line width=1pt] (amp2) -- ++(0,-10pt) -| (node3); + \path [line, line width=1pt] (amp3) -- ++(0pt,-10pt) -| (node4); + \end{tikzpicture} + \end{center} + \end{itemize} + + \subsubsection*{Kulcsok} + + \noindent \textbf{Szuperkulcs}: Az egyedhalmaz szuperkulcsa egy azonosító, vagyis olyan tulajdonság-halmaz, amelyről feltehető, hogy az egyedhalmaz előfordulásaiban nem szerepel két különböző egyed, amelyek ezeken a tulajdonságokon megegyeznek. Az összes tulajdonság mindig szuperkulcs.\\ + + \noindent \textbf{Kulcs}: Ha attribútumok egy halmaza kulcsot alkot egy egyedhalmazon belül, akkor nincs két olyan egyed, amely megegyezik a kulcs összes attribútumán. Diagrammon: \emph{attribútumnév aláhúzásával}.\\ + \begin{center} + \begin{tikzpicture}[auto,node distance=1.5cm] + \tikzstyle{every attribute} = [top color=white, bottom color=blue!20, draw=blue!50!black!100] + \node[entity] (node1) {Diák} + child {node[attribute] (identitynumber) [above of=node1] {\underline{SzemélyiSzám}}} + child {node[attribute] (name) [below of=node1] {Név}} + child {node[attribute] (birthdate) [left of=node1,node distance=4.0cm]{SzületésiDátum}} + child {node[attribute] (birthplace) [right of=node1,node distance=3.5cm] {SzületésiHely}}; + \end{tikzpicture} + \end{center} + + \noindent \textit{Megjegyzés}: Jelölhető több kulcs úgy is, hogy megadunk egy kulcsot, ami elsődleges kulcs lesz (ezt úgy kezeljük, mint ha több kulcs nem is lenne) és a többi kulcsot, vagy ne mis jelöljük vagy megjegyzésben felsoroljuk azokat.\\ + + \noindent \textbf{Hivatkozási épség}: Azt a követelményt fejezi ki, hogy egy egyedhalmaz egy vagy több attribútumának az értéke elő kell, hogy forduljon egy másik egyedhalmaz adott attribútumának értékeként. Diagrammon: \emph{kerek végű nyíl}.\\ + + \noindent \emph{Példa}: + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.0cm] + \node[entity] (pgroup1) {Stúdiók}; + \node[relationship] (joins1) [left = of pgroup1] {gyártó}; + \path[top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=2pt] (pgroup1) edge [(-] (joins1); + \node[relationship] (joins2) [right = of pgroup1] {vezető}; + \path[top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=2pt] (pgroup1) edge [(-] (joins2); + \node[entity] (pgroup2) [left = of joins1] {Filmek} edge [-, line width=1pt] (joins1); + \node[entity] (pgroup3) [right = of joins2] {Elnökök} edge [<-, line width=1pt] (joins2); + \end{tikzpicture} + \end{center} + + \begin{itemize} + \item \noindent A \emph{Stúdiók} egyedhalmazhoz megy egy kerek nyíl a \emph{gyártó} kapcsolatban. Ez azt jelenti, hogy annak a stúdiónak, amely gyártott egy filmet, mindig benne kell lennie a \emph{Stúdiók} egyedhalmazban. + \item Hasonlóan a \emph{Stúdiók} egyedhalmazhoz megy egy kerek nyíl a \emph{vezető} kapcsolatban. Ez azt jelenti, hogy ha egy elnök vezetője egy stúdiónak, akkor annak a stúdiónak léteznie kell a \emph{Stúdiók} egyedhalmazban. + \end{itemize} + + \paragraph*{Gyenge egyedhalmaz\\} + + \noindent Előfordulhat, hogy egy-egy egyedhalmazt csak más egyedhalmazok attribútumainak ismeretében azonosíthatunk egyértelműen. Ezeket gyenge egyedhalmazoknak nevezzük. A gyenge egyedhalmaz az „azonosító” egyedhalmazokhoz egy-sok kapcsolattal kapcsolódhat.\\ + + \noindent Diagrammon: + \begin{itemize} + \item \emph{dupla téglalap} az egyedhalmaznak és + \item \emph{dupla rombusz} azoknak a kapcsolatoknak, amiken keresztül megy az azonosítás.\\ + \end{itemize} + + {\small \emph{Példa gyenge egyedhalmazra}: + \begin{center} + \begin{tikzpicture}[auto,node distance=1.0cm] + \node[entity, double, top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=1pt] (pgroup1) {Részleg}; + \node[attribute] (oname) [above = of pgroup1] {\underline{név}} edge [-] (pgroup1); + \node[attribute] (oaddress) [below = of pgroup1] {cím} edge [-] (pgroup1); + \node[relationship, double, top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=1pt] (joins1) [right = of pgroup1] {része}; + \path[line width=1pt] (pgroup1) edge [-] (joins1); + \node[entity] (pgroup2) [right = of joins1] {Cég}; + \node[attribute] (cname) [above = of pgroup2] {\underline{név}} edge [-] (pgroup2); + \node[attribute] (caddress) [below = of pgroup2] {cím} edge [-] (pgroup2); + \path[line width=1pt] (pgroup2) edge [<-] (joins1); + \end{tikzpicture} + \end{center} + + \noindent A részleg neve nem kulcs, mert sok cégnél lehet azonos részlet, ami még a címmel sem azonosítható egyértelműen. Például egy többszintes épületben két különböző cégen belül is lehet IT vagy HR, stb. Amennyiben azonban a céget is bevesszük az azonosításba egy kapcsolaton keresztül, úgy már egyértelművé válik.} + + \subsection*{Tervezési alapelvek} + + \begin{itemize} + \item \emph{Valósághű modellezés}: Megfelelő tulajdonságok tartozzanak az egyedosztályokhoz, például a tanár neve ne a diák tulajdonságai közé tartozzon. + \item \emph{Redundancia elkerülése}: Az \textit{index(etr-kód, lakcím, tárgy, dátum, jegy)} rossz séma, mert a lakcím annyiszor ismétlődik, ahány vizsgajegye van a diáknak, helyette 2 sémát érdemes felvenni: \textit{hallgató(etr-kód, lakcím)}, \textit{vizsga(etr-kód, tárgy, dátum, jegy)}. + \item \emph{Egyszerűség}: Fölöslegesen ne vegyünk fel egyedosztályokat, például a \textit{naptár(év,hónap,nap)} helyett a megfelelő helyen inkább dátum tulajdonságot használjunk. + \item \emph{Tulajdonság vagy egyedosztály}: Például a vizsgajegy osztály helyett jegy tulajdonságot. + használjunk. + \end{itemize} + + \subsection*{Egyed-kapcsolat modell átalakítása relációs adatmodellbe} + + \noindent \textit{Átalakítás} E/K modell $\to$ relációs adatmodell: + \begin{itemize} + \item egyedhalmaz séma $\Rightarrow$ relációséma + \item tulajdonságok $\Rightarrow$ attribútumok + \item (szuper)kulcs $\Rightarrow$ (szuper)kulcs + \item egyedhalmaz előfordulása $\Rightarrow$ reláció + \item egyed $\Rightarrow$ $e(A_1) \ldots e(A_n)$ sor + \item $R(E_1,\ldots, E_p, A_1, \ldots, A_q)$ kapcsolati séma ($E_i$ egyedhalmaz, $A_j$ tulajdonság) + \begin{center} + $\Downarrow$\\ + \end{center} + $R(K_1,\ldots, K_p, A_1,\ldots, A_q)$ relációséma ($K_i$ az $E_i$ (szuper)kulcsa)\\ + \end{itemize} + + \paragraph*{Átalakítás\\} + + \begin{itemize} + \item Minden nem gyenge egyedhalmazhoz létrehozunk egy relációt ugyanezzel a névvel és attribútum halmazzal. + \item Kapcsolatokat nem tulajdonságként, hanem külön relációban ábrázoljuk. Itt az attribútumok a kapcsolatban résztvevő egyedhalmazok kulcsai lesznek. Valamint a kapcsolat attribútumai (ha vannak). + \begin{itemize} + \item Amennyiben két attribútum neve megegyezne, az egyiket értelemszerűen át kell neveznünk. + \end{itemize} + \item Gyenge egyedhalmazok esetén a relációnak tartalmaznia kell a gyenge egyedhalmaz attribútumait, valamint azokat a más egyedhalmazhoz tartozó attribútumokat, amelyek segítettek kialakítani a kulcsot. + \item Gyenge egyedhalmaz kapcsolatait is relációkká alakítjuk, úgy hogy a kapcsolat mindkét oldalán lévő egyedhalmazok kulcsait attribútumként kezeljük. + \end{itemize} + + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.0cm] + \node[entity, top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=1pt] (pgroup1) {Könyv}; + \node[attribute] (bnum) [above = of pgroup1] {\underline{könyvszám}} edge [-] (pgroup1); + \node[attribute] (btitle) [below = of pgroup1] {cím} edge [-] (pgroup1); + \node[attribute] (bauthor) [left = of pgroup1] {szerző} edge [-] (pgroup1); + \node[relationship, top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=1pt] (joins1) [right = of pgroup1] {kölcsönzés}; + \node[attribute] (in) [above = of joins1] {visszahozás} edge [-] (joins1); + \node[attribute] (out) [below = of joins1] {kölcsönözés} edge [-] (joins1); + \path[line width=1pt] (pgroup1) edge [-] (joins1); + \node[entity] (pgroup2) [right = of joins1] {Olvasó}; + \node[attribute] (rname) [above = of pgroup2] {\underline{olvasószám}} edge [-] (pgroup2); + \node[attribute] (rname) [right = of pgroup2] {név} edge [-] (pgroup2); + \node[attribute] (raddress) [below = of pgroup2] {lakcím} edge [-] (pgroup2); + \path[line width=1pt] (pgroup2) edge [<-] (joins1); + \end{tikzpicture} + \end{center} + + \begin{itemize} + \item KÖNYV(\underline{könyvszám}, szerző, cím) + \item OLVASÓ(\underline{olvasószám}, név, lakcím) + \item KÖLCSÖNZÉS(könyvszám, olvasószám, kivétel, visszahozás) + \end{itemize} + + \noindent \textit{Összetett attribútumok leképezése}: Például ha a lakcímet (helység, utca, házszám) struktúrában akarjuk kezelni, akkor fel kell venni a sémába mindet attribútumként. + \begin{itemize} + \item OLVASÓ(\underline{olvasószám}, név, helység, utca, házszám) + \end{itemize} + + \noindent \textit{Többértékű attribútumok leképezése}: + \begin{itemize} + \item Megadás egyértékűként: \\ + Például egy több szerzős könyvnél egy mezőben soroljuk fel az összeset.\\ + Nem túl jó megoldás, mert nem lehet a szerzőket külön kezelni, és esetleg nem is fér el mind a mezőben.\\ + {\small + KÖNYV(9635451903, Adatbázis rendszerek - Alapvetés, $\boldsymbol{\{}$\textbf{Jeffrey D. Ullman, Jennifer Widom}$\boldsymbol{\}}$) + } + \item Megadás többértékűként: + \begin{itemize} + \item \emph{Sorok többszörözése}: Felveszünk annyi sort, ahány szerző van. ($\Rightarrow$ redundancia)\\ + {\small + KÖNYV(9635451903, Adatbázis rendszerek - Alapvetés, Jeffrey D. Ullman)\\ + KÖNYV(9635451903, Adatbázis rendszerek - Alapvetés, Jennifer Widom) + } + \item \emph{Új tábla hozzáadása}: A {\small KÖNYV(könyvszám, szerző, cím)} sémát az alábbi két sémával helyettesítjük: + \begin{itemize} + \small + \item KÖNYV(\underline{könyvszám}, cím), + \item SZERZŐ(\underline{könyvszám}, \underline{szerző}) + \end{itemize} + \item \emph{Sorszámozás}: Ha nem mindegy a szerzők sorrendje, akkor az előző megoldásban (új tábla) ki kell egészíteni a szerző táblát egy sorszám mezővel. + \begin{itemize} + \small + \item KÖNYV(\underline{könyvszám}, cím), + \item SZERZŐ(\underline{könyvszám}, \textbf{sorszám}, \underline{szerző}) + \end{itemize} + \end{itemize} + \end{itemize} + + \subsection*{Kapcsolatok leképezése} + \begin{itemize} + \item \textbf{egy-egy}: Az egyik sémát (tetszőleges, hogy melyiket) bővítjük a másik kulcsával és a kapcsolat attribútumaival.\\ + + Például: Ha egy olvasónak egyszerre csak egy könyvet adnak ki, akkor a kölcsönzés 1:1 kapcsolatot jelent. Ilyenkor a KÖLCSÖN sémában a könyvszám és az olvasószám egyaránt kulcs. Továbbá, a visszahozás attribútumra nincs szükségünk, mivel a könyv visszahozásával a könyv-olvasó kapcsolat megszűnik.\\ + + Tehát, a + \begin{itemize} + \item {\small KÖLCSÖN (\underline{könyvszám}, olvasószám, kivétel)} vagy a + \item {\small KÖLCSÖN (könyvszám, \underline{olvasószám}, kivétel)} sémát vehetjük fel a kapcsolathoz.\\ + \end{itemize} + + A KÖLCSÖN sémát az azonos kulcsú sémába olvasztva a + {\small + \begin{itemize} + \item KÖNYV(\underline{könyvszám}, szerző, cím, \textbf{olvasószám, kivétel}) + \item OLVASÓ(\underline{olvasószám}, név, lakcím) + \end{itemize} + } vagy a + {\small + \begin{itemize} + \item KÖNYV(\underline{könyvszám}, szerző, cím) + \item OLVASÓ(\underline{olvasószám}, név, lakcím, \textbf{könyvszám, kivétel}) + \end{itemize} + } + adatbázissémákat kapjuk. + \item \textbf{egy-sok}: az N oldali egyedhez tartozó sémát bővítjük az 1 oldali egyed kulcsával.\\ + + Például: Ha egy olvasó több könyvet is kikölcsönözhet, akkor az olvasó-könyv kapcsolat 1:N típusú. Ekkor a KÖLCSÖN sémában csak a könyvszám lehet kulcs, ezért a KÖLCSÖN sémát csak a KÖNYV sémába olvaszthatjuk: + {\small + \begin{itemize} + \item KÖNYV(\underline{könyvszám}, szerző, cím, olvasószám, kivétel) + \item OLVASÓ(\underline{olvasószám}, név, lakcím) + \end{itemize} + } + \item \textbf{sok-sok}: új sémát veszünk fel (benne: egyedek kulcsai, kapcsolat attribútumai).\\ + + Például: Ha az egyes könyvek korábbi kölcsönzéseit is nyilvántartjuk, akkor nem csak egy olvasóhoz tartozhat több könyv, hanem egy könyvhöz is több olvasó (N:M kapcsolat), sőt adott olvasó adott könyvet egymás után többször is kikölcsönözhet.\\ + + Ezért a KÖLCSÖN sémában {könyvszám, kivétel} vagy {könyvszám, visszahozás} a kulcs, a KÖLCSÖN táblát most sem a KÖNYV, sem az OLVASÓ táblába nem tudjuk beolvasztani.\\ + + Az adatbázisséma ezért a következő: + {\small + \begin{itemize} + \item KÖNYV(\underline{könyvszám}, szerző, cím) + \item OLVASÓ(\underline{olvasószám}, név, lakcím) + \item KÖLCSÖN(\underline{könyvszám}, olvasószám, kivétel, visszahozás) + \end{itemize} + } + \end{itemize} + + \subsubsection*{Specializáló kapcsolatok átírása} + + + \begin{center} + \begin{tikzpicture}[auto,node distance=1.25cm, + amp/.style = {regular polygon, regular polygon sides=3, + draw, text width=0.5em, + inner sep=1mm, outer sep=0mm}] + \node[entity] (node1) {Helyiség}; + \node[amp] (amp1) [node distance=1.25cm, below left = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \node[amp] (amp2) [node distance=0.525cm, below = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \node[amp] (amp3) [node distance=1.25cm, below right = of node1,top color=white, bottom color=blue!20, draw=blue!50!black!100] {}; + \node[attribute, node distance=0.5cm] (pattr1) [left = of node1] {\underline{épület}} edge [-] (node1); + \node[attribute, node distance=0.5cm] (pattr2) [above left = of node1] {\underline{ajtószám}} edge [-] (node1); + \node[attribute, node distance=0.5cm] (pattr3) [above = of node1] {név} edge [-] (node1); + \node[attribute, node distance=0.5cm] (pattr4) [above right = of node1] {alapterület} edge [-] (node1); + \path[line, line width=1pt] (node1) -- (amp1); + \path[line, line width=1pt] (node1) -- (amp2); + \path[line, line width=1pt] (node1) -- (amp3); + \node[entity, node distance=0.5cm] (node2) [below left = of amp1] {Tanterem}; + \node[attribute, node distance=0.5cm] (pattr5) [left = of node2] {férőhely} edge [-] (node2); + \node[attribute, node distance=0.5cm] (pattr6) [below left = of node2] {vetítő} edge [-] (node2); + \node[attribute, node distance=0.5cm] (pattr7) [below = of node2] {tábla} edge [-] (node2); + \node[entity, node distance=0.5cm] (node3) [below = of amp2, node distance=1.25cm] {Gépterem}; + \node[attribute, node distance=0.5cm] (pattr8) [below = of node3] {gépszám} edge [-] (node3); + \node[entity, node distance=0.5cm] (node4) [below right = of amp3, node distance=1.25cm] {Iroda}; + \node[attribute, node distance=0.5cm] (pattr9) [above right = of node4] {telefon} edge [-] (node4); + \node[attribute, node distance=0.5cm] (pattr10) [below right = of node4] {fax} edge [-] (node4); + \node[relationship, node distance=0.5cm, top color=white, bottom color=blue!20, draw=blue!50!black!100,line width=1pt] (joins1) [below = of node4] {dolgozik}; + \path[line] (joins1) edge [-] (node4); + \node[entity, node distance=0.5cm] (node5) [below = of joins1] {Dolgozó}; + \path[line] (joins1) edge [-] (node5); + \node[attribute, node distance=0.5cm] (pattr11) [left = of node5] {\underline{adószám}} edge [-] (node5); + \node[attribute, node distance=0.5cm] (pattr12) [below = of node5] {név} edge [-] (node5); + \node[attribute, node distance=0.5cm] (pattr13) [right = of node5] {lakcím} edge [-] (node5); + \path [line, line width=1pt] (amp1) -- ++(0pt,-13pt) -| (node2); + \path [line, line width=1pt] (amp2) -- ++(0,-10pt) -| (node3); + \path [line, line width=1pt] (amp3) -- ++(0pt,-13pt) -| (node4); + \end{tikzpicture} + \end{center} + + \paragraph*{Osztályhierarchia átírása\\} + + \begin{itemize} + \item[(1)] Minden altípushoz külön tábla felvétele, egy egyed csak egy táblában szerepel. Az altípusok örökölik a főtípus attribútumait. \\ + + (\emph{Objektumorientált stílusú reprezentálás}) + {\small + \begin{itemize} + \item HELYISÉG(\underline{épület}, \underline{ajtószám}, \emph{név, alapterület}) + \item TANTEREM(\underline{épület}, \underline{ajtószám}, \emph{név, alapterület}, férőhely, tábla, vetítő) + \item GÉPTEREM(\underline{épület}, \underline{ajtószám}, \emph{név, alapterület}, gépszám) + \item IRODA(\underline{épület}, \underline{ajtószám}, \emph{név, alapterület}, telefon, fax) + \item DOLGOZÓ(\underline{adószám}, név, lakcím, épület, ajtószám) + \end{itemize} + } + Hátrányai: + \begin{itemize} + \item Kereséskor gyakran több táblát kell vizsgálni (ha például a D épület 803. sz. terem alapterületét keressük). + \item Kombinált altípus (például számítógépes tanterem) csak új altípus felvételével kezelhető. + \end{itemize} +\newpage + \item[(2)] Minden altípushoz külön tábla felvétele, egy egyed több táblában is szerepelhet. A főtípus táblájában minden egyed szerepel, és annyi altípuséban ahánynak megfelel. Az altípusok a főtípustól csak a kulcs-attribútumokat öröklik.\\ + + (\emph{E/K stílusú reprezentálás}) + {\small + \begin{itemize} + \item HELYISÉG(\underline{épület}, \underline{ajtószám}, név, alapterület) + \item TANTEREM(\underline{épület}, \underline{ajtószám}, férőhely, tábla, vetítő) + \item GÉPTEREM(\underline{épület}, \underline{ajtószám}, gépszám) + \item IRODA(\underline{épület}, \underline{ajtószám}, telefon, fax) + \item DOLGOZÓ(\underline{adószám}, név, lakcím, épület, ajtószám) + \end{itemize} + } + \emph{Hátrányai}: + \begin{itemize} + \item Előfordulhat, hogy több táblában kell keresni (például: ha a tantermek nevére és férőhelyére vagyunk kíváncsiak). + \end{itemize} + \item[(3)] Egy közös tábla felvétele, az attribútumok uniójával. Az aktuálisan értékkel nem rendelkező attribútumok NULL értékűek. \\ + + (\emph{Reprezentálás nullértékekkel}) + {\small + \begin{itemize} + \item HELYISÉG(\underline{épület}, \underline{ajtószám}, név, alapterület, férőhely, tábla, vetítő, gépszám, telefon, fax) + \item DOLGOZÓ(\underline{adószám}, név, lakcím, épület, ajtószám) + \end{itemize} + } + \emph{Hátrányai}: + \begin{itemize} + \item Az ilyen egyesített táblában általában sok NULL attribútumérték szerepel. + \item Elveszíthetjük a típusinformációt (például: ha a gépteremnél a gépszám nem ismert és ezért NULL, akkor a gépterem lényegében az egyéb helyiségek kategóriájába kerül). + \end{itemize} + \end{itemize} +\newpage + \section*{Relációs algebra, SQL} + + \noindent \textit{Relációs algebra}: Az algebra szó a matematikában azt a diszciplínát jelöli, amely egy halmazon értelmezett műveletek tulajdonságait vizsgálja. A mi esetünkben a műveletek a relációkon értelmezettek, így innen származik a relációs algebra kifejezése. A műveletek tehát relációkon értelmezettek és ami nagyon fontos és lényeges, hogy relációkat is adnak eredményül. Tehát egy lekérdezés eredménye egy újabb relációt szolgáltat, vagyis a relációs algebrai műveletek nem vezetnek ki a relációk halmazából, a kapott eredmény szintén az adatbázis részének tekinthető.\\ + + \subsection*{Relációs algebrai műveletek} + + \subsubsection*{Halmazműveletek} + + Legyen $R(A_1, \ldots, A_n)$ és $S(B_1, \ldots, B_m)$ tetszőleges relációséma és $n = m$, valamint + \[ + dom(A_i) = dom(B_i) \qquad (\forall i) + \] + + \noindent $R \bigcup S$ ($R$ és $S$ \emph{\textbf{uniója}}): $R \bigcup S = \textbf{F}(C_1, \ldots, C_n)$, ahol + \[ + F := \Big\{f_i\ \Big|\ f_i \in R \vee f_i \in S\ \ \wedge\ \ (f_i \neq f_j \quad \forall i, j \in n,\ i \neq j)\Big\} + \] + \begin{itemize} + \item $R$, $S$ és \textbf{F} azonos sémájú. + \item \textbf{F} nem tartalmaz azonos sorokat. (Ez gyakorlatban eltérhet) + \item $\Big|R \bigcup S\Big| \leq \Big|R\Big| + \Big|S\Big|$ + \item Nem feltétlenül örököl típusneveket vagy attribútumneveket. + \item \emph{SQL}: SELECT * FROM R \textbf{UNION} SELECT * FROM S; + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 0 & 1 \\ \hline + \end{array} \qquad S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 1 & 0 \\ \hline + \end{array} \qquad + R \bigcup S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 0 & 1 \\ \hline + 1 & 0 \\ \hline + \end{array}$ + \end{center} + + \noindent $R \setminus S$ ($R$ és $S$ \emph{\textbf{különbsége}}): $R \setminus S = \textbf{F}(C_1, \ldots, C_n)$, ahol + \[ + F := \Big\{f_i\ \Big|\ f_i \in R \wedge f_i \not \in S\Big\} + \] + \begin{itemize} + \item $R$ azon sorait tartalmazza, amelyeket $S$ nem tartalmazza. + \item $\Big|R \setminus S\Big| \leq \Big|R\Big|$ + \item Fontos: $R \setminus S \neq S \setminus R$ (nem kommutatív). + \item Örökli a típusneveket és az attribútum neveket, mert $R \setminus S \subseteq R$. + \item \emph{SQL}: SELECT * FROM R \textbf{MINUS} SELECT * FROM S; + \end{itemize} + + \noindent \textit{Példa}: + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 0 & 1 \\ \hline + \end{array} \qquad S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 1 & 0 \\ \hline + \end{array} \qquad + R \setminus S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 1 \\ \hline + \end{array}$ + \end{center} + + \noindent $R \times S$ ($R$ és $S$ \emph{\textbf{Descartes-szorzata}}): Az $R$ és $S$ minden sora párban összefűződik, az első reláció minden sorához hozzáfűzzük a második reláció minden sorát. + \begin{itemize} + \item $R$ minden sorát tartalmazza $S$ minden sorával az összes kombinációban. + \item $R \times S$ sémája $R$ és $S$ sémájának egyesítése. + \item Ha R, S sémáiban nincs közös attribútum, akkor $R \bowtie S = R \times S$ + \item $\Big|R \times S\Big| = \Big|R\Big| * \Big|S\Big|$ + \item \emph{SQL}: SELECT * FROM R \textbf{CROSS JOIN} S vagy SELECT * FROM R\textbf{,} S; + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 0 & 1 \\ \hline + \end{array} \qquad S := \begin{array}{|c|c|} + \hline + \text{\textbf{B}} & \text{\textbf{C}} \\ \hline \hline + 0 & 0 \\ \hline + 1 & 0 \\ \hline + \end{array} \qquad + R \times S := \begin{array}{|c|c|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{R.B}} & \text{\textbf{S.B}} & \text{\textbf{C}} \\ \hline \hline + 0 & 0 & 0 & 0 \\ \hline + 0 & 0 & 1 & 0 \\ \hline + 0 & 1 & 0 & 0 \\ \hline + 0 & 1 & 1 & 0 \\ \hline + \end{array}$ + \end{center} + + \noindent Az alapműveletekhez az \emph{unió} és \emph{különbség} és a Descartes-szorzat tartozik.\\ + \noindent A \emph{metszet} műveletet származtatjuk: + \begin{center} + $R \bigcap S = R \setminus (R \setminus S)$ + \end{center} + + \noindent $R \bigcap S$ ($R$ és $S$ \emph{\textbf{metszete}}): $R \bigcap S = \textbf{F}(C_1, \ldots, C_n)$, ahol + \[ + F := \Big\{f_i\ \Big|\ f_i \in R \wedge f_i \in S\ \ \wedge\ \ (f_i \neq f_j \quad \forall i, j \in n,\ i \neq j)\Big\} + \] + \begin{itemize} + \item $R$ azon sorait tartalmazza, amelyeket $S$ is tartalmazza. + \item $R$, $S$ és \textbf{F} azonos sémájú. + \item \textbf{F} nem tartalmaz azonos sorokat. + \item $\big|R \cap S\big| = \big|R\big| + \big|S\big|$ + \item \emph{SQL}: SELECT * FROM R \textbf{INTERSECT} SELECT * FROM S; + \end{itemize} + + \noindent \textit{Példa}: + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 0 & 1 \\ \hline + \end{array} \qquad S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + 1 & 0 \\ \hline + \end{array} \qquad + R \bigcap S := \begin{array}{|c|c|} + \hline + \text{\textbf{A}} & \text{\textbf{B}} \\ \hline \hline + 0 & 0 \\ \hline + \end{array}$ + \end{center} + + \paragraph*{Vetítés (projekció)} + + $\boldsymbol{\Pi}_{A_{i_1}, \ldots, A_{i_k}}(R)$ ($R$ \emph{\textbf{vetítése}}): $R$ relációból olyan új relációt hoz létre, amelyik csak $R$ bizonyos attribútumait tartalmazza: + \[ + \Pi_{A_{i_1}, \ldots, A_{i_k}}(R) := \Big\{t.A_{i_1}, t.A_{i_2},\ \ldots,\ t.A_{i_k} \big|\ t \in R \Big\} + \] + \begin{itemize} + \item Számít az attribútumok sorrendje. (rendezett lista) + \item $\Big|\Pi_{A_{i_1}, \ldots, A_{i_k}}(R)\Big| < \Big|R\Big|$ + \item Örökli a típusneveket és az attribútum neveket. + \end{itemize} + + \noindent \textit{Példa:} + + $R := \begin{array}{|c|l|c|} + \hline + \text{ID} & \text{Név} & \text{Kor} \\ \hline \hline + 1 & \text{Péter} & 3 \\ \hline + 2 & \text{László} & 37 \\ \hline + \end{array} \qquad \Pi_{\text{ID}, \text{Név}}(R) := + \begin{array}{|c|l|} + \hline + \text{ID} & \text{Név} \\ \hline \hline + 1 & \text{Péter} \\ \hline + 2 & \text{László} \\ \hline + \end{array} + $ + + \ \\ + + \paragraph*{Kiválasztás (szelekció)} + + $\boldsymbol{\sigma}_{C}(R)$ ($R$ \emph{\textbf{szelekciója}}): $R$ reláció azon sorai, amelyekre az $C$ feltétel igaz. + + \begin{itemize} + \item $C$ feltétel lehet: + \begin{itemize} + \item \emph{Elemi}: $A_i\ \theta\ A_j$, $A_i\ \theta\ d$, ahol $d$ konstans, $\theta \in \Big\{=, <, >, \neq, \leq, \geq\Big\}$. + \item \emph{Összetett}: ha $B_1, B_2$ feltétel, akkor $\neg B_1, B_1 \bigcap B_2, B_1 \bigcup B_2$ és a zárójelezések is feltétel. + \end{itemize} + \item C feltétel \emph{\textbf{nem tartalmazhat függvényeket}}: $C = A + B < 5$ + {\small + \item Összetett feltételek átírhatók elemi feltételeket használó kifejezésekké + \begin{itemize} + \item $\sigma_{F_1 \wedge F_2}(R) \cong \sigma_{F_1}(\sigma_{F_2}(R)) \cong \sigma_{F_2}(\sigma_{F_1}(R))$ + \item $\sigma_{F_1 \vee F_2}(R) \cong \sigma_{F_1}(R) \bigcup \sigma_{F_2}(R)$ + \item $\neg (F_{1} \wedge F_{2}) \Rightarrow (\neg F_{1}) \vee (\neg F_{2})$ + \item $\neg (F_{1} \vee F_{2}) \Rightarrow (\neg F_{1}) \wedge (\neg F_{2})$ + \item $\neg (A < B) \Rightarrow(A \geq B)$ + \end{itemize} + } + \item Örökli a típusneveket és az attribútum neveket, mivel $\sigma_{C}(R) \subseteq R$. + \item $\Big|\sigma_{C}(R)\Big| < \Big|R\Big|$ + \item \emph{SQL}: SELECT * FROM R \textbf{WHERE $<$FELTÉTEL$>$};\\ + \end{itemize} + + \noindent \textit{Példa:} + + \begin{center} + $R := \begin{array}{|c|l|c|} + \hline + \text{ID} & \text{Név} & \text{Kor} \\ \hline \hline + 1 & \text{Péter} & 3 \\ \hline + 2 & \text{László} & 37 \\ \hline + \end{array} \qquad \sigma_{\text{Kor} > 10}(R) := + \begin{array}{|c|l|c|} + \hline + \text{ID} & \text{Név} & \text{Kor} \\ \hline \hline + 2 & \text{László} & 37 \\\hline + \end{array}$ + \end{center} + + \ \\ + + \paragraph*{Természetes összekapcsolás} + + Szorzás jellegű műveletek közül csak ez alapművelet. Nő az attribútumok száma. A közös attribútumnevekre épül: $R \bowtie S$ azon sorpárokat tartalmazza R-ből illetve S-ből, amelyek R és S azonos attribútumain megegyeznek. $R \bowtie S$ típusa a két attribútumhalmaz uniója. + \begin{itemize} + \item Ha R, S sémái megegyeznek, akkor $R \bowtie S = R \bigcap S$ + \item \emph{SQL}: + \begin{itemize} + \item SELECT * FROM R NATURAL JOIN S vagy + \item SELECT DISTINCT A, R.B, C FROM R\textbf{,} S WHERE R.B = S.B; + \end{itemize} + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \textbf{A} & \textbf{B} \\ \hline \hline + a & a \\ \hline + c & b \\ \hline + b & c \\ \hline + \end{array} \qquad S := \begin{array}{|c|c|} + \hline + \textbf{B} & \textbf{C} \\ \hline \hline + a & a \\ \hline + a & c \\ \hline + b & d \\ \hline + e & d \\ \hline + \end{array} \qquad R \bowtie S := \begin{array}{|c|c|c|} + \hline + \textbf{A} & \textbf{R.B} & \textbf{C} \\ \hline \hline + a & a & a \\ \hline + a & a & c \\ \hline + c & b & d \\ \hline + \end{array}$ + \end{center} + + \noindent Szorzásjellegű műveletnél tekinthetjük a \textit{direkt-szorzatot} alapműveletnek, de a természetes összekapcsolást használják. A direkt-szorzat (vagy szorzat, Descartes-szorzat) esetén természetesen nem fontos az attribútumok egyenlősége. A két vagy több reláció azonos nevű attribútumait azonban meg kell különböztetni egymástól (átnevezéssel). \\ + + \paragraph*{Átnevezés} + + $\rho_{B(D_{1}, \ldots, D_{k})}(R)$ ($R$ \emph{\textbf{átnevezése}}): $R$ reláció sémájának átnevezése $B$-re, valamint $R$ attribútumainak átnevezése $A_1, \ldots, A_n$-ről $D_{1}, \ldots, D_{n}$-re. + \begin{itemize} + \item $\rho_{B(D_1, \ldots, D_n)}(R)$ sémája $B(D_1, \ldots, D_n)$ + \item $\Big|\rho_{B(D_1, \ldots, D_n)}(R)\Big| = \Big|R\Big|$ + \item SQL: + \begin{itemize} + \item SELECT A, B, C \textbf{D} FROM R \textbf{B} vagy + \item SELECT A, B, C \textbf{AS D} FROM R \textbf{AS B};\\ + \end{itemize} + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|c|} + \hline + \text{ID} & \text{Név} & \text{Fizetés} \\ \hline \hline + 1 & \text{Péter} & 300000 \\ \hline + 2 & \text{László} & 507000 \\ \hline + \end{array} \qquad \rho_{B(\text{ID}, \text{Név}, \text{Jövedelem})}(R) := + \begin{array}{|c|c|c|} + \hline + \text{ID} & \text{Név} & \text{Jövedelem} \\ \hline \hline + 1 & \text{Péter} & 300000 \\ \hline + 2 & \text{László} & 507000 \\ \hline + \end{array} := B$ \\ + \end{center} + + \ \\ + + \noindent A relációs algebrában a $\bigcup, \setminus, \times (\bowtie), \Pi, \sigma, \rho$ alapműveletek találhatóak. Ez egy \textit{minimális készlet}, vagyis bármelyiket elhagyva az a többivel nem fejezhető ki. A kivonás egy kivétel, mert nem fejezhető ki a többi alapművelettel.\\ + + \noindent $R \div S$ \textit{(\textbf{osztás})}: maradékos osztás mintájára. R és S sémája $R(A_1,...,A_n,B_1,...,B_m)$, illetve $S(B_1,...,B_m)$, $Q = R \div S$ sémája $Q(A_1,...,A_n)$. $R \div S$ a legnagyobb (legtöbb sort tartalmazó) reláció, amelyre $( R \div S ) \times S \subseteq R.$\\ + + \noindent Relációs algebrában: $R(A,B) \div S(B) = \Pi_{A_1, \ldots, A_n}(R) – \Pi_{A_1,...,A_n}( \Pi_{A_1, \ldots, A_n}(R) \times S \setminus R )$\\ + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \textbf{A} & \textbf{B} \\ \hline \hline + F & A \\ \hline + F & B \\ \hline + F & C \\ \hline + M & A \\ \hline + M & B \\ \hline + K & A \\ \hline + K & D \\ \hline + N & E \\ \hline + \end{array} \qquad S := \begin{array}{|c|} + \hline + \textbf{B} \\ \hline \hline + A \\ \hline + B \\ \hline + \end{array} \qquad R \div S := \begin{array}{|c|} + \hline + \textbf{A} \\ \hline \hline + F \\ \hline + M \\ \hline + \end{array}$ + \end{center} + + \subsection*{Relációs algebra kiterjesztése\\} + + \noindent A relációkra vonatkozó műveleteket kiterjesztjük halmazokról multihalmazokra (sorok ismétlődése megengedett).\\ +\newpage + \noindent $\boldsymbol{\delta}(R)$ (\textbf{\emph{ismétlődések megszüntetése}}): Multihalmazból halmazt csinál. + \begin{itemize} + \item Örökli a típusneveket és az attribútum neveket, mivel $\delta(R) \subseteq R$. + \item $\Big|\delta(R)\Big| \leq \Big|R\Big|$ + \item SQL: SELECT \textbf{DISTINCT} * FROM R; + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{Név} & \text{Jövedelem} \\ \hline \hline + \text{Péter} & 300000 \\ \hline + \text{László} & 507000 \\ \hline + \text{László} & 507000 \\ \hline + \end{array} \qquad \delta(R) := + \begin{array}{|c|c|} + \hline + \text{Név} & \text{Jövedelem} \\ \hline \hline + \text{Péter} & 300000 \\ \hline + \text{László} & 507000 \\ \hline + \end{array}$ + \end{center} + + \noindent $\boldsymbol{\Pi}_{L}(R)$ (\textbf{\emph{vetítési művelet kiterjesztése}}): A normál vetítési művelet kiterjesztett változata.\\ + + \noindent A $L$ tartalmazhatja: + \begin{itemize} + \item R egy attribútumát, + \item E $\to$ z, ahol E az R reláció attribútumaira vonatkozó (konstansokat, aritmetikai műveleteket, függvényeket tartalmazó kifejezés), z pedig az E kifejezés által számolt az eredményekhez tartozó új attribútum nevét jelöli. \\ + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \text{A} & \text{B} \\ \hline \hline + 1 & 2 \\ \hline + 2 & 3 \\ \hline + 4 & 5 \\ \hline + \end{array} \qquad \Pi_{A+B \to C}(R) := + \begin{array}{|c|} + \hline + C \\ \hline \hline + 3 \\ \hline + 5 \\ \hline + 9 \\ \hline + \end{array}$ + \end{center} + + \noindent $\boldsymbol{\gamma}_{L}(R)$ (\textbf{\emph{Összesítő műveletek és csoportosítás}}): A csoportosítást, a csoportokon végezhető összesítő függvényeket (AVG, SUM, COUNT, MIN. MAX, stb.) reprezentálja a művelet. + \noindent Itt az $L$ valamennyi eleme a következők egyike: + \begin{itemize} + \item R olyan attribútuma, amely szerepel a GROUP BY záradékban, egyike a csoportosító attribútumoknak. + \item R egyik attribútumára alkalmazott összesítő operátor. + \begin{itemize} + \item Ha az összesítés eredményére névvel szeretnénk hivatkozni, akkor nyilat és új nevet használunk. + \end{itemize} + \end{itemize} + \noindent Értelmezése, kiértékelés: R sorait csoportokba osztjuk. Egy csoport azokat a sorokat tartalmazza, amelyek a listán szereplő csoportosítási attribútumokhoz tartozó értékei megegyeznek. + \begin{itemize} + \item Vagyis ezen attribútumok minden egyes különböző értéke egy csoportot alkot. + \end{itemize} + Minden egyes csoporthoz számoljuk ki a lista összesítési attribútumaira vonatkozó összesítéseket. Az eredmény minden egyes csoportra egy sor: + \begin{enumerate} + \item a csoportosítási attribútumok és + \item az összesítési attribútumra vonatkozó összesítése (az adott csoport összes sorára) + \end{enumerate} + + \noindent $\boldsymbol{\tau}_{A_, \ldots, A_n}(R)$ (\textbf{\emph{rendezés}}): Először $A_1$ attribútum szerint rendezzük R sorait. Majd azokat a sorokat, amelyek értéke megegyezik az $A_1$ attribútumon, $A_2$ szerint, és így tovább. \\ + Ez az egyetlen olyan művelet, amelynek az eredménye se nem halmaz, se nem multihalmaz, hanem egy rendezett lista. + \begin{itemize} + \item $\tau(R)| = \Big|R\Big|$ + \item \emph{SQL}: SELECT A, B FROM R \textbf{ORDER BY} B;\\ + \end{itemize} + + \noindent \textit{Példa}: + + \begin{center} + $R := \begin{array}{|c|c|} + \hline + \textbf{A} & \textbf{B} \\ \hline \hline + 1 & 2 \\ \hline + 3 & 4 \\ \hline + 5 & 2 \\ \hline + \end{array} \qquad \tau(R) := + \begin{array}{|c|c|} + \hline + \textbf{A} & \textbf{B} \\ \hline \hline + 1 & 2 \\ \hline + 5 & 2 \\ \hline + 3 & 4 \\ \hline + \end{array}$ + \end{center} + + \ \\ + + \paragraph*{Algebrai kifejezés kiértékelése\\} + + \noindent Összetett kifejezést kívülről befelé haladva átírjuk kiértékelő fává, ahol a levelek elemi kifejezések.\\ + + \noindent Legyen $R, S$ az $R(A, B, C), S(C, D, E)$ séma feletti reláció + \[ + \Pi_{B,D}\sigma_{A = 'c' \wedge E = 2}(R \bowtie S) + \] + + \noindent A kifejezéshez tartozó kifejezésfa (kiértékelése alulról felfelé történik) + + \begin{center} + \begin{tikzpicture} + \tikzstyle{level 1}=[sibling distance=10mm] + \tikzstyle{level 2}=[sibling distance=10mm] + \tikzstyle{level 3}=[sibling distance=30mm] + + \node{$\Pi_{B,D}$} + child + { + node + { + $\sigma_{A = 'c' \wedge E = 2}$ + } + child + { + node {$\bowtie$} + child { node { R }} + child { node { S }} + } + }; + \end{tikzpicture} + \end{center} + + \subsection*{SQL\\} + + \noindent Az SQL kifejezés a Structured Query Language rövidítése, ami strukturált lekérdező nyelvet jelent. A relációs adatbázis-kezelő rendszerekben tárolt adatok kezelésére fejlesztették ki.\\\ +\newpage + \noindent Az SQL széles körben népszerű, mert a következő előnyöket kínálja. + Lehetővé teszi a felhasználók számára: + \begin{itemize} + \item az adatok leírását. + \item a relációs adatbázis-kezelő rendszerek adatainak elérését. + \item adatbázisokat és táblázatokat hozzanak létre vagy dobjanak el. + \item az adatbázisban lévő adatok definiálását és az adatok manipulálását. + \item nézetek létrehozását egy adatbázisban. + \item táblák, eljárások és nézetek engedélyeinek beállítását. + \end{itemize} + + \noindent Lehetővé teszi más nyelveken belüli beágyazást SQL modulok, könyvtárak és előfordítók használatával.\\ + + \noindent Az első verzió alapjait az IBM fektette le a 70-es években. A nyelv elvi alapjait a relációs adatmodell fogalma, az Edgar F. Codd által leírt 12 szabálya adta. 80-as években az ANSI és ISO is szabványként fogadta el az SQL nyelvet.\\ + + \noindent Az SQL nyelvi elemeket négyféleképp csoportosíthatjuk: + \begin{itemize} + \item \textbf{\emph{Adatdefiníciós, DDL}} (Data Definition Language) + \item \textbf{\emph{Adatmanipulációs, DML}} (Data Manipulation Language) + \item \textbf{\emph{Adatvezérlő, DCL}} (Data Control Language) + \item \textbf{\emph{Lekérdező, DQL}} (Data Query Language)\\ + \end{itemize} + + \noindent Alap tulajdonságok: + \begin{itemize} + \item A nyelvben az egyes utasításokat pontosvessző válassza el egymástól. + \item Az SQL case insensitive, tehát a kis és nagy betűk nincsenek megkülönböztetve egymástól. + \item A parancsok tetszőlegesen tagolhatók (szóköz, tabulátor) és több sorba írhatók. + \item A szöveg konstansokat szimpla aposztrófok jelölik pl.: 'SQL' + \end{itemize} + + \ \\ + + \noindent \emph{SQL-ben a relációt táblának nevezik}, amiből alapvetően három féle létezik: + \begin{itemize} + \item TABLE (alaptábla, permanens), + \item VIEW (nézettábla), + \item WITH utasítással (átmeneti munkatábla). + \end{itemize} + + \subsubsection*{DDL (Data Definition Language)} + + \noindent Adatleíró rész az adatbázis objektumainak a leírására és megváltoztatására. + + \begin{itemize} + \item CREATE: Adatbázis-objektum létrehozása. +{\small + \begin{verbatim} + CREATE DATABASE Nyilvantartas; + + CREATE TABLE alkalmazottak( + id INT(11) NOT NULL, + nev VARCHAR(70) NOT NULL, + szuletesi_datum DATE NOT NULL, + irsz NUMBER(7) NOT NULL, + varos VARCHAR(40) NOT NULL, + cim VARCHAR(60) NOT NULL + ); + + CREATE VIEW alk_varosok AS + SELECT id, nev, varos + FROM alkalmazottak; + \end{verbatim} +} + \item ALTER: Adatbázis-objektum módosítása. + \begin{verbatim} + ALTER TABLE alkalmazottak ADD cim VARCHAR(80); + \end{verbatim} + \item DROP: Adatbázis-objektum megszüntetése. Minden, ami ehhez az elemhez kapcsolódott, elérhetetlen lesz. + \begin{verbatim} + DROP TABLE alkalmazottak; + DROP VIEW alk_varosok; + \end{verbatim} + \item TRUNCATE TABLE: Tábla összes sorának törlése a tábla szerkezetének megtartásával. + \end{itemize} + + \paragraph*{Megszorítások\\} + + \noindent A \textit{megszorítás} adatelemek közötti kapcsolat, amelyet az adatbázis-rendszernek fent kell tartania. Lehet kulcs megszorítás, értékekre, sorokra vonatkozó. Itt alapvetően az adatbázis bármely módosítása előtt ellenőrizni kell. Egy okos rendszer felismeri, hogy mely változtatások, mely megszorításokat érinthetnek. \\ + + \noindent Megszorítás megadása CONSTRAINTS kulcsszóval történik. Saját megszorítás megadása: CREATE ASSERTION $<$név$>$ CHECK ($<$feltétel$>$). + + \begin{itemize} + \item UNIQUE: Az adott oszlopban minden érték egyedi. Hatására index állomány jön létre. Felvehet NULL értéket. + {\small + \begin{verbatim} +CREATE TABLE Persons ( + ... + CONSTRAINT UC_Person UNIQUE (ID,LastName) +); + \end{verbatim} + } + \item PRIMARY KEY: Az adott oszlop a tábla elsődleges kulcsa lesz, megköveteli az adott oszlopban az értékek egyediségét. Oszlop-megszorításokban csak akkor tudunk elsődleges kulcsot definiálni, ha az elsődleges kulcs csak egy oszlopból áll. Ilyen oszlop csak egy lehet a táblában. Hatására mindig létrejön egy index állomány. Nem lehet NULL az értéke. + {\small + \begin{verbatim} +CREATE TABLE Persons ( + ... + CONSTRAINT PK_Person PRIMARY KEY (ID,LastName) +); + \end{verbatim} + } + \item FOREIGN KEY - Idegen kulcs egy másik tábla megfelelő oszlopára. + \begin{itemize} + \item REFERENCES kapcsolttabla(kapcsoltoszlop) [ON-feltételek]: Az adott oszlop idegen kulcs-hivatkozást tartalmaz a \emph{kapcsolttabla} \emph{kapcsoltoszlop}ára. A \emph{kapcsolttabla} \emph{kapcsoltoszlop}a csak elsődleges, vagy egyedi kulcs lehet. + \end{itemize} + Idegen kulcs (R-ről S-re) megszorítást meg kell őrizni, ez kétféleképpen sérülhet: + \begin{enumerate} + \item Egy R-be történő beszúrásnál vagy R-ben történő módosításnál S-ben nem szereplő értéket adunk meg. + \item Egy S-beli törlés vagy módosítás ,,lógó" sorokat eredményez R-ben. Védeni többféleképpen lehet: alapértelmezetten nem hajtja végre, tovább gyűrűzésnél igazítjuk a tábla értékeit a változáshoz, SET NULL-nál pedig az érintett sorokat NULL-ra állítjuk. + \end{enumerate} + {\small + \begin{verbatim} +CREATE TABLE Orders ( + ... + CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) + REFERENCES Persons(PersonID) +); + \end{verbatim} + } + \item DEFAULT: Alapértelmezett érték, mely akkor kerül az új sor adott oszlopába, ha nem adunk meg a beszúrás során implicit értéket. + {\small + \begin{verbatim} +CREATE TABLE Orders ( + ... + OrderDate date DEFAULT GETDATE() +); + \end{verbatim} + } + \item CHECK: Az oszlopra vonatkozó logikai kifejezést adhatunk meg, a feltételben csak az oszlop szerepelhet. A beszúrás, módosítás csak akkor történik meg, ha a kifejezés értéke igaz lesz. + {\small + \begin{verbatim} +CREATE TABLE Persons ( + ... + Age int, + CONSTRAINT CHK_Person CHECK (Age>=18) +); + \end{verbatim} + } + \item NOT NULL | NULL: Az adott oszlopban szerepelhet-e NULL érték. + {\small + \begin{verbatim} +CREATE TABLE Persons ( + ... + LastName varchar(255) NOT NULL, + FirstName varchar(255) NOT NULL, + ... +); + \end{verbatim} + } + \end{itemize} + + \subsubsection*{DQL (Data Query Language)} + + \noindent Relációs algebrai kifejezések felírása SELECT-tel: + \begin{itemize} + \item SELECT lista FROM táblák szorzata WHERE felt. = $\Pi_{lista}\big(\sigma_{felt.}$(táblák szorzata)\big) + \item Halmazműveletek: \textbf{UNION}, \textbf{EXCEPT}/\textbf{MINUS}, \textbf{INTERSECT}. Multihalmazból halmaz lesz. ALL kulcsszóval megmarad a multihalmaz. + \item Átnevezés: oszlopnév után szóközzel odaírjuk az új nevet vagy AS új név. + \end{itemize} + + \noindent Kiterjesztett műveletek: + \begin{itemize} + \item Rendezés: \textbf{ORDER BY}, minden más záradék után következik, csökkenő, növekvő sorrend. + \item Ismétlődések megszüntetése: SELECT \textbf{DISTINCT} ... + \item Összesítések (aggregálás): \textbf{SUM}, \textbf{COUNT}, \textbf{MIN}, \textbf{MAX}, \textbf{AVG} a SELECT záradékban. \textbf{COUNT}(*) az eredmény sorainak száma. Ha összesítés is szerepel a lekérdezésben, a SELECT-ben felsorolt attribútumok vagy egy összesítő függvény paramétereként szerepelnek, vagy a \emph{GROUP BY} attribútumlistájában is megjelennek. + \item Csoportosítás: \textbf{GROUP BY}. + \item Csoportok szűrése: \textbf{HAVING}. Csoportokat szűr, nem egy-egy sort. Az alkérdésre nincs megszorítás. Viszont az alkérdésen kívül csak olyan attribútumok szerepelhetnek, amelyek: vagy csoportosító attribútumok, vagy összesített attribútumok. (Azaz ugyanazok a szabályok érvényesek, mint a SELECT záradéknál). + \end{itemize} + {\small + \begin{verbatim} + SELECT név, AVG(jegy) AS átlag + FROM hallgató + GROUP BY azon, név + HAVING COUNT(tantárgy) > 2; + \end{verbatim} + } + + \begin{center} + \begin{tikzpicture} + \tikzstyle{level 1}=[sibling distance=10mm] + \tikzstyle{level 2}=[sibling distance=10mm] + \tikzstyle{level 3}=[sibling distance=30mm] + + \node{$\Pi_{\text{név},\text{átlag}}$} + child + { + node + { + $\sigma_{db > 2}$ + } + child + { + node {$\gamma_{\text{azon}, \text{név}, AVG(jegy) \to \text{átlag},\ COUNT(\text{tantárgy}) \to db}$} + child { node { \text{hallgató} }} + } + }; + \end{tikzpicture} + \end{center} + + \noindent WHERE záradéknál SQL-es specialitások + \begin{itemize} + \item Átírható relációs algebrába: \textbf{BETWEEN} ... \textbf{AND} ..., \textbf{IN}(értékhalmaz) + \item Nem írható át relációs algebrába: \textbf{LIKE} karakterláncok összehasonlításánál, \textbf{IS NULL} (ismeretlen vagy nem definiált érték) [emiatt 3-értékű logika SQL-ben: true, false, unknown] + \end{itemize} +\newpage + \noindent SELECT utasítás több részből áll, a részeket záradékoknak nevezzük.\\ + + \noindent Három alapvető záradék van: + \begin{itemize} + \item SELECT lista (3.) -- milyen típusú sort szeretnénk az eredményben látni? * jelentése: minden attribútum. + \item FROM Relációnév (1.) -- a tábla neve vagy relációk (táblák) összekapcsolása, illetve szorzata + \item WHERE feltétel (2.) -- milyen feltételeknek eleget tevő sorokat kiválasztani? + \end{itemize} + +\noindent Több séma összekapcsolása esetén, ha egy attribútumnév több sémában is előfordul, akkor kell hozzá a séma is a hivatkozásnál: R.A (R reláció A attribútuma). \\ + + \noindent \textit{Alkérdéseket} is használhatunk SQL-ben. Ekkor az alkérdést zárójelbe tesszük. + + \begin{itemize} + \item FROM záradékban ilyen módon ideiglenes táblát is létrehozhatunk, ekkor többnyire a sorváltozó nevét is meg kell adni hozzá. + \item WHERE záradékban az alkérdés eredménye lehet: + \begin{itemize} + \item egy skalárérték, vagyis mintha egy konstans lenne + \item skalár értékekből álló multihalmaz, logikai kifejezésekben használható: EXISTS, [NOT] IN, ANY/ALL (pl x $>$ ANY (alkérdés)). + \item teljes többdimenziós tábla, használható: EXISTS, [NOT] IN + \end{itemize} + \end{itemize} + + \noindent Az alkérdés nem korrelált, ha önállóan kiértékelhető, külső kérdés közben nem változik. Korrelált, ha többször kerül kiértékelésre, alkérdésen kívüli sorváltozóból származó értékadással.\\ + + \noindent Teljes SELECT utasítás (záradékok sorrendje nem cserélhető fel) + \begin{verbatim} + SELECT [DISTINCT] ... + FROM ... + [WHERE ...] + [GROUP BY ... + [HAVING ...]] + [ORDER BY ...] + \end{verbatim} + + \paragraph*{Összekapcsolások\\} + +% $\begin{tabular}{lc} +% \makecell{\text{Descartes-szorzat}\\ \text{R CROSS JOIN S, vagy ,,R,S"}} & \includegraphics[width=0.35\linewidth]{img/cross-join.png} \\ \hline +% \makecell{\text{Természetes összekapcsolás}\\ \text{R NATURAL JOIN S}} & \\ \hline +% \makecell{\text{Théta összekapcsolás}\\ \text{R INNER JOIN S ON $<$feltétel$>$}} & \includegraphics[width=0.25\linewidth]{img/img_innerjoin.jpg} \\ \hline +% \makecell{\text{Külső összekapcsolás} \\ \text{R \{LEFT | RIGHT | FULL\} OUTER JOIN S}} & \makecell +% { +% \includegraphics[width=0.25\linewidth]{img/img_leftjoin.jpg}\\ +% \includegraphics[width=0.25\linewidth]{img/img_rightjoin.jpg}\\ +% \includegraphics[width=0.25\linewidth]{img/img_fulljoin.jpg} +% } \\ +% \end{tabular}$ + + \begin{itemize} + \item Descartes-szorzat: R CROSS JOIN S, vagy ,,R,S" +% \begin{center} +% \includegraphics[width=0.35\linewidth]{img/cross-join.png} +% \end{center} + \item Természetes összekapcsolás: R NATURAL JOIN S + \item Théta-összekapcsolás: R INNER JOIN S ON $<$feltétel$>$ +% \begin{center} +% \includegraphics[width=0.25\linewidth]{img/img_innerjoin.jpg} +% \end{center} + \item Külső összekapcsolás: R $\{$LEFT $|$ RIGHT $|$ FULL$\}$ OUTER JOIN S. LEFT az R lógó sorait őrzi meg, RIGHT az S-ét, FULL az összeset.\\ +% \begin{center} +% \includegraphics[width=0.25\linewidth]{img/img_leftjoin.jpg} +% \includegraphics[width=0.25\linewidth]{img/img_rightjoin.jpg} +% \includegraphics[width=0.25\linewidth]{img/img_fulljoin.jpg} +% \end{center} + \end{itemize} + + \subsection*{DCL (Data Control Language)} + + \noindent GRANT - a felhasználó hozzáférési jogosultságokat ad az adatbázishoz.\\ + \noindent REVOKE - visszavonja a felhasználó hozzáférési jogosultságait.\\ + + \subsubsection*{DML (Data Manipulation Language)} + + \noindent A módosító utasítások nem adnak vissza eredményt, mint a lekérdezések, hanem az adatbázis tartalmát változtatják meg. Visszatérési értéke amennyiben van, akkor az a módosításban érintett sorok száma.\\ + + \noindent Három féle módosító utasítás létezik: + \begin{itemize} + \item INSERT - sorok beillesztése, beszúrása. + \begin{itemize} + \item Egyetlen sor: + \begin{itemize} + \item {\small INSERT INTO R [($<$attr. lista$>$)] VALUES ($<$konkrét értékek listája$>$);} + \end{itemize} + A tábla létrehozásánál, ha megadtunk default értékeket attribútumoknál, akkor ha nem adunk meg értéket hozzá, akkor a default lesz, egyébként NULL. + \item Több sor: + \begin{itemize} + \item {\small INSERT INTO R [($<$attr. lista$>$)] ($<$alkérdés$>$);} + \end{itemize} + \end{itemize} + \item DELETE – sorok törlése: + \begin{itemize} + \item {\small DELETE [FROM] R [WHERE $<$feltétel$>$];} + \end{itemize} + \item UPDATE – sorok komponensei értékeinek módosítása: + \begin{itemize} + \item {\small UPDATE R SET $<$attribútum értékadások listája$>$ WHERE $<$sorokra vonatkozó feltétel$>$} + \end{itemize} + \end{itemize} + + \subsubsection*{Tranzakciók} + + \noindent A tranzakció nem más, mint DML-utasítások sorozata, amelyek a munka egyik logikai egységét alkotják. A tranzakció utasításainak hatása együtt jelentkezik. A tranzakció sikeres végrehajtása esetén a módosított adatok véglegesítődnek, a tranzakcióhoz tartozó visszagörgetési szegmensek újra felhasználhatóvá válnak. Ha viszont valamilyen hiba folytán a tranzakció sikertelen (bármelyik utasítása nem hajtható végre), akkor visszagörgetődik, és az adatbázis tranzakció előtti állapota nem változik meg. Az Oracle lehetőséget biztosít egy tranzakció részleges visszagörgetésére is. \\ + + \noindent Minden SQL utasítás egy tranzakció része. A tranzakciót az első SQL utasítás indítja el. Ha egy tranzakció befejeződött, a következő SQL utasítás új tranzakciót indít el. \\ + + \noindent A tranzakció explicit véglegesítésére a COMMIT utasítás szolgál. + + \noindent A COMMIT a tranzakció által okozott módosításokat átvezeti az adatbázisba és láthatóvá teszi azokat más munkamenetek számára, felold minden – a tranzakció működése közben elhelyezett – zárat és törli a mentési pontokat.\\ + + \noindent A SAVEPOINT utasítással egy tranzakcióban mentési pontokat helyezhetünk el. Ezek a tranzakció részleges visszagörgetését szolgálják. Az utasítás alakja: + \begin{itemize} + \item SAVEPOINT mentési\_pont; + \end{itemize} + + \noindent A név nemdeklarált azonosító, amely a tranzakció adott pontját jelöli meg. A név egy másik SAVEPOINT utasításban felhasználható. Ekkor a később kiadott utasítás hatása lesz érvényes.\\ + + \noindent A visszagörgetést a ROLLBACK utasítás végzi, alakja: + \begin{itemize} + \item ROLLBACK [TO [SAVEPOINT] mentési\_pont]; + \end{itemize} + + \noindent Az egyszerű ROLLBACK utasítás érvényteleníti a teljes tranzakció hatását (az adatbázis változatlan marad), oldja a zárakat és törli a mentési pontokat. A tranzakció befejeződik.\\ + + \noindent A TO utasításrésszel rendelkező ROLLBACK a megadott mentési pontig görgeti vissza a tranzakciót, a megadott mentési pont érvényben marad, az azt követők törlődnek, a mentési pont után elhelyezett zárak feloldásra kerülnek és a tranzakció a megadott mentési ponttól folytatódik.\\ + + \noindent A COMMIT utasítás végrehajtása után a tranzakció véglegesnek tekinthető. A tranzakció módosításai véglegesítődnek. \\ + \noindent A ROLLBACK utasítás esetén a tranzakció abortál, azaz az összes utasítás visszagörgetésre kerül. + \begin{itemize} + \item Alapvető hibák, mint például 0-val való osztás esetén a ROLLBACK automatikus függetlenül, hogy volt-e rá explicit utasítás. + \end{itemize} + + \noindent Az SQL négy elkülönítési szintet definiál, amelyek megmondják, hogy milyen interakciók engedélyezettek az egy időben végrehajtódó tranzakciók közt. + \begin{enumerate} + \item SERIALIZABLE: A tranzakciók ütemezése konfliktus ekvivalens egy soros ütemezéssel. Azaz a tranzakciók úgy ütemeződnek, mintha egymás után futnának le. + \item READ COMMITTED: Olvasáskor mindig a már rögzített (commitált) eredményt kapjuk. Ha fut egy tranzakció ami már változtatott az általunk kívánatos sorokon, akkor mi a régi eredményeket kapjuk. Ha sokan írják az adatbázist, itt lassulás következhet be, más folyamatok arra várnak, hogy az egész tábla frissítése befejeződjön. + \item REPEATABLE READ: Csak rögzített rekordokat olvasunk. Vagyis nem várunk a teljes tábla frissítésére, ami már rögzített rekord az olvasható is. + \item READ UNCOMMITTED: Olyan adatokat is olvashatunk, amelyek még nincsenek rögzítve. Piszkos olvasás. A tranzakció vége előtt már olvashatók a nem rögzített adatok. + \end{enumerate} + + \section*{Az SQL procedurális kiterjesztése (PL/SQL vagy PSM)} + + Amikor az SQL utasításokat egy alkalmazás részeként, programban használjuk, a következő problémák léphetnek fel: + \begin{itemize} + \item Osztott változók használata: közös változók a nyelv és az SQL utasítás között (ott használható SQL utasításban, ahol kifejezés használható). + \item A típuseltérés problémája: Az SQL magját a relációs adatmodell képezi. Tábla – gyűjtemény, sorok multihalmaza, mint adattípus nem fordul elő a magasszintű nyelvekben. A lekérdezés eredménye hogyan használható fel? \\ + Három esetet különböztetünk meg attól függően, hogy a SELECT FROM [WHERE stb] lekérdezés eredménye skalárértékkel, egyetlen sorral vagy egy listával (multihalmazzal) tér-e vissza. + \begin{enumerate} + \item SELECT eredménye egy skalárértékkel tér vissza, elemi kifejezésként használhatjuk. + \item SELECT egyetlen sorral tér vissza + \begin{itemize} + \item SELECT $e_1, \ldots, e_n$ INTO $\text{vált}_1, \ldots, \text{vált}_n$\\ + A végrehajtásnál visszatérő üzenethez az SQL STATE változóban férhetünk hozzá. + \end{itemize} + \item SELECT eredménye több sorból álló tábla, akkor az eredményt soronként bejárhatóvá tesszük, kurzorhasználatával. + \end{enumerate} + \end{itemize} +\newpage + \noindent Háromféleképpen is megközelíthetjük programozási szempontból: + \begin{enumerate} + \item SQL kiterjesztése procedurális eszközökkel, az adatbázis séma részeként tárolt kódrészekkel, tárolt modulokkal (pl. PSM = Persistent Stored Modules, Oracle PL/SQL). + \item Beágyazott SQL (sajátos előzetes beágyazás EXEC SQL. - Előfordító alakítja át a befogadó gazdanyelvre/host language, pl. C) + \item Hívásszintű felület: hagyományos nyelvben programozunk, függvénykönyvtárat használunk az adatbázishoz való hozzáféréshez (pl. CLI = call-level interface, JDBC, PHP/DB) + \end{enumerate} + + \noindent PSM: Persistent Stored Procedures. SQL utasítások és konvencionális elemek (if, while stb) keverékéből áll. Olyan dolgokat is meg lehet csinálni, amit önmagában az SQL-ben nem. + + \subsection*{PL/SQL\\} + + \noindent A PL/SQL (Procedural Language/Structured Query Language) az Oracle által az SQL kiterjesztéseként kifejlesztett procedurális programozási nyelv (Ada alapokon).\\ + + \noindent A PL/SQL nem tartalmazza az SQL teljes utasításkészletét, csak azon utasításokat, melyek az adatkezelő eljárások során nagyobb szereppel rendelkeznek: SQL SELECT, INSERT, DELETE, UPDATE illetve OPEN, FETCH, CLOSE utasításait. Így a PL/SQL nyelvben lehetőség van az SQL adatkezelő utasításainak, a kurzor szerkezetnek és a tranzakciókezelő utasításoknak a használatára, de hiányoznak belőle például az adatdefiníciós és a védelmet szabályzó utasítások.\\ + + \noindent A PL/SQL nyelv viszont tartalmazza az alapvető vezérlési elemeket, így a WHILE ciklust és az IF elágazást is. A PL/SQL-ben lehetőség van saját memóriaváltozók létrehozására, melyekkel közbenső számítási eredmények tárolhatók. Igen erős a nyelvhez kapcsolódó hibakezelési komponens, s számos függvény segíti a rugalmas, hatékony programfejlesztést.\\ + + \noindent Mivel a PL/SQL alkalmazásával az adatkezelő utasítások nem egyesével végrehajtott SQL utasítások formájában kerül végrehajtásra az adatbáziskezelőhöz, ezért a végrehajtási sebesség is jelentősen javítható a PL/SQL segítségével. A PL/SQL eljárások feldolgozása ugyanis programegységekben, úgynevezett blokkokban történik. A blokkban helyet foglaló SQL utasítások együttesét hatékonyabban lehet optimalizálni, mint az egyenként végrehajtott SQL utasításokat. \\ + + \noindent A PL/SQL alkalmazható többek között az SQLPlus, SQLForms és más komponensekben is. E nyelv előnye, hogy független az alkalmazott konfigurációtól, operációs rendszertől, s csak a futó adatbáziskezelőtől függ a konkrét felépítése, formátuma.\\ + + \noindent Összefoglalóan a PL/SQL előnyei az alábbi pontokban adhatók meg: + \begin{itemize} + \item procedurális elemek és SQL ötvözése + \item hatékonyság + \item jobb integráció az adatbáziskezelő rendszerrel + \item rugalmasság, hordozhatóság. + \end{itemize} +\newpage + \noindent A következő konstrukciókat adja az SQL-hez: + \begin{itemize} + \item változók és típusok, + \item vezérlési szerkezet, + \item kurzorok, kurzorváltozók + \item alprogramok, tárolt eljárások és függvények, + \item kivételkezelés, + \item triggerek + \item objektumorientált eszközök. + \end{itemize} + + \noindent A PL/SQL nyelv alapvető strukturális egysége a PL/SQL blokk. A legfőbb hasonlósága az eljárással az, hogy a PL/SQL blokk is adatdefiníciós, majd azt követő műveleti részből áll, s a végrehajtás egységét jelenti. A különbség legfontosabb elemi, hogy itt szintaktikailag külön szerepel egy hibakezelő rész, s a blokkok egymásba is ágyazhatók, ahol a beágyazott blokk a műveleti vagy hibakezelő részben szerepelhet.\\ + \noindent A PL/SQL blokk szerkezete: + + \begin{verbatim} + [címke] + [DECLARE deklarációs utasítások ] + BEGIN + végrehajtandó utasítások + [ EXCEPTION + kivételkezelés ] + END [név]; + \end{verbatim} + + \noindent A deklarációs rész külön válik a törzstől és opcionális, és a DECLARE kulcsszó csak egyszer szerepel a rész elején, nincs minden változó előtt. Értékadás := jellel.\\ + + \noindent Több új típus is van, pl NUMBER lehet INT van REAL. Egy attribútum típusára lehet hivatkozni is: R.x\%TYPE. Létezik R\%ROWTYPE is, ami egy tuple-t ad vissza. Az x tuple komponensének értékét így kapjuk meg: x.a. + \noindent ELSEIF (PSM-ben) helyett ELSIF. LEAVE ciklus helyett EXIT WHEN $<$feltétel$>$.\\ + + \noindent Deklarációs rész tartalma lehet: + \begin{itemize} + \item Típus definíció + \item Változó deklaráció + \item Nevesített konstans deklaráció + \item Kivétel deklaráció + \item Kurzor definíció + \item Alprogram definíció + \end{itemize} + \ \\ + \noindent A PL/SQL nem tartalmaz I/O utasításokat.\\ + + \noindent A DBMS\_OUTPUT csomag segítségével üzenetet helyezhetünk el egy belső pufferbe. PUT\_LINE eljárás üzenetet ír a pufferbe. A puffer tartalmát a SET SERVEROUTPUT ON utasítással jeleníthetjük meg a képernyőn.\\ + + \noindent Példa: +{\small +\begin{verbatim} + SET SERVEROUTPUT ON + BEGIN + DBMS_OUTPUT.PUT_LINE('Hello World!'); + END; +\end{verbatim} +} + + \subsubsection*{Tárolt eljárások (Stored Procedure)} + + \noindent A tárolt eljárások egy olyan PL/SQL blokkot jelentenek, amelyek paraméterezhetők, saját egyedi azonosító nevük van és az adatbázisban lefordított formában letárolásra kerülnek.\\ + Ennek megoldásnak az előnye, hogy a PL/SQL blokk több helyről is elérhető, elég csak egyszer definiálni, s gyorsabb végrehajtást tesz lehetővé, mint az egyedileg elküldött PL/SQL blokk.\\ + + \noindent A eljárás deklarációja + {\small + \begin{verbatim} + CREATE PROCEDURE eljárás-név ( + paraméter-lista) + [DECLARE ... deklarációk] + BEGIN + az eljárás utasításai; + END; + \end{verbatim} + } + \noindent ahol a PL/SQL\_blokk az eljárás törzse, s megfelel egy szabályos PL/SQL blokknak.\\ + A paraméterlista elemei vesszővel vannak elválasztva egymástól, s minden elem + \begin{verbatim} + paraméternév jelleg adattipus + \end{verbatim} + hármasból áll, melyben a \emph{jelleg} arra utal, hogy kimenő vagy bejövő paraméterről van-e szó.\\ + Ennek megfelelően a jelleg lehetséges értékei: + \begin{itemize} + \item IN bementi paraméter + \item OUT kimeneti paraméter + \item IN OUT mindkét irányba mutató adatforgalmat lebonyolító paraméter + \end{itemize} + \noindent Az adattípus a szokásos PL/SQL adattípusok valamelyike lehet. A törzsben szereplő PL/SQL blokkban a paraméterek ugyanúgy használhatók, mint a normál PL/SQL változók, így nem kell eléjük kettőspontot sem tenni a hivatkozáskor. + + \noindent A PL/SQL blokk jellemzője, hogy nem kell benne DECLARE kulcsszót megadni a blokk kezdetének kijelölésére. +\newpage + \subsubsection*{Tárolt függvény (Stored Function)} + + \noindent A tárolt függvények definíciója hasonló az eljárások definíciójához, azzal a különbséggel, hogy itt visszatérési érték is értelmezett. + {\small + \begin{verbatim} + CREATE FUNCTION függvény-név ( + paraméter-lista) RETURN értéktípus + BEGIN + utasítások; + END; + \end{verbatim} + } + \noindent A visszatéréi érték típusát a paraméterlistát követően, a zárójel után megadott taggal jelöljük. \\ + A visszatérési értéket a RETURN utasítással határozzuk meg, mint az alábbi példa is mutatja.\\ + + \noindent Példa: adott típusú autók átlagárát határozza meg. + {\small + \begin{verbatim} + CREATE FUNCTION atlag (tip IN CHAR(20)) RETURN NUMBER + IS + ertek NUMBER; + BEGIN + SELECT AVG(ar) INTO ertek FROM + autok WHERE tipus LIKE tip; + RETURN (ertek); + END; + \end{verbatim} + } + + \paragraph*{Triggerek} + + \noindent A trigger koncepció az aktív integritási feltételek közé tartozik. A trigger két komponensből áll, egy \emph{feltétel} és egy \emph{választevékenység} részből.\\ + A trigger működési elve igen egyszerű: ha a feltétel bekövetkezik, akkor végrehajtódik a \lword{választevékenység}. A feltételt valamilyen adatkezelő művelet formájában adhatjuk meg. Vagyis a triggerrel az figyelhető, hogy végrehajtásra kerül-e valamilyen kijelölt adatkezelő művelet. A trigger alkalmazásával számos aktív integritási szabály definiálása az alkalmazásból átkerülhet az adatbázisba. \\ + + {\small + \noindent Ezáltal könnyebbé es gyorsabbá válhat az alkalmazások fejlesztése is, nem is beszélve a nagyobb biztonságról, hiszen ebben az esetben az alkalmazói program hibájából, a programozó feledékenysége miatt nem sérülhet meg az adatbázis integritása, hiszen az ellenőrzés mindig végrehajtódik az adatbáziskezelő szoftver által.\\ + } + + \noindent A triggereknél a választevékenységet az Oracle RDBMS esetén PL/SQL blokk formájában lehet megadni. Így választevékenység mindazon tevékenységi körre kiterjedhet, amik a PL/SQL nyelv keretében leírhatók, sőt a rendszer még bizonyos extra elemeket is bevezet a trigger koncepcióhoz történő jobb csatlakozáshoz.\\ + + \noindent A trigger definiálásának általános formátuma következőképpen írható le: + + \begin{itemize} + \item CREATE TRIGGER triggernév kiváltó\_ok PL/SQL\_blokk; + \end{itemize} + ahol a kiváltó\_ok a feltételt, míg a PL/SQL\_blokk a választevékenységet adja meg. A kiváltó\_ok rész több komponensből áll a feltétel pontos megadására. A fontosabb komponensek jelentése és formátuma a következő: + \begin{itemize} + \item előtag művelet ON tábla [FOR EACH ROW[WHEN feltétel]] + \end{itemize} + \noindent Az előtag azt jelöli ki, hogy a választevékenységet a figyelt művelet elvégzése előtt vagy után kell-e végrehajtani. +\newpage + \noindent Az előtagban megadható kulcs-szavak: + \begin{itemize} + \item BEFORE művelet előtti végrehajtás + \item AFTER művelet utáni végrehajtás + \end{itemize} + + \noindent A művelet a figyelt adatkezelő műveletek körét jelöli ki, így az INSERT, UPDATE és DELETE utasításokra terjed ki. Egy triggerben egyidejűleg több tevékenység is figyelhető. A módosításnál a figyelés leszűkíthető az egyes mezőkre. \\ + + \noindent Az alábbi kulcsszavak szerepelhetnek a művelet részben: + \begin{itemize} + \item DELETE rekord törlés + \item INSERT rekord bővítés + \item UPDATE [OF mezőlista] rekord módosítás + \end{itemize} + + \noindent Ha több műveletet is figyelni kívánunk, akkor az egyes műveleteket az OR kapcsolóval lehet összekötni. + + \noindent A tábla azt a táblát jelöli ki, melyre a műveletek vonatkoznak. Egy trigger csak egy táblára vonatkozhat. + + \noindent Az opcionális FOR EACH ROW tag akkor használatos, ha a megadott választevékenységet a műveletben érintett minden egyes rekordra külön-külön végrehajtásra kerülne. Ha ezt a tagok elhagyjuk, akkor a választevékenység az utasítás szinten hajtódik végre, utasításonként egyszer fut le a PL/SQL blokk.\\ + + \noindent Így például a + \begin{verbatim} + CREATE TRIGGER t1 AFTER DELETE ON auto + BEGIN + INSERT INTO naplo VALUES ('torles', SYSDATE); + END; + \end{verbatim} + \noindent triggernél a + \begin{verbatim} + DELETE FROM auto WHERE tip LIKE 'Fiat126%'; + \end{verbatim} + utasítás hatására egyetlen egyszer hívódik meg a PL/SQL blokk, azaz egyetlen egy új rekord fűződik be a napló állományba. Viszont a + \begin{verbatim} + CREATE TRIGGER t2 AFTER DELETE ON auto FOR EACH ROW + BEGIN + INSERT INTO naplo VALUES ('torles', SYSDATE); + END; + \end{verbatim} + trigger esetén ugyanazon törlési műveletnél többször is meghívódik a PL/SQL blokk, mégpedig annyiszor, ahány rekord kerül kitörlésre. Ekkor a napló táblába annyi új rekord kerül be, ahány rekordot kitöröltek az auto táblából. + + \noindent A rekordszintű triggerek esetén lehetőség van arra, hogy ne minden érintett rekordra hívódjon meg a választevékenység, hanem csak azokra, amelyek egy megadott feltételnek eleget tesznek. E szelekciós feltételt a következő opcionális taggal adhatjuk meg. + \begin{verbatim} + WHEN feltétel + \end{verbatim} + + \noindent A létrehozott triggerek később módosíthatók, illetve megszüntethetők az ALTER TRIGGER és DROP TRIGGER utasításokkal.\\ + + \noindent A triggerek definiálásánál arra figyelni kell, hogy a triggerek nem izoláltak egymástól teljesen, mivel egy az egyik triggerhez kötött választevékenység kiválthat egy másik triggert, így kialakulhat egy trigger meghívási láncolat. A triggerek tervezésénél ügyelni kell e láncolatok kialakulására és hatására is.\\ + + \noindent A rendszer azt is megengedi, hogy több triggert is definiáljunk ugyanazon műveletek figyelésérére. Egy művelethez ugyanis létezhet BEFORE művelet szintű, BEFORE rekord szintű, AFTER művelet szintű és AFTER rekord szintű trigger.\\ + + \noindent Az egyes trigger típusok végrehajtási sorrendje: + \begin{enumerate} + \item BEFORE művelet szintű trigger + \item ciklus az érintett rekordokra + \begin{enumerate} + \item BEFORE rekord szintű trigger a rekordra + \item rekord zárolása és módosítása, integritási feltételek ellenőrzése + \item AFTER rekord szintű trigger a rekordra + \end{enumerate} + \item késeltett ellenőrzésű integritási feltételek ellenőrzése + \item AFTER műveleti szintű trigger + \end{enumerate} + \noindent Több kiváltott tigger esetén a választevékenység minden tagjának sikeresen végre kell hajtódnia, hogy a művelet, és minden általa kiváltott választevékenység megőrződjön.\\ + + \noindent A rekord szintű triggerek esetén lehetőség van arra, hogy az éppen érintett rekord adataihoz hozzáférjünk a PL/SQL blokkon belül. A mezők értékeit két rendszer rekordváltozón keresztül érhetjük el. A rendszer kétféle rekordváltozót is tartalmaz, az egyik a rekord régi, módosítás előtti, míg a másik a rekord új, módosítás utáni értékeit tartalmazza. A két rekordváltozó alapértelmezés szerinti azonosítói: + \begin{itemize} + \item OLD régi rekordérték + \item NEW új rekordérték + \end{itemize} + \noindent A PL/SQL blokkon belül e változók, mint külső, nem a PL/SQL blokkban deklarált változók szerepelnek, ezért hivatkozáskor nevük elé egy kettőspontot kell tenni, hasonlóan ahogy a beágyazott SQL-ben a gazdanyelvi változókat használhatjuk. A rekordon belüli régi mezőkértékekre a + \begin{itemize} + \item :OLD.mezőnév + \end{itemize} + míg az új értékekre a + \begin{itemize} + \item :NEW.mezőnév + \end{itemize} + szimbólumokkal hivatkozhatunk. E rekordváltozók azonban csak a rekord szintű triggereknél élnek, és bizonyos műveleteknél csak az egyik formátuma él. Így az INSERT esetén nincs értelme az OLD hivatkozásnak, míg a DELETE esetén a NEW hivatkozásnak.\\ +\newpage + \noindent Ha egy triggert több tevékenységhez kapcsoltunk, pl. beszúráshoz és módosításhoz is, akkor a PL/SQL blokkon belül a + \begin{itemize} + \item INSERTING beszúrás jelző + \item UPDATING módosítás jelző + \item DELETING törlés jelző + \end{itemize} + rendszer által definiált konstansok segítségével eldönthető, hogy mely művelet volt az éppen futó választevékenység kiváltója. E változók igaz értéket vesznek fel, ha a hozzájuk tartozó művelet volt a kiváltó tevékenység.\\ + + \noindent Az alábbi példában a dolgozók tábla módosítása esetén az osztályok táblát is aktualizálja. A kapcsolat a két tábla között abban áll, hogy minden dolgozónak van egy osztálya, ahol dolgozik, és az osztályok táblában van egy olyan mező, amely az ott dolgozók összfizetését tartalmazza. Amikor egy dolgozó elmegy az osztályról, vagy egy új dolgozó jön az osztályra, vagy csak a dolgozó fizetése változik, akkor a osztályok tábla megfelelő rekordját is módosítani kell: +{\small +\begin{verbatim} +CREATE TRIGGER ossz_fiz AFTER DELETE OR +INSERT OR UPDATE OF oszt, fiz ON dolgozok +FOR EACH ROW + // PL/SQL blokk kezdete +BEGIN + // ha törlés van vagy dolgozó áthelyezés + IF DELETING OR (UPDATING AND + :OLD.oszt != :NEW.oszt) THEN + // összfizetés csökkentése a régi osztálynál + UPDATE osztalyok SET osszfiz = osszfiz - :OLD.fiz + WHERE oszt = :OLD.oszt; + END IF; + // ha új dolgozó vagy dolgozó áthelyezés + IF INSERTING OR (UPDATING AND + :OLD.oszt != :NEW.oszt) THEN + // összfizetés növelése az új osztályon + UPDATE osztalyok SET osszfiz = osszfiz + :NEW.fiz + WHERE oszt = :OLD.oszt; + END IF; + // ha fizetés módosítás + IF UPDATING AND :NEW.oszt = :OLD.oszt AND + :NEW.fiz != :OLD.fiz) THEN + // összfizetés módosítás az osztályon + UPDATE osztalyok SET osszfiz = osszfiz + :NEW.fiz + - :OLD.fiz WHERE oszt = :NEW.oszt; + END IF; + // blokk vége +END; +\end{verbatim} +} + \noindent A triggerek alkalmazásának rugalmasságát fokozza, hogy ideiglenesen le is lehet tiltani őket, majd egy későbbi időpontban újra lehet engedélyezni a működését. A triggerek engedélyezése és letiltása az ALTER TRIGGER utasítással lehetséges.\\ + + \noindent A triggerek segítségével igen hatékony integritás ellenőrző, naplózó eszközt kaptunk a kezünkbe, melyet célszerű alaposan elsajátítani, mivel a jövő adatbáziskezelő rendszerei egyre nagyobb mértékben fognak ezen mechanizmusra támaszkodni.\\ + + \noindent A trigger definiálása a többi adatbázis objektum definiálásához hasonlóan az SQL nyelven keresztül történik. A fenti minta trigger teljes szövege egyetlen egy SQL utasításnak fog megfelelni, amelyet pl. az SQLPlus segítségével interaktívan is kiadhatunk.\\ + + \paragraph*{Kurzorok} + + \noindent A PL/SQL kurzorszerkezet használata ugyanazon elvi lépésekre épül, mint a beágyazott SQL esetén, vagyis a + \begin{itemize} + \item kurzor deklaráció + \item kurzor megnyitás + \item rekord beolvasások ciklusa + \item kurzor lezárás + \end{itemize} + + \noindent A kurzor létrehozása a PL/SQL nyelvben a deklarációs részben, s nem a műveleti részben történik, mint az a beágyazott SQL esetén történt. A kurzor deklarációjának formátuma: + \begin{verbatim} + DECLARE + ... + CURSOR kurzornév (paraméterlista) IS SELECT_utasítás; + \end{verbatim} + + \noindent A következő példában egy kurzort deklarálunk a paraméterként megadott dátum előtt született személyek nevének és lakcímének a lekérdezésére: + \begin{verbatim} + DECLARE + ... + CURSOR lista (datum DATE) IS SELECT nev, lakcim + FROM szemelyek WHERE szuldat < datum; + \end{verbatim} + + \noindent A deklarációs utasításban egy azonosító nevet rendelünk a kurzor szerkezethez, s e név segítségével hajtjuk végre a lekérdezést, s e név segítségével férhetünk hozzá az eredményhez is. A kurzor a PL/SQL nyelvben paraméteresen is deklarálható. A paramétereket a kapcsolódó SELECT utasításban kerülnek felhasználásra. A paraméterlista a paraméter azonosító neve mellett a paraméter típusát is tartalmazza. A listaelemek vesszővel vannak elválasztva egymástól. A PL/SQL szabályai szerint a minden felsorolt paraméternek meg kell jelennie a kapcsolódó SELECT utasításban is.\\ + + \noindent A kurzor megnyitása után a kapott adatokat egyenként lekérdezhetjük, s módosíthatjuk is. Módosítás esetén azonban a kurzor deklarációjánál jelezni kell, hogy nemcsak olvasásra hozzuk létre a kurzort. A módosítási igényt a SELECT utasítás végén álló, már ismert + \begin{itemize} + \item FOR UPDATE OF mezőlista + \end{itemize} + opcióval jelezzük. A kurzor által visszaadott rekordot a + \begin{itemize} + \item CURRENT OF kurzornév + \end{itemize} + feltétellel jelölhetjük a megfelelő UPDATE utasításban. + + \noindent A kurzor megnyitása, vagyis kijelölt lekérdezés elvégzése az + \begin{itemize} + \item OPEN kurzornév (paraméterlista); + \end{itemize} + utasítással lehetséges, ahol a zárójelek között megadott paraméterlista opcionális elem. A paraméterlista most konkrét értékeket tartalmaz, melyek sorra behelyettesítődnek a deklarációkor kijelölt formális paraméterekbe, s ezen értékekkel fog a lekérdezés végrehajtódni. Ugyanaz a kurzor többször is végrehajtható különböző aktuális paraméterértékek mellett. + + \noindent Az eredményrekordok egyenként történő lekérdezésére a + \begin{itemize} + \item FETCH kurzornév INTO változólista; + \end{itemize} + utasítás szolgál. A változólistának vagy annyi elemi változót kell tartalmaznia, ahány elemű az eredménytáblázat, vagy olyan rekordváltozót ad meg, mely struktúrája megegyezik az eredménytábla struktúrájával. A vizsgált PL/SQL változatban a kurzorpointer csak előre léptethető, mégpedig egy rekorddal.\\ + + \noindent A kurzor felhasználása után célszerű a kurzor által lefoglalt erőforrásokat felszabadítani. Ehhez ki kell adni a + \begin{itemize} + \item CLOSE kurzornév; + \end{itemize} + utasítást.\\ + + \noindent Az eredménytábla több rekordot is tartalmazhat, ezért a FETCH utasítást többször egymás után is ki kell adni a teljes választábla feldolgozásához. Az eredménytábla végének figyelését, vagyis annak ellenőrzését, hogy az összes rekordot érintettük-e már, egy kurzor attribútum segítségével végezhetjük el.\\ + + \noindent Az attribútum, melynek alakja + \begin{itemize} + \item kurzornév\%NOTFOUND + \end{itemize} + akkor tartalmaz igaz értéket, ha elértük az eredménytábla végét, s nincs már további feldolgozásra váró rekord a kurzornál.\\ + + \noindent A lekérdező ciklus, melynek magjában a megfelelő FETCH utasítás áll, egy alap LOOP ciklus segítségével is megoldható, melybe a kilépéshez beteszünk egy + \begin{itemize} + \item EXIT WHEN kurzornév\%NOTFOUND; + \end{itemize} + utasítást is.\\ + + \paragraph*{Hibakezelés\\} + + \noindent A hibakezelő rutinokat a PL/SQL blokk harmadik komponense, az EXCEPTION kulcsszóval kezdődő rész tartalmazza. A hibakezelő részben minden egyes felismert hibatípushoz egyedi választevékenység definiálható. A hibakód és a választevékenység összerendelése a + \begin{verbatim} + WHEN hibakód THEN + utasítások; + \end{verbatim} + szerkezettel lehetséges. A hibakód utalhat általános, a rendszer által felismert hibákra, és saját, egyedi hibatípusokra is. A definiált tucatnyi rendszer hibakódból néhányat mutat be az alábbi felsorolás: + \begin{itemize} + \item NO\_DATA\_FOUND A SELECT utasítás vagy a FETCH nem tud eredményrekordot visszaadni + \item ZERO\_DIVIDE nullával való osztás + \item VALUE\_ERROR adatkonverziós hiba + \end{itemize} + + \noindent A PL/SQL hibakezelési mechanizmusának számos előnye van a hagyományos módszerrel szemben. A hagyományos eljárásokban a hibakezelés szorosan összefonódott az utasításokkal: minden művelet után egyedileg kellett megadni a hibaellenőrző és lekezelő utasításokat. A PL/SQL ezzel szemben egy központi helyen tárolja a hibakezelő utasításokat. E módszer pozitív vonása, hogy + \begin{itemize} + \item csak egyszer kell leírni a hibakezelő kódot, áttekinthetőbb forrásszöveg + \item könnyebb módosítási lehetőség, csak egy helyen kell módosítani a hibakezelő rutint. + \item nagyobb megbízhatóság, mivel a hibaellenőrzés automatikusan minden műveletre kiterjed, nem lehet kibújni alóla, hiszen automatikusan, mindig érvényesül. + \end{itemize} + + \noindent A hiba fellépte esetén a normál vezérlés megszakad, s hibakezelő utasításcsoport kapja meg vezérlést. A hiba feldolgozása után a blokk végrehajtása is befejeződik. Egy adott hibatípus esetén, ha az aktuális blokk nem tartalmazza a megfelelő hibakezelő rutint, akkor a külső blokkok átnézésével a rendszer megpróbálja a megfelelő hibakezelő rutint megtalálni.\\ + + \noindent Ha a hibakezelő utasításcsoportot nem csak egyetlen egy hibatípushoz szánjuk hozzárendelni, akkor lehetőség van a WHEN után több hibatípust is felsorolni, ahol az egyes típusokat az OR operátorral kötjük össze. Emellett alkalmazhatjuk a WHEN után az OTHER kulcsszót is, mellyel minden, explicit ki nem jelölt hibatípus esetén ide kerül a vezérlés.\\ + + \noindent A rendszer által észlelt hibák mellet a felhasználó maga is kiválthat végrehajtási hibákat. Itt most nem a véletlen programozási hibákról van szó, hanem arról, hogy a programozó explicit aktivizálhat hibatípusokat. Egy megadott típusú hiba kiváltása a + \begin{verbatim} + RAISE hibakód; + \end{verbatim} + utasítással történik. Ekkor a vezérlés a megfelelő WHEN utasításra ugrik. A saját hibatípusokat, a gyári rendszer hibatípusoktól eltérően deklarálni kell a blokk deklarációs részében. A hibatípus létrehozása a + \begin{verbatim}használalatát + hibatipus EXCEPTION; + \end{verbatim} + utasítással lehetséges. Az alábbi programrészlet egy saját hibatípus használatát mutatja be: + {\small + \begin{verbatim} + DECLARE + sajathiba EXCEPTION; + BEGIN + ... + IF x < 16 THEN + RAISE sajathiba; + END IF; + ... + EXCEPTION + ... + WHEN sajathiba THEN + ROLLBACK; + ... + END; + \end{verbatim} + } +\newpage + \noindent \textbf{Példa összetett PL/SQL utasításra\\} + + \noindent A minta PL/SQL blokk, amelyben az auto táblában a FIAT típusú autók átlagáránál drágább OPEL típusú autók árát $12\%$-kal növeljük, ha színkóduk P betűvel kezdődik és $9\%$-kal növeljük, ha egyéb színűek. +{\small +\begin{verbatim} +DECLARE + atlag NUMBER(10); -- átlagár + szin CHAR(3); -- színkód + CURSOR autok (atg NUMBER(10)) IS -- kurzor + SELECT szin + FROM auto + WHERE ar > atg + AND tip LIKE 'OPEL%' FOR UPDATE OF ar; +BEGIN + BEGIN -- alblokk az atlg kiszámításhoz + SELECT SUM(ar)/Count(ar) + INTO minta.atlag + FROM auto + WHERE tip LIKE 'FIAT%'; + + EXCEPTION + WHEN zero_divide THEN -- ha nincs FIAT autó, akkor 100000 lesz az ár + minta.atlag := 100000; + END; + + OPEN autok (minta.atlag); -- kurzor megnyitása + + LOOP -- lekérdező ciklus + FETCH autok + INTO minta.szin; -- rekord beolvasás + + -- kilépés ha nincs több + EXIT + WHEN autok%NOTFOUND; + IF minta.szin LIKE 'P%' THEN + UPDATE auto -- módosítás + SET ar = ar * 1.12 + WHERE CURRENT OF autok; + + ELSE + UPDATE auto + SET ar = ar * 1.09 + WHERE CURRENT OF autok; + + END IF; -- ciklus vége + END LOOP; + CLOSE autok; -- kurzor lezárása + COMMIT; -- eredmények végelegesítése +END minta; -- blokk vége +\end{verbatim} +} + + \section*{Relációs adatbázis-sémák tervezése, normálformák, dekompozíciók} + + \subsection*{Relációs adatbázis-sémák tervezése} + + \noindent Az adatbázisok tervezésekor az egyik legfőbb feladat, a redundancia-mentes adatszerkezetet kialakítása.\\ + + \noindent Redundanciáról akkor beszélünk, ha valamely tényt vagy a többi adatból levezethető mennyiséget ismételten (többszörösen) tárolunk. + + \subsection*{Relációk felbontása} + + \noindent A redundancia, a szükségtelen tároló terület lefoglalása mellett, komplikált frissítési és karbantartási műveletekhez vezet, melyek könnyen anomáliákat idézhetnek elő.\\ + + \noindent \textbf{Anomáliák\\} + + \noindent Az anomália az adatbázisban olyan rendellenesség, mely valamely karbantartási műveletnél plusz műveletek beiktatását igényli, ezzel felesleges redundanciát okozva. + + {\small + \begin{center} + \noindent $\begin{array}{|g|g|c|c|c|c|} + \hline + \multicolumn{6}{|c|}{\textbf{Dolgozó}} \\ \hline + \text{Név} & \text{Adószám} & \text{Cím} & \text{Osztálykód} & \text{Osztálynév} & \text{VezAdószám} \\ \hline + \text{Kovács} & 1111 & \text{Pécs, Vár u. 5.} & 2 & \text{Tervezési} & 8888 \\ \hline + \text{Tóth} & 2222 & \text{Tata, Tó u. 2.} & 1 & \text{Munkaügyi} & 3333 \\ \hline + \text{Kovács} & 3333 & \text{Vác, Róka u. 1.} & 1 & \text{Munkaügyi} & 3333 \\ \hline + \text{Török} & 8888 & \text{Pécs, Sas u.8.} & 2 & \text{Tervezési} & 8888 \\ \hline + \text{Kiss} & 4444 & \text{Pápa, Kő tér 2.} & 3 & \text{Kutatási} & 4444 \\ \hline + \text{Takács} & 5555 & \text{Győr, Pap u. 7.} & 1 & \text{Munkaügyi} & 3333 \\ \hline + \text{Fekete} & 6666 & \text{Pécs, Hegy u. 5.} & 3 & \text{Kutatási} & 4444 \\ \hline + \text{Nagy} & 7777 & \text{Pécs, Cső u. 25.} & 3 & \text{Kutatási} & 4444 \\ \hline + \end{array}$ + \end{center} + } + + \begin{itemize} + \item \emph{Beszúrási anomália}: Beszúrási anomáliáról beszélünk abban az esetben, amikor egy adatrekord beszúrása egy másik, hozzá logikailag nem kapcsolódó adatcsoport beszúrását kívánja meg.\\ + + \emph{Példa:} + Új dolgozó felvételénél előfordulhat, hogy az osztálynevet máshogy adják meg (például Tervezési helyett tervezési vagy Tervező).\\ + Ha új osztály létesül, amelynek még nincsenek alkalmazottai, akkor ezt csak úgy tudjuk felvenni, ha a (név, adószám, cím) mezőkhöz 'NULL' értéket veszünk. Később, ha lesznek alkalmazottak, ez a rekord fölöslegessé válik. + \item \emph{Módosítási anomália}: Abban az esetben, ha egy relációban egy adat módosítása több helyen történő módosítást igényel, akkor módosítási anomáliáról beszélünk.\\ + + \emph{Példa}: Ha egy osztály neve vagy vezetője megváltozik, több helyen kell a módosítást elvégezni. + \item \emph{Törlési anomália}: Amennyiben egy adat törlésével másik, hozzá logikailag nem kapcsolódó adatcsoportot is elveszítünk, törlési anomáliáról beszélünk.\\ + + \emph{Példa}: Ha egy osztály valamennyi dolgozóját töröljük, akkor az osztályra vonatkozó információk is elvesznek. + \end{itemize} + + \noindent A normalizálás megértéséhez szükségünk van néhány további fogalom ismeretére.\\ + + \subsection*{Funkcionális függőségek\\} + + \paragraph*{Funkcionális függőség\\} + + Funkcionális függésről akkor beszélünk, ha egy tábla valamelyik mezőjében lévő érték meghatározza egy másik mező értékét.\\ + + {\small + \noindent \emph{Példa}: Személyek tábla + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|g|c|} + \hline + \multicolumn{7}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} & \text{Telefonszam} & \text{Mobil} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} & (36) 30/555-4143 & Igen \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} & (36) 1/555-7891 & Nem \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} & (36) 42/555-1235 & Nem \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 70/555-2935 & Igen \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 1/555-7891 & Nem \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} & (36) 30/555-7777 & Igen \\ \hline + \end{array}$\\ + \end{center} + + \noindent A \emph{Személyek} táblában egyes "személy egyedek" többször is előfordulnak. Ha egy nevet megemlítünk nem biztos, hogy pontosan ki tudjuk választani a hozzá tartozó személyi igazolvány számot. Ha azonban egy személyi igazolvány számot vizsgálunk meg, biztosan meg tudjuk mondani a hozzá tartozó nevet. Ezért azt mondjuk, hogy a \emph{Nev} mező funkcionálisan függ a \emph{SzemIgSzam} mezőtől. A \emph{SzemIgSzam} mező azonban nem függ a \emph{Nev} mezőtől.\\ + } + + \paragraph*{Teljes funkcionális függőség\\} + + \noindent A funkcionális függés kiterjesztése a teljes funkcionális függés. Amikor egy adatbázist "normalizálunk", arra törekszünk, hogy minden táblában teljes funkcionális függések legyenek.\\ + + \noindent A teljes funkcionális függésnek három feltétele van: + \begin{itemize} + \item (1) egy tábla minden nem kulcs mezője függjön a kulcstól, + \item (2) minden, nem kulcs mező csak a kulcstól függjön, + \item (3) összetett kulcs esetén, minden nem kulcs mező függjön a kulcs minden elemétől. + \end{itemize} + + \paragraph*{Részleges funkcionális függőség\\} + + \noindent Részleges funkcionális függés a teljes funkcionális függés egyik akadálya. Akkor fordulhat elő egy táblában, ha abban van összetett kulcs és nem teljesül a teljes funkcionális függés (3)-as feltétele.\\ + + {\small + \noindent \emph{Példa}: + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|g|c|} + \hline + \multicolumn{7}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} & \text{Telefonszam} & \text{Mobil} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} & (36) 30/555-4143 & Igen \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} & (36) 1/555-7891 & Nem \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} & (36) 42/555-1235 & Nem \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 70/555-2935 & Igen \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 1/555-7891 & Nem \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} & (36) 30/555-7777 & Igen \\ \hline + \end{array}$\\ + \end{center} + \begin{itemize} + \item A \emph{Nev}, az \emph{Irsz}, a \emph{Varos}, és az \emph{Utca} mezők a \emph{SzemIgSzam} mezőtől függnek funkcionálisan. + \item A \emph{Mobil} mező nem a \emph{SzemIgSzam}, hanem a \emph{Telefonszam} mezőtől függ. + \item Egy személyi igazolvány szám ismeretében pontosan meg tudjuk mondani, hogy hívják az\\ + illetőt, és hol lakik. Nem tudunk azonban biztos telefonszámot mondani, hiszen egy személyi igazolvány számhoz több telefonszám is tartozik. + \item Egy telefonszám ismeretében egyértelműen megmondható, hogy az mobiltelefon-e. Az azonban még nem biztos, hogy egyértelmű nevet tudunk mondani, hiszen van olyan személy (4. rekord, Kis Veronika) aki ugyanazon a számon is elérhető. + \end{itemize} + + \noindent Részleges funkcionális függés csak akkor fordulhat elő egy táblában, ha abban összetett kulcs van.\\ + + \noindent A normalizálás során a részleges funkcionális függést meg kell szüntetni.\\ + } + + \paragraph*{Tranzitív függőség\\} + + \noindent Tranzitív függés esetén minden, nem kulcs mező függ a kulcstól, de van olyan mező, esetleg mezők, amely a kulcson kívül más mezőtől is függnek. A teljes funkcionális függés (2)-es feltétele, hogy "minden nem kulcs mező csak a kulcstól függjön".\\ + + \noindent Amennyiben ez a feltétel nem teljesül, \emph{tranzitív függésről} beszélünk. Azt a mezőt, amelytől más mezők tranzitíven függnek, \emph{tranzitív kulcsnak} hívjuk.\\ + + {\small + \noindent \emph{Példa}: + \begin{center} + \noindent $\begin{array}{|g|c|b|e|c|} + \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} \\ \hline + \end{array}$ + \end{center} + \begin{itemize} + \item A \emph{SzemIgSzam} mező a kulcs. + \item A kulcstól függ minden mező, azonban a \emph{Varos} a \emph{SzemIgSzam} mezőn kívül az \emph{Irsz} mezőtől is függ. + \item A \emph{Varos} mező tehát tranzitív függésben van, az \emph{Irsz} mező a tranzitív kulcs. + \end{itemize} + + \noindent A normalizálás során a tranzitív függést meg kell szüntetni.\\\\ + + \subsection*{Funkcionális függőségek formálisan\\} + + \noindent Legyen $R(U)$ egy relációséma, ahol $U =\big\{A_1, \ldots, A_n\big\}$ attribútum halmaz. Valamint $X$, $Y$ attribútumhalmazok, hogy $X, Y \subseteq U$.\\ + + \noindent Ekkor $Y$ \textbf{\textit{funkcionálisan függ}} $X$-től (Jelölése: $X \to Y$), ha bármely $R$ séma feletti $r$ reláció esetén, bármely két rekordjára igaz, hogy ha két rekord megegyezik X-en, akkor megegyezik az Y-on is, azaz + \begin{center} + $\forall t_1, t_2 \in r$ esetén $t_1[X]=t_2[X]\ \boldsymbol{\Rightarrow}\ t_1[Y]=t_2[Y]$. + \end{center} + Ez lényegében azt jelenti, hogy az $X$-beli attribútumok értéke egyértelműen meghatározza az $Y$-beli attribútumok értékét. Azt, hogy az $R$ kielégíti az $X \to Y$ függőséget $R \boldsymbol{\models} X \to Y$-nal jelöljük. \\ + + \noindent Az $X \to Y$ függést \emph{triviálisnak} nevezzük, ha $Y \subseteq X$, ellenekező esetben \emph{nemtriviális} ($X \cap Y = \emptyset$).\\ + + \noindent Fontos: + \begin{itemize} + \item \emph{Érdemi függés}: Azok az összefüggések, amelyek minden ilyen attribútumokkal rendelkező táblában fenn kell, hogy álljanak, az adatbázis bármely változása esetén is. + \subitem Például: $SzemelyiSzam \to Nev$ + \item \emph{Eseti függés}: Azok az összefüggések, amelyek csak egy adott időpillanatban állnak csak fent. + \subitem Például: $Nev \to SzemelyiSzam$ (csupán addig igaz, amíg minden név egyedi egy relációban) + \item Csak az érdemi függőségekkel foglalkozunk és a séma megadásakor döntjük el, hogy milyen függőségeket akarunk fenntartani. + \end{itemize} + + \noindent A fenálló érdemi $F$ függőségek halmazát a továbbiakban hozzávesszük az $R$ relációsémához.\\ + Jelölése: $(R; F)$.\\ + + \paragraph*{Jobboldalak szétvágása\\} + + $X \to A_1A_2...A_n$ akkor és csak akkor teljesül $R$ relációra, ha\\ + $X \to A_1$, $X \to A_2$,\ \ldots\ , $X \to A_n$ is teljesül $R$-en. \\ + Például: A$\to$BC ekvivalens A$\to$B és A$\to$C függőségek kettősével.\\ + + \noindent \emph{Fontos}: A függőségeknek csak a jobboldalát lehet szétbontani, a baloldalra ez természetesen nem igaz. + + \paragraph*{Kulcs, szuperkulcs\\} + + Egy $R(U)$ relációséma esetén $R \models X \to Y$ speciális esete, ha $Y = U$, ez a \emph{kulcsfüggőség}. $R(U)$ relációséma esetén az $K \subseteq U$ attribútumhalmaz akkor és csak akkor szuperkulcs, ha a $R \models K \to U$. \\ + + \noindent A kulcsot tehát a függőség fogalma alapján is lehet definiálni: olyan $K$ attribútumhalmazt nevezünk kulcsnak, amelytől az összes többi attribútum függ (vagyis szuperkulcs), de $K$-ból bármely attribútumot elhagyva ez már nem teljesül (vagyis minimális szuperkulcs). + + \noindent \emph{Megjegyzés}: A funkcionális függés nem kétirányú kapcsolat.\\ + Például: $\textit{Személyek} \models SzemelyiSzam \to Nev$, de $\textit{Személyek} \boldsymbol{\not} \models Nev \to SzemelyiSzam$\\ +% \emph{Jelölése}: $R \models X \to Y$, vagyis $R$ kielégíti $X \to Y$ függőséget. \\\\ + + \noindent A séma megadása csak a keretet jelenti, beleértve a függéseket is, ha ezt feltöltjük adatokkal, akkor kapunk egy a sémára illeszkedő relációt. Az $r$ reláció akkor illeszkedik az $(R; F)$ sémára ha az attribútumai az $R$-ben adottak és teljesülnek benne az $F$ függőségek. + + \paragraph*{Függőségek implikációja\\} + + F implikálja $X \to Y$-t, ha minden olyan relációban, amelyben F összes függősége teljesül, $X \to Y$ is teljesül. Jelölés: $F \models X \to Y$, ha F implikálja $X \to Y$–et. \\ + + \noindent Legyenek $X_1 \to A_1$, $X_1 \to A_2$,\ldots, $X_1 \to A_n$ adott funkcionális függőségek, szeretnénk tudni, hogy $Y \to B$ teljesül-e olyan relációkra, amire az előbbi funkcionális függőségek teljesülnek. \\ +\newpage + \noindent Példa: $A \to B$ és $B \to C$ teljesülése esetén $A \to C$ biztosan teljesül. \\ + + \noindent $Y \to B$ teljesülésének ellenőrzéséhez vegyünk két sort, amelyek megegyeznek az összes Y-beli attribútumon. Használjuk a megadott funkcionális függőségeket annak igazolására, hogy az előbbi két sor más attribútumokon is meg kell, hogy egyezzen. + Ha B egy ilyen attribútum, akkor $Y \to B$ teljesül. Egyébként az előbbi két sor olyan előfordulást ad majd, ami az összes előírt egyenlőséget teljesíti, viszont $Y \to B$ mégsem teljesül, azaz $Y \to B$ nem következménye a megadott funkcionális függőségeknek. \\ + + \noindent Implikációs probléma eldöntése definíció alapján (minden előfordulásra ellenőrizni) lehetetlen, de van egyszerűbb lehetőség: levezetési szabályok (ún. Armstrong-axiómák) segítségével előállítani.\\ + + \noindent \textbf{Armstrong-axiómák}: Legyen R(U) relációséma és $X,Y \subseteq U$, és jelölje XY az X és Y attribútumhalmazok egyesítését. F legyen funkcionális függőségek tetszőleges halmaza. + \begin{itemize} + \item[(A1)] (reflexivitás): $Y \subseteq X$ esetén $X \to Y$. + \item[(A2)] (bővíthetőség): $X \to Y$ és tetszőleges Z esetén $XZ \to YZ$. + \item[(A3)] (tranzitivitás): $X \to Y$ és $Y \to Z$ esetén $X \to Z$. + \end{itemize} + + \noindent \textit{Levezetés}: $X \to Y$ levezethető F-ből, ha van olyan $X_1 \to Y_1$, ..., $X_k \to Y_k$,..., $X \to Y$ véges levezetés, hogy $\forall k$-ra $X_k \to Y_k \in F$ vagy $X_k \to Y_k$ az FD1, FD2, FD3 axiómák alapján kapható a levezetésben előtte szereplő függőségekből. Jelölés: $F \vdash X \to Y$, ha $X \to Y$ levezethető F-ből. \\ + + \noindent További levezethető szabályok: + \begin{itemize} + \item Szétvághatósági szabály: $F \vdash X \to Y$ és $Z \subseteq Y$ esetén $F \vdash X \to Z$. + \item Összevonhatósági szabály: $F \vdash X \to Y$ és $F \vdash X \to Z$ esetén $F \vdash X \to YZ$. + \item Pszeudotranzitivitás: $F \vdash X \to Y$ és $F \vdash WY \to Z$ esetén $F \vdash XW \to Z$. + \end{itemize} + + \noindent Az Armstrong-axiómarendszer helyes és teljes, azaz minden levezethető függőség implikálódik is, illetve azok a függőségek, amelyeket F implikál azok le is vezethetők F-ből. $F \vdash X \to Y \iff F \models X \to Y$\\ + + \noindent Mivel az Armstrong axiómarendszer helyes és teljes, elegendő a levezetési szabályokkal levezetni. De még a levezetési szabályoknál is van egyszerűbb út: kiszámítjuk $Y$ lezártját: $Y+$-t.\\ + + \paragraph*{Attribútumhalmaz lezártja\\} + + \noindent Adott R séma és F funkcionális függőségek halmaza mellett, $X^+$ az összes olyan A attribútum halmaza, amire X $\to$ A következik F-ből. (R;F) séma esetén legyen $X \subseteq R$.\\ + + \noindent $X^{+(F)}:=\big\{A\ \big|\ F \vdash X \to A\big\}$ az X attribútumhalmaz \textbf{\emph{lezárása}} F-re nézve.\\ + + \noindent \textbf{Lemma.} $F \vdash X \to Y \iff Y \subseteq X^+$. \\ + + \noindent A lemma következménye: az implikációs probléma megoldásához elég az $X^+$-t hatékonyan kiszámolni. \\ + + \paragraph*{Lezárás algoritmus vázlata\\} + + \begin{itemize} + \item Kiindulás: $X^+ = X$. + \item Indukció: Olyan funkcionális függőségeket keresünk, melyeknek a baloldala már benne van $X^+$-ban. Ha $W \to A$ ilyen, A-t hozzáadjuk $X^+$-hoz. + \item Kimenet: Ha már nem bővül, ez a halmaz az $X^{+}$ + \end{itemize} + + \noindent A konkrét algoritmus: + \begin{itemize} + \item Kiindulás: $X^+ = X$. + \item Iteráció, amíg $X_{n}$ változik + \begin{itemize} + \item $X_{0} := X$ + \item $X_{n+1} := X_{n} \bigcup \big\{A\ \big|\ W \to Z \in F,\ A \in Z,\ W \subseteq X_{n}\big\}$ + \item Ha $X_{k+1} = X_{k}$, akkor Output: $X_{v} = X^{+}$ + \end{itemize} + \item Kimenet: $X^{+}$ + \end{itemize} + + \noindent Példa: + \begin{itemize} + \item $R=ABCDEFG,\quad {AB \to C,\ B \to G,\ CD \to EG,\ BG \to E}\\ + X=ABF,\ X^+=?$ + \begin{itemize} + \item $X(0):=ABF$ + \item $X(1):=ABF\ \bigcup\ \{\textbf{C,G}\}=ABCFG$ + \item $X(2):=ABCFG\ \bigcup\ \{\textbf{C,G,E}\}=ABCEFG$ + \item $X(3):=ABCEFG$ + \item $X^+= ABCEFG$ + \end{itemize} + \end{itemize} + + \paragraph*{Funkcionális függőségek vetítése\\} + + Motiváció: ,,normalizálás", melynek során egy reláció sémát több sémára bonthatunk szét.\\ + + \noindent Példa: $R=ABCD,\quad F=\{AB \to C,\ C \to D,\ D \to A\}$. + \begin{itemize} + \item Bontsuk fel ABC és AD-re. + \item Milyen funkcionális függőségek teljesülnek ABC–n? + \item ABC-n nem csak $AB \to C$, de $C \to A$ is! + \end{itemize} + + \noindent Vetület kiszámítása: Induljunk ki a megadott funkcionális függőségekből és keressük meg az összes nem triviális funkcionális függőséget, ami a megadott funkcionális függőségekből következik. (Nem triviális = a jobboldalt nem tartalmazza a bal). Csak azokkal az funkcionális függőségekkel foglalkozzunk, amelyekben a projektált séma attribútumai szerepelnek. \\ + + \noindent Függőségek vetülete: Adott (R;F), és $R_i \subseteq R $ esetén: + \[ + \Pi_{R_i}(F):=\big\{X \to Y | F \vdash X \to Y, XY \subseteq R_i\big\} + \] + + \subsection*{Felbontás (dekompozíció)} + + \noindent $d=\{R_1, \ldots, R_k\}$ az $(R, F)$ \emph{\textbf{dekompozíciója}}, ha nem marad ki attribútum, azaz + \begin{center} + $R_1\bigcup \ldots \bigcup R_k=R$ + \end{center} + + \noindent Az adattábla felbontását projekcióval végezzük.\\ + + \noindent Elvárások a felbontással szemben: + \begin{enumerate} + \item Veszteségmentes legyen a felbontás, vagyis vissza tudjuk állítani az eredeti relációt a dekompozícióval kapott relációk soraiból.\\ + Azaz ha teljesül a következő összefüggés az előbbi összekapcsolásra azt mondjuk, hogy\\ + \emph{\textbf{veszteségmentes}}. + \begin{center} + $r \supseteq \Pi_{R_1}(r) \bowtie ... \bowtie \Pi_{R_k}(r)$ (ahol $r$ egy $R$ sémájú relációt jelöl), + \end{center} + + \emph{Chase-teszt a veszteségmentességhez}: + \begin{enumerate} + \item Készítünk egy felbontást. + \item A felbontás eleminek összekapcsolásából veszünk egy sort. + \item Az algoritmussal bebizonyítjuk, hogy ez a sor az eredeti relációnak is sora. + \end{enumerate} + \item A vetületek legyenek jó tulajdonságúak, és a vetületi függőségi rendszere egyszerű legyen (normálformák: BCNF, 3NF, 4NF) + \item Függőségek megőrzése a vetületekben: A dekompozíciókban érvényes függőségekből következzen az eredeti sémára kirótt összes függőség. Adott (R;F) esetén $d=\{R_1, \ldots, R_k\}$ függőségőrző dekompozíció akkor és csak akkor, ha minden F-beli függőség levezethető a vetületi függőségekből: minden + \begin{center} + $X \to Y \in F$ esetén $\Pi_{R_1}(F) \cup ... \cup \Pi_{R_k}(F) \vdash X \to Y$. + \end{center} + \end{enumerate} + \begin{center} + Függőségőrzés $\nRightarrow$ Veszteségmentesség\\ + Veszteségmentesség $\nRightarrow$ Függőségőrzés + \end{center} + + \subsection*{Normálformák} + + \noindent A nem triviális függőségek redundanciát okozhatnak. A redundancia kiküszöbölésének egyik módja a normalizálás.\\ + + \noindent A normalizálás során egy kezdeti állapotból több fázison keresztül átalakítjuk az adatbázist. Az átalakítás fázisait normálformáknak nevezzük. Megkülönböztetjük a nulladik, az első, második, harmadik, negyedik, ötödik, és hatodik normálformát. A normálformák jelölésére az 0NF, 1NF, 2NF, 3NF $\ldots$ jelöléseket használjuk. Az adatbázis kialakítása mindig az alacsonyabbtól a magasabb normálformák felé halad. $\text{0NF} \rightarrow \text{1NF} \rightarrow \text{2NF} \rightarrow \text{3NF} \rightarrow \ldots$\\ + + \noindent Minden normálforma kialakításának megvannak a maga szabályai, kialakításának előfeltételei, és a kialakításhoz szükséges műveletei. Ha egy tábla kielégíti az előfeltételeket, akkor elvégezhetjük vele a szükséges művelteket. Eredményként olyan táblát kapunk, amely teljesíti a normálforma szabályait.\\ + + \noindent A relációs adatmodell szerint elkészült táblákat legalább harmadik normálformába kell alakítani. Ez általában elegendő ahhoz, hogy hibamentesen kezelhető adatbázisokat kapjunk.\\ + + \noindent \emph{Normalizálás}: + \begin{itemize} + \item Funkcionális függőségek $\to$ (1,2,)3NF, BCNF + \item Többértékű függőségek $\to$ 4NF + \end{itemize} + + \paragraph*{Első normál forma (1NF)\\} + + \noindent Azt mondja ki, hogy az attribútumok tartománya kizárólag atomi (egyszerű, oszthatatlan) értékeket tartalmazhat, és hogy a rekordokban bármely attribútum értéke csak egyetlen érték lehet az adott attribútum tartományából. Az 1NF ezáltal megtiltja, hogy egy rekordon belül az attribútumok értéke egy értékhalmaz, egy érték n-es vagy ezek kombinációja legyen.\\ + + \noindent Más szóval, az 1NF nem engedi meg a relációkon belüli relációkat, illetve a relációkat mint attribútumértékeket a rekordokon belül. Az 1NF szerint tehát egy attribútum értéke kizárólag egyetlen atomi (vagy oszthatatlan) érték lehet.\\ + + \noindent Azok relációk, amelyek nem elégítik ki az előző feltételt, nulladik normálformában vannak (0NF).\\ + + {\small + \noindent Példa: + \begin{center} + $\begin{array}{|c|c|c|} + \hline + \multicolumn{3}{|c|}{\textbf{Szakkörök}} \\ \hline + \textbf{Szakkör} & \textbf{Tanár} & \textbf{Diákok} \\ \hline + \text{Számítástechnika} & \text{Kiss Elemér} & + \begin{array}{|c|c|} + \hline + \text{Név} & \text{Osztály} \\ \hline + \text{Tóth Pál} & \text{III. b} \\ \hline + \text{Csizmazia Károly} & \text{II. a} \\ \hline + \end{array} \\ \hline + \text{Grafika} & \text{Tóth Árpád} & + \begin{array}{|c|c|} + \hline + \text{Név} & \text{Osztály} \\ \hline + \text{Kiss Veronika} & \text{I. c} \\ \hline + \text{Latabár Kálmán} & \text{II. b} \\ \hline + \end{array} \\ \hline + \end{array}$ + \begin{center} + $\Downarrow^{(0NF)}_{(1NF)}$ + \end{center} + $\begin{array}{|c|c|c|c|} + \hline + \multicolumn{4}{|c|}{\textbf{Szakkörök}} \\ \hline + \textbf{Szakkör} & \textbf{Tanár} & \textbf{Diák} & \textbf{Osztály} \\ \hline + \text{Számítástechnika} & \text{Kiss Elemér} & \text{Tóth Pál} & \text{III. b} \\ \hline + \text{Számítástechnika} & \text{Kiss Elemér} & \text{Csizmazia Károly} & \text{II. a} \\ \hline + \text{Grafika} & \text{Tóth Árpád} & \text{Kiss Veronika} & \text{I. c} \\ \hline + \text{Grafika} & \text{Tóth Árpád} & \text{Latabár Kálmán} & \text{II. b} \\ \hline + \end{array}$ + \end{center} + } + + \paragraph*{Második normál forma (2NF)\\} + + \noindent Az $R$ relációséma 2NF-ben van, ha $R$ minden $A$ másodlagos attribútuma teljesen funkcionálisan függ $R$ elsődleges kulcsától.\\ + + \noindent A 2NF előfeltétele, hogy adatbázisunk minden táblája legalább 1NF-ben legyen! 2NF-ben vagyunk akkor, ha 1NF-ben vagyunk, és a táblákban megszűntetjük az esetleges részleges funkcionális függéseket.\\ + + \noindent A 2NF kialakításakor azt a táblát, amiben részleges funkcionális függés van, két új táblára bontjuk. Az egyik táblába az összetett kulcs egyik eleme kerül, a tőle függő összes mezővel együtt. A másik táblába a kulcs másik eleme kerül a tőle függő összes mezővel együtt. A két kapott táblában már nem lesz összetett kulcs, tehát nem lesz részleges funkcionális függés sem. Az új táblák azonosítói az eredeti összetett kulcs elemei lesznek.\\ + + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|g|c|} + \hline + \multicolumn{7}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} & \text{Telefonszam} & \text{Mobil} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} & (36) 30/555-4143 & Igen \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} & (36) 1/555-7891 & Nem \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} & (36) 42/555-1235 & Nem \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 70/555-2935 & Igen \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} & (36) 1/555-7891 & Nem \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} & (36) 30/555-7777 & Igen \\ \hline + \end{array}$\\ + $\Downarrow^{2NF}\ (\text{szétválasztás})$ + \noindent $\begin{array}{|g|c|c|c|c|} + \hline + \multicolumn{5}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} \\ \hline + \end{array}\ + \begin{array}{|g|c|} + \hline + \multicolumn{2}{|c|}{\textbf{Telefonok}} \\ \hline + \text{Telefonszam} & \text{Mobil} \\ \hline + (36) 30/555-4143 & Igen \\ \hline + (36) 1/555-7891 & Nem \\ \hline + (36) 42/555-1235 & Nem \\ \hline + (36) 70/555-2935 & Igen \\ \hline + (36) 30/555-7777 & Igen \\ \hline + \end{array}$ + \end{center} + + \noindent Az eredeti tábla "kettévágása" valójában azt eredményezte, hogy különválasztottunk két egyedtípust (Személyek-Telefonok) amelyek eddig egy táblában voltak. A művelet hatására csökken a redundancia. Ez mindenképpen hasznos, de észre kell vennünk egy súlyos problémát. A két új tábla között még nincs kapcsolat. Nem tudjuk, melyik személy melyik számon hívható, illetve, hogy egy bizonyos készüléken kik érhetők el.\\ + + \noindent Tudjuk, hogy a relációs adatmodellben idegen kulcsokkal ábrázoljuk a kapcsolatokat. Ha a \emph{Személyek} táblában helyezzük el az \emph{Telefonok} táblából származó idegen kulcsot, jelezve, hogy melyik személyt melyik számon lehet elérni, akkor az idegen kulcs többértékű lesz, hiszen egy személynek több telefonja lehet.\\ + + \noindent Ha a telefonok táblában helyezzük el az idegen kulcsot, megmutatva, hogy kik hívhatók az adott készüléken, a mező ismét többértékű lesz, mert egy számon több személy is elérhető.\\ + + \noindent A probléma megoldhatatlannak látszik. Ha jól megvizsgáljuk a táblákat, észrevehetjük, hogy közöttük N:M kapcsolat van, hiszen egy embernek több telefonja is lehet, de lehet olyan telefon, amin keresztül több személy is elérhető (pl. munkahelyi telefon: (36) 1/555-7891.\\ + + \noindent A kapcsolattípusokról tanulva említettük, hogy a relációs adatmodellben két tábla között közvetlenül nem lehet több-több (N:M) kapcsolat. Ennek éppen az az oka, hogy ilyenkor bárhová is tennénk az idegen kulcsot, az többértékű mező lenne. A probléma úgy oldható meg, hogy a keletkezett két tábla között még egy harmadik, úgynevezett kapcsolótáblát is létrehozunk, amiben mindkét tábla azonosítóját elhelyezzük idegen kulcsként. Így a két tábla nem közvetlenül, hanem egy kapcsolótáblán keresztül kapcsolódik egymáshoz.\\ + + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|} + \hline + \multicolumn{5}{|c|}{\textbf{Személyek}} \\ \hline + \textit{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} \\ \hline + \text{102564 BL} & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} \\ \hline + \text{234576 ZM} & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} \\ \hline + \text{783402 EA} & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} \\ \hline + \text{982601 PM} & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} \\ \hline + \text{315672 ZA} & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} \\ \hline + \end{array}\ + \begin{array}{|g|c|} + \hline + \multicolumn{2}{|c|}{\textbf{Telefonok}} \\ \hline + \text{Telefonszam} & \text{Mobil} \\ \hline + (36) 30/555-4143 & Igen \\ \hline + (36) 1/555-7891 & Nem \\ \hline + (36) 42/555-1235 & Nem \\ \hline + (36) 70/555-2935 & Igen \\ \hline + (36) 30/555-7777 & Igen \\ \hline + \end{array}$\\ + $\Downarrow^{2NF}$\\ + $\begin{array}{|g|c|} + \hline + \multicolumn{2}{|c|}{\textbf{SzemelyekTelefonok}} \\ \hline + \text{SzemIgSzam} & \text{Telefonszam} \\ \hline + \text{102564 BL} & (36) 51/555-4143 \\ \hline + \text{234576 ZM} & (36) 1/555-7891 \\ \hline + \text{783402 EA} & (36) 42/555-1235 \\ \hline + \text{982601 PM} & (36) 70/555-2935 \\ \hline + \text{982601 PM} & (36) 1/555-7891 \\ \hline + \text{315672 ZA} & (36) 30/555-7777 \\ \hline + \end{array}$ + \end{center} + + \noindent A relációs adatmodellben ,,A" és ,,B" egymással több-több kapcsolatban lévő egyedtípusok táblái nincsenek közvetlen kapcsolatban. A kapcsolat egy harmadik ("A\_B") tábla, a kapcsolótábla közvetítésével valósul meg. A kapcsolótáblában lévő mezők egyike, ,,A\_Azon" az ,,A" tábla rekordjait, még a másik mező, ,,B\_Azon" a ,,B" tábla rekordjait azonosítja.\\ + + \noindent A kapcsolótábla rekordjai elárulják, hogy az ,,A" tábla rekordjai mely rekordokhoz kapcsolódnak a ,,B" táblában és fordítva.\\ + + \noindent Megfigyelhetjük, hogy az ,,A" tábla 1:N kapcsolattal kapcsolódik az "A\_B" kapcsolótáblához, és a ,,B" tábla is 1:N kapcsolattal kapcsolódik a kapcsolótáblához. A kapcsolótábla két 1:N kapcsolattá alakítja az N:M kapcsolatot.\\ +\newpage + \paragraph*{Harmadik normál forma (3NF)} + + \noindent A 3NF előfeltétele, hogy adatbázisunk minden táblája legalább 2NF-ben legyen! 3NF-ben vagyunk akkor, ha 2NF-ben vagyunk, és a táblákban megszűntetjük a tranzitív függéseket.\\ + + \noindent Minden tranzitív függést tartalmazó táblából két táblát csinálunk. Új táblába kerülnek a tranzitív függésben lévő mezők, azzal a tranzitív kulcs mezővel együtt, amelytől a kulcson kívül függnek. Az új táblában a tranzitív kulcs mező lesz az azonosító.\\ + + \noindent A 2NF kialakításakor létrejött \emph{Személyek} tábla \emph{Varos} mezője tranzitív függésben van. A \emph{SzemIgSzam} kulcson kívül az \emph{Irsz} mezőtől is függ. A tranzitív függést úgy szüntetjük meg, hogy az \emph{Irsz} mezőt (tranzitív kulcs), és a \emph{Varos} mezőt is új táblába, a \emph{Varosok} táblába tesszük. + + \begin{center} + \noindent $\begin{array}{|g|c|b|e|c|} + \hline + \multicolumn{5}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Irsz} & \text{Város} & \text{Utca} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & 1082 & \textit{Budapest} & \textit{Futó utca 11.} \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & 1083 & \textit{Budapest} & \textit{Bokay János 22.} \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & 5000 & \textit{Szolnok} & \textit{Háló utca 2.} \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & 3022 & \textit{Lőrinci} & \textit{Jegenyesor utca 2.} \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & 3300 & \textit{Eger} & \textit{Stadion utca 7.} \\ \hline + \end{array}$\\ + $\Downarrow^{3NF}$\\ + \noindent $\begin{array}{|c|c|c|c|} + \hline + \multicolumn{4}{|c|}{\textbf{Személyek}} \\ \hline + \text{SzemIgSzam} & \text{Név} & \text{Utca} & \text{Irsz} \\ \hline + \textit{102564} BL & \textit{Tóth Árpád} & \textit{Futó utca 11.} & 1082 \\ \hline + \textit{234576} ZM & \textit{Szél Tamás} & \textit{Bokay János 22.} & 1083 \\ \hline + \textit{783402} EA & \textit{Egyed Bence} & \textit{Háló utca 2.} & 5000 \\ \hline + \textit{982601} PM & \textit{Kis Veronika} & \textit{Jegenyesor utca 2.} & 3022 \\ \hline + \textit{315672} ZA & \textit{Nagy Bence} & \textit{Stadion utca 7.} & 3300 \\ \hline + \end{array}\ + \noindent \begin{array}{|c|c|} + \hline + \multicolumn{2}{|c|}{\textbf{Városok}} \\ \hline + \text{Irsz} & \text{Város} \\ \hline + 1082 & \textit{Budapest} \\ \hline + 5000 & \textit{Szolnok} \\ \hline + 3022 & \textit{Lőrinci} \\ \hline + 3300 & \textit{Eger} \\ \hline + \end{array}$\\ + \end{center} + + \noindent A 3NF kialakítása közben ismét új táblákat hoztunk létre, amelyek között idegen kulccsal kell biztosítanunk a kapcsolatot. Megfigyelhetjük, hogy a keletkezett \emph{Városok} és \emph{Személyek} táblák között egy-több, (1:N) kapcsolat van, hiszen egy városban több személy állandó lakhelye van, egy ember állandó lakhelye azonban csak egy városban lehet. Ebben a kapcsolatban a \emph{Városok} tábla oldalát 1, a \emph{Személyek} tábla oldalát több oldalnak nevezzük.\\ + + \noindent Ha az idegen kulcsot az 1 oldalra, a \emph{Városok} táblába tennénk (jelezve, hogy kik laknak az adott városban), akkor az, többértékű mező lenne, hiszen egy városban többen is laknak. Ha azonban a több oldalra, a \emph{Személyek} táblába tennénk az idegen kulcsot (megmutatva, hogy hol van az adott személy állandó lakhelye), akkor az nem lenne többértékű. Ebből a tapasztalatból kiindulva a következő szabályt alkothatjuk: 1:N kapcsolat esetén az idegen kulcsot mindig a több oldalon lévő táblában helyezzük el. + + \begin{itemize} + \item 1:N kapcsolat esetén tehát a több oldalon, + \item N:M kapcsolat esetén pedig kapcsolótáblában helyezzük el az idegen kulcsot. + \item 1:1 kapcsolat van, akkor az idegen kulcs bármelyik táblába kerülhet. + \end{itemize} + + \noindent Az új tábla létrehozásának köszönhetően ismét csökkent a redundancia. Azoknak a városoknak a neveit, amelyekben több személy is lakik, most már csak egyszer kell tárolni. +\newpage + \paragraph*{Boyce-Codd normálforma} + + \noindent A normálformák tárgyalása során eddig olyan relációkra mutattunk példákat, melyeknek csak egy reláció kulcsa van. A normálformák definíciója alkalmazható a több kulccsal rendelkező relációkra is.\\ + + \noindent Ebben az esetben minden attribútum, mely valamely kulcsnak a része, elsődleges attribútum, de ez az attribútum függhet egy másik, ezt nem tartalmazó kulcs részétől. Ha ez a helyzet fennáll, redundanciát tartalmaz a reláció. Ennek a felismerése vezetett a harmadik normálforma egy szigorúbb definíciójához, a Boyce/Codd normálformához. + + \begin{itemize} + \item A reláció harmadik normál formában van + \item Minden elsődleges attribútum teljes funkcionális függőségben van azokkal a kulcsokkal, melyeknek nem része + \end{itemize} + + \noindent A Boyce–Codd-féle normálforma látszólag a 3NF egy egyszerűbb alakja, de valójában erősebb, mint a 3NF. Azaz minden BCNF-ben lévő reláció egyúttal 3NF-ben is van, ám egy 3NF-ben lévő reláció nem szükségképpen van BCNF-ben.\\ + + \noindent Az $R$ reláció BCNF-ben van akkor és csak akkor, ha minden olyan esetben, ha az $R$-ben érvényes egy $X \rightarrow Y$ nem triviális függőség, akkor az $X$ attribútumhalmaz szuperkulcsa $R$-nek. Azaz minden nem triviális funkcionális függőség bal oldalának szuperkulcsnak kell lennie. (A szuperkulcsnak nem kell minimálisnak lennie.)\\ + + \noindent Bizonyos FF halmazok esetén a felbontáskor elveszíthetünk függőségeket. \textit{3. normálformában} (3NF) úgy módosul a BCNF feltétel, hogy az előbbi esetben nem kell dekomponálnunk. Egy attribútum elsődleges attribútum (prím), ha legalább egy kulcsnak eleme. X $\to$ A megsérti 3NF-t akkor és csak akkor, ha X nem szuperkulcs és A nem prím. + + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|} + \hline + \multicolumn{5}{|c|}{\textbf{Tantárgyak}} \\ \hline + \textbf{Tanár} & \textbf{Időpont} & \textbf{Tantárgy} & \textbf{Félév} & \textbf{Diák\_szám} \\ \hline + \text{Kiss Pál} & \text{93/1} & \text{Adatbázis} & \text{1} & \text{17} \\ \hline + \text{Jó Péter} & \text{93/1} & \text{Unix} & \text{1} & \text{21} \\ \hline + \text{Kiss Pál} & \text{93/2} & \text{Adatbázis} & \text{2} & \text{32} \\ \hline + \text{Jó Péter} & \text{93/1} & \text{Unix} & \text{2} & \text{19} \\ \hline + \text{Kiss Pál} & \text{93/1} & \text{Adatbázis} & \text{3} & \text{25} \\ \hline + \end{array}$\\ + $\Downarrow^{BCNF}$\\ + $\begin{array}{|c|c|c|c|} + \hline + \multicolumn{4}{|c|}{\textbf{Tantárgyak}} \\ \hline + \textbf{Időpont} & \textbf{Tantárgy} & \textbf{Félév} & \textbf{Diák\_szám} \\ \hline + \text{93/1} & \text{Adatbázis} & \text{1} & \text{17} \\ \hline + \text{93/1} & \text{Unix} & \text{1} & \text{21} \\ \hline + \text{93/2} & \text{Adatbázis} & \text{2} & \text{32} \\ \hline + \text{93/1} & \text{Unix} & \text{2} & \text{19} \\ \hline + \text{93/1} & \text{Adatbázis} & \text{3} & \text{25} \\ \hline + \end{array}\ + \begin{array}{|g|c|c|} + \hline + \multicolumn{3}{|c|}{\textbf{Tanárok}} \\ \hline + \textbf{Tanár} & \textbf{Időpont} & \textbf{Tantárgy} \\ \hline + \text{Kiss Pál} & \text{93/1} & \text{Adatbázis} \\ \hline + \text{Jó Péter} & \text{93/1} & \text{Unix} \\ \hline + \text{Kiss Pál} & \text{93/2} & \text{Adatbázis} \\ \hline + \end{array}$\\ + \end{center} + + \noindent Tételezzük fel, hogy minden tanár csak egy tantárgyat, de annak különböző féléveit oktatja. Ezek alapján a következő funkcionális függőségek írhatók fel: + \begin{itemize} + \item Tanár, Félév $\to$ Tantárgy + \item Tantárgy, Félév $\to$ Tanár + \end{itemize} + + \noindent A relációnak két kulcsa van, a (Tanár, Időpont, Félév) és a (Tantárgy, Időpont, Félév). A relációban csak egy nem elsődleges attribútum található, a Diák\_szám. Ez teljes funkcionális függőségben van mindkét reláció kulccsal, az elsődleges attribútumok között nincs függőségi viszony. Ezek alapján a reláció harmadik normál formában van. Azonban tartalmaz redundanciát, mivel ugyanazon tanár mellett többször is tároljuk a tantárgyat azonos időpontokban. A redundanciának az az oka, hogy a tanár attribútum az őt nem tartalmazó reláció kulcs (Tantárgy, Időpont, Félév) csak egy részétől (Tantárgy, Félév) függ. + + \subsection*{Többértékű függőségek és 4NF} + + \noindent \textit{A többértékű függőség} (TÉF): az R reláció fölött $X \to\to Y$ teljesül: ha bármely két sorra, amelyek megegyeznek az X minden attribútumán, az Y attribútumaihoz tartozó értékek felcserélhetők, azaz a keletkező két új sor R-beli lesz.\\ + + \noindent Példa: Ha a \emph{SörIvók} relációban a \emph{KedveltSörök} között a következő sorok szerepelnek, + + \begin{center} + \noindent $\begin{array}{|g|c|c|c|} + \hline + \multicolumn{4}{|c|}{\textbf{Sörívók}} \\ \hline + \text{\textbf{Név}} & \text{\textbf{Irányítószám}} & \text{\textbf{Telefonszám}} & \text{\textbf{KedveltSörök}} \\ \hline \hline + \vdots & \vdots & \vdots & \vdots \\ \hline + \text{Kis Veronika} & 3022 & \text{70/555-2935} & \text{Kuchlbauer} \\ \hline + \text{Kis Veronika} & 3022 & \text{1/555-7891} & \text{Stella} \\ \hline + \vdots & \vdots & \vdots & \vdots \\ \hline + \end{array}$ + \end{center} + akkor a következő előfordulásoknak is szerepelnie kell, mivel a sörivók telefonszámai függetlenek az általuk kedvelt söröktől. + \begin{center} + \noindent $\begin{array}{|g|c|c|c|} + \hline + \multicolumn{4}{|c|}{\textbf{Sörívók}} \\ \hline + \text{\textbf{Név}} & \text{\textbf{Irányítószám}} & \text{\textbf{Telefonszám}} & \text{\textbf{KedveltSörök}} \\ \hline \hline + \text{Kis Veronika} & 3022 & \text{70/555-2935} & \text{Kuchlbauer} \\ \hline + \text{Kis Veronika} & 3022 & \text{1/555-7891} & \text{Stella} \\ \hline + \vdots & \vdots & \vdots & \vdots \\ \hline + \text{\textbf{Kis Veronika}} & \textbf{3022} & \text{\textbf{70/555-2935}} & \text{\textbf{Stella}} \\ \hline + \text{\textbf{Kis Veronika}} & \textbf{3022} & \text{\textbf{1/555-7891}} & \text{\textbf{Kuchlbauer}} \\ \hline + \vdots & \vdots & \vdots & \vdots \\ \hline + \end{array}$\\ + \end{center} + + \noindent Így egy-egy sörivó minden telefonszáma minden általa kedvelt sörrel kombinációban áll.\\ + + \noindent Egy $R$ relációs sémában teljesül az $X \to\to Y$ többértékű függőség, ha minden $R$ sémához tartozó $r$ relációra igaz, hogy tetszőleges $t_1, t_2 \in r$ sorokra, melyekre $t_1[X]=t_2[X]$ léteznek $t_3, t_4 \in r$ + \begin{itemize} + \item $t_3[XY]=t_1[XY]$, + \item $t_3[R \big\backslash XY]=t_2[R \big\backslash XY]$, + \item $t_4[XY]=t_2[XY]$, + \item $t_4[R \big\backslash XY]=t_1[R \big\backslash XY]$. + \end{itemize} + + \noindent Állítás: Elég az $t_3, t_4$ közül csak az egyik létezését megkövetelni.\\ + + \noindent Axiómák többértékű függőségekre: + \begin{itemize} + \item[(A4)] (komplementer) : Ha $X \to\to Y$ és $Z = R \big\backslash XY $, akkor $X \to\to Z$. + \item[(A5)] (tranzitivítás) : Ha $X \to\to Y$ és $Y \to\to S$, akkor $X \to\to S \big\backslash Y$. + \item[(A6)] (bövíthetőség): $X \to\to Y$ és tetszőleges $V \subseteq W$ esetén $XW \to\to YV$ + \end{itemize} + + \noindent \textbf{Tétel.} $A4, A5, A6$ helyes és teljes a többértékű függőségekre.\\ +\newpage + \noindent Axiómák vegyes függőségekre: + \begin{itemize} + \item [(A7)] (funkcionálisból többértékű) $X \to Y$ esetén $X \to\to Y$. + \begin{itemize} + \item Ha $X \to Y$ és két sor megegyezik X-en, Y-on is megegyezik, emiatt ha ezeket felcseréljük, az eredeti sorokat kapjuk vissza, azaz: $X \to\to Y$. + \end{itemize} + \item[(A8)] (többértékűből és funkcionálisból funkcionális): $X \to\to Y$ és $W \to S$, ahol $S \subseteq Y$, $W \cap Y = \emptyset$ esetén $X \to S$. + \end{itemize} + + \noindent \textbf{Tétel.} $A1, A2, A3, A4, A5, A6, A7, A8$ helyes és teljes a vegyes függőségekre.\\ + + \noindent \textbf{Állítás.} $X \to\to Y$-ből nem következik, hogy $X \to\to A$, ha $A \in Y$. (A jobb oldalak nem szedhetők szét!)\\ + + \noindent \textbf{Állítás.} $X \to\to Y$ és $Y \to\to V$ nem következik, hogy $X \to\to V$, ha $A \in Y$.\\ + (A szokásos tranzitivitás nem igaz általában!)\\ + + \noindent A veszteségmentesség, függőségőrzés definíciójában most $F$ funkcionális függőségi halmaz helyett $\textbf{D}$ függőségi halmaz többértékű függőségeket is tartalmazhat. \\ + + \noindent $d=\{R_1, \ldots, R_k\}$ az $(R; \textbf{D})$ \emph{\textbf{dekompozíciója}}, akkor és csak akkor, ha minden D-t kielégítő $r$ reláció esetén + \begin{center} + $r = \Pi_{R_1}(r) \bowtie \ldots \bowtie \Pi_{R_k}(r)$ + \end{center} + + \noindent A következő tétel miatt a veszteségmentesség az implikációs problémára vezethető vissza, így hatékonyan eldönthető.\\ + + \noindent \textbf{Tétel.} A $d=(R_1,R_2)$ akkor és csak akkor veszteségmentes dekompozíciója R-nek, ha + \[ + D \vdash R_1 \cap R_2 \to\to R_1 \big\backslash R_2 + \] + + \noindent Megjegyzés: + + \begin{itemize} + \item $Y \subseteq X$ vagy $XY = R$ esetén $X \to\to Y$ triviális többértékű függőség. + \item $X$ szuperkulcsa $R$-nek $D$-re nézve, ha $D \vdash X \to R$. + \end{itemize} + + \paragraph*{Negyedik normálforma\\} + + \noindent A Boyce/Codd normál forma is tartalmazhat redundanciát. Mindeddig csak a funkcionális függőségeket vizsgáltuk, a többértékű függőségeket nem. A további két normál forma a többértékű függőségekből adódó redundancia kiszűrését szolgálja. Egy reláció negyedik normál formában van.\\ + + \noindent A \textit{4. normálforma} hasonlít a BCNF-re, azaz minden nem triviális többértékű függőség bal oldala szuperkulcs, de a többértékű függőségek okozta redundanciát a BCNF nem szünteti meg.\\ + + \noindent A megoldás: A negyedik normálforma. A negyedik normálformában (4NF), amikor dekomponálunk, a többértékű függőségeket úgy kezeljük, mint az funkcionális függőségeket, a kulcsok megtalálásánál azonban nem számítanak.\\ + + \noindent Egy R reláció 4NF -ben van, ha: minden $X \to\to Y$ nemtriviális többértékű függőség esetén X szuperkulcs.\\ + + \noindent R 4NF-ben van D-re nézve, ha $XY \neq R$, $Y \not\subset X$, és + \[ + D \vdash X \to\to Y\ \text{esetén}\ D \vdash X \to R + \] + + \noindent $d=\{R_1, \ldots, R_k\}$ dekompozíció 4NF-ben van D-re nézve, ha minden $R_i$ 4NF-ben van $\Pi_{R_i}(D)$-re nézve.\\ + + \noindent \textbf{Állítás.} Ha R 4NF-ben van, akkor BCNF-ben is van. + + \noindent \emph{Következmény}: Nincs mindig függőségőrző és veszteségmentes 4NF dekompozíció.\\ + + \noindent Veszteségmentes 4NF dekompozíciót mindig tudunk készíteni a naiv BCNF dekomponáló algoritmushoz hasonlóan. \\ + + \noindent Naiv algoritmus veszteségmentes 4NF dekompozíció előállítására: + \begin{itemize} + \item[(1)] Ha R 4NF-ben van, akkor megállunk + \item Egyébként van olyan nem triviális $X \to\to Y$, amely R-ben teljesül, de megsérti a 4NF-et, azaz X nem szuperkulcs. + \item[(2)] Ekkor R helyett vegyük az $(XY, R \setminus Y)$ dekompozíciót és (1). + \end{itemize} + + \noindent Minden $X \to Y$ funkcionális függőség $X \to\to Y$ többértékű függőség is, így ha az R 4NF-ben van, akkor BCNF-ben is. + + \noindent Képzeljük el azt, hogy egy relációban tároljuk a személyek, és barátaik nevét valamint hobbiját. Minden személynek több barátja és több hobbija is lehet.\\ + + \begin{center} + \noindent + $\begin{array}{|g|c|c|} + \hline + \multicolumn{3}{|c|}{\textbf{BaratokHobbik}} \\ \hline + \text{\textbf{Személy}} & \text{\textbf{Barát}} & \text{\textbf{Hobbi}} \\ \hline \hline + \text{Nagy József} & \text{Elek Attila} & \text{foci} \\ \hline + \text{Nagy József} & \text{Varga Attila} & \text{foci} \\ \hline + \text{Kiss Péter} & \text{Kiss Pál} & \text{sakk} \\ \hline + \text{Kiss Péter} & \text{Kiss Pál} & \text{video} \\ \hline + \end{array}$\\ + \end{center} + + \begin{center} + \noindent $\begin{array}{|g|c|c|c|c|} + \hline + \multicolumn{2}{|c|}{\textbf{Baratok}} \\ \hline + \text{Személy} & \text{Barát} \\ \hline + \text{Nagy József} & \text{Elek Attila} \\ \hline + \text{Nagy József} & \text{Varga Attila} \\ \hline + \text{Kiss Péter} & \text{Kiss Pál} \\ \hline + \end{array}\ + \begin{array}{|g|c|} + \hline + \multicolumn{2}{|c|}{\textbf{Hobbik}} \\ \hline + \text{Személy} & \textbf{Hobbi} \\ \hline + \text{Nagy József} & \text{foci} \\ \hline + \text{Kiss Péter} & \text{sakk} \\ \hline + \text{Kiss Péter} & \text{video} \\ \hline + \end{array}$\\ + \end{center} + +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/adatbaziskezelo_reszei.jpg b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/adatbaziskezelo_reszei.jpg new file mode 100644 index 0000000..830ef1e Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/adatbaziskezelo_reszei.jpg differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/db_felepites.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/db_felepites.png new file mode 100644 index 0000000..42e3146 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/db_felepites.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/deadlock.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/deadlock.png new file mode 100644 index 0000000..962c1e2 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/deadlock.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/diagram.drawio b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/diagram.drawio new file mode 100644 index 0000000..2a9ef19 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/diagram.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/kompmatrix.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/kompmatrix.png new file mode 100644 index 0000000..42dfc83 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/kompmatrix.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/querycompiling.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/querycompiling.png new file mode 100644 index 0000000..cd824a4 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/querycompiling.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/queryprocessing.png b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/queryprocessing.png new file mode 100644 index 0000000..0d87115 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/img/queryprocessing.png differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.pdf new file mode 100644 index 0000000..3d5768f Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.tex b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.tex new file mode 100644 index 0000000..07ddd58 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/19.Adatbázisok optimalizálása és konkurencia kezelése/tetel19.tex @@ -0,0 +1,991 @@ +\documentclass[12pt,margin=0px]{article} + +\usepackage{subcaption} +\usepackage{multirow} +\usepackage{listings} +\usepackage{hhline} +\usepackage{graphicx} +\usepackage{float} +\usepackage{fancyhdr} +\usepackage{amsthm} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{makecell} +\usepackage[utf8]{inputenc} +\usepackage[thinlines]{easytable} +\usepackage[table,xcdraw]{xcolor} +\usepackage[normalem]{ulem} +\usepackage[a4paper, margin=1in]{geometry} +\usepackage{enumitem} +\usepackage{xcolor} +\usepackage[magyar]{babel} + +\newcommand\ddfrac[2]{\frac{\displaystyle #1}{\displaystyle #2}} +\definecolor{mygray}{rgb}{0.15, 0.15, 0.15} +\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}} + +\setlist[itemize,1]{label=$\bullet$} +\setlist[itemize,2]{label=$\circ$} +\setlist[itemize,3]{label=$\centerdot$} +\setlist[itemize,4]{label=$\cdot$} + +\pagestyle{fancy} + +\newcommand\blfootnote[1]{% + \begingroup + \renewcommand\thefootnote{}\footnote{#1}% + \addtocounter{footnote}{-1}% + \endgroup +} + +\renewcommand{\figurename}{ábra} +\newenvironment{tetel}[1]{\paragraph{#1 \\}}{} + +\newcommand{\N}{\mathbb{N}} +\newcommand{\Z}{\mathbb{Z}} +\newcommand{\R}{\mathbb{R}} +\newcommand{\Q}{\mathbb{Q}} +\newcommand{\C}{\mathbb{C}} + +\makeatletter +\renewcommand\paragraph{% + \@startsection{paragraph}{4}{0mm}% + {-\baselineskip}% + {.5\baselineskip}% + {\normalfont\normalsize\bfseries}} +\makeatother + +% A dokument itt kezdődik +\newcommand\lword[1]{\leavevmode\nobreak\hskip0pt plus\linewidth\penalty50\hskip0pt plus-\linewidth\nobreak #1} +\useunder{\uline}{\ul}{} +\fancyhead{} +\cfoot{19. tétel | \thepage. oldal} + +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.4pt} + +\begin{document} + \thispagestyle{fancy} + \hyphenation{oddword} + \uchyph=0 + + \begin{center} + {\Large\bfseries\noindent 19. Adatbázisok optimalizálása és konkurencia kezelése} \\ + \end{center} + + \section*{Az adatbázis-kezelő rendszerek feladata, részei} + + Adatbázis-kezelő rendszer alatt olyan számítógépprogramot értünk, mely megvalósítja nagy tömegű adat biztonságos tárolását, gyors lekérdezhetőségét és módosíthatóságát, tipikusan egyszerre több felhasználó számára.\\ + + \noindent Az adatbázis-kezelési tevékenységeket két csoportra szokás osztani: + \begin{itemize} + \item Adatdefiníciós műveletek. + \begin{itemize} + \item A definíciós eszközökkel rendelkező nyelveket összefoglalóan\\ \emph{Data Definition Language (DDL)} nevezzük. + \end{itemize} + \item Adatmanipulációs műveletek. + \begin{itemize} + \item Az adatok manipulációjára szolgáló nyelveket összefoglalóan\\ \emph{Data Manipulation Language-nek (DML)} nevezzük. + \end{itemize} + \end{itemize} + + \begin{figure}[H] + \centering + \includegraphics[width=1.0\linewidth]{img/db_felepites} + \caption{Adatbázis-kezelő rendszer részei.} + \label{fig:db_felepites} + \end{figure} + + \subsection*{Az egyes alkotórészek rövid jellemzése} + + \begin{itemize} + \item \textbf{Lekérdezésfordító}: A lekérdezésfordító elemzi és optimalizálja a lekérdezést, ami alapján elkészíti a lekérdezés-végrehajtási tervet (lekérdezéstervet). + \item \textbf{Végrehajtómotor}: A végrehajtómotor a lekérdezésfordítótól megkapja a lekérdezéstervet, majd kisebb adatdarabokra (tipikusan rekordokra, egy reláció soraira) vonatkozó kérések sorozatát adja át az erőforrás-kezelőnek. + \item \textbf{Erőforrás-kezelő}: Az erőforrás-kezelő ismeri a relációkat tartalmazó adatfájlokat, a fájlok rekordjainak formátumát, méretét, valamint az indexfájlokat. Az adatkéréseket az erőforrás-kezelő lefordítja lapokra, amit átad a pufferkezelőnek. + \item \textbf{Pufferkezelő}: Feladata, hogy a másodlagos adattárolóról (lemez, stb.) az adatok megfelelő részét olvassa be a központi memória puffereibe. A pufferkezelő információkat cserél a tárkezelővel, hogy megkapja az adatokat a lemezről. + \item \textbf{Tárkezelő}: Adatokat ír-olvas a másodlagos adattárolóról. Előfordulhat, hogy igénybe veszi az operációs rendszer parancsait is, de sokszor közvetlenül a lemezkezelőhöz intézi a parancsait. + \item \textbf{Tranzakciókezelő}: A lekérdezéseket és más tevékenységeket tranzakciókba szervezzük. A tranzakciók olyan egységek, amelyeket atomosan és elkülöníthetően kell végrehajtani, valamint a végrehajtásnak tartósnak kell lennie, illetve a tranzakció végrehajtása nem állíthat elő érvénytelen adatbázis-állapotot (azaz konzisztens). A tranzakciókezelő hajtatja végre a tranzakciókat és gondoskodik a naplózásról és helyreállításról, valamint a konkurenciakezelésről. + \end{itemize} + + \section*{Fizikai fájlszervezés} + + Az adatbázisban lévő adatokat a memóriában és a háttértárolón tároljuk. A memória és a háttértároló közötti adatávitelért a pufferkezelő modul a felelős. A memória és a háttértároló között átvihető legkisebb egységet \emph{\textbf{blokk}}nak nevezzük.\\\\ + Egy blokk tartalmaz: + \begin{itemize} + \item blokk fejlécet + \item rekordokat + \item szabad helyet (opcionálisan) + \end{itemize} + A blokk-fejlécben általában a blokk sorszámát, a rekordok méretét és azok számát vagy szabad hely kezdetét szokták tárolni.\\ + + \noindent Egy rekord mezőkből áll. A relációs adatmodellben például egy adattábla egy sorának egy rekord felel meg, és minden egyes attribútumnak egy mező felel meg. A blokkokhoz hasonlóan a rekordnak is lehet fejléce. Ebben lehet például a\\ + - \emph{rekord sorszáma}, a\\ + - \emph{töröltség jelző flag}, vagy a\\ + - \emph{rekord mérete}. + + \noindent \emph{Jelölések:}\\\\ + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{ l l l l } + \hline + \textit{\textbf{B}} & \text{blokk mérete} & \textit{\textbf{R}} & \text{rekord mérete} + \\ + \textit{\textbf{b}} & \text{blokkok száma} & \textit{\textbf{r}} & \text{rekordok száma} + \\ + \textit{\textbf{bf}} & \textit{blokkolási faktor} & $bf = \lfloor \ddfrac{B}{R} \rfloor$ & + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + \section*{Adatfájlok felépítése} + A legegyszerűbb adatfájl a rendezetlen fájl, más néven a kupac (heap). Ilyenkor a rekordokat egyszerűen egymás után beírjuk a blokkokba.\\\\ + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $b=\lceil \ddfrac{r}{bf}\rceil$ + \\ \hline + \textit{\textbf{Keresés}} & $\text{átlagosan}\ \ddfrac{b}{2},\ \text{legrosszabb esetben}\ b$ + \\ \hline + \textit{\textbf{Beszúrás} (a fájl végére)} & $1\ \text{olvasás} + 1\ \text{írás}$ + \\ \hline + \textit{\textbf{Törlés}} & $\text{keresés} + 1\ \text{írás (\emph{törölt flag beállítás})}$ + \\ \hline + \textit{\textbf{Módosítás}} & $\text{keresés} + 1\ \text{írás}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent Ha egy mező szerint rendezett fájlt használunk, akkor arra a mezőre vonatkozó keresés meggyorsítható, de cserében a frissítések bonyolultabbak lesznek.\\\\ + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $b=\lceil \ddfrac{r}{bf}\rceil$ + \\ \hline + \textit{\textbf{Keresés}} & $\log_{2}b,\ \textit{logaritmikus keresés}$ + \\ \hline + \textit{\textbf{Beszúrás} (a fájl végére)} & $\text{léptetni kell, átalagosan } \ddfrac{b}{2}\ \text{írás}$ + \\ \hline + \textit{\textbf{Törlés}} & $\text{keresés} + 1\ \text{írás (\emph{törölt flag beállítás})}$ + \\ \hline + \textit{\textbf{Módosítás}} & $\text{keresés} + 1\ \text{írás}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent Az előző nem jó megoldás. A beszúráson javíthatunk úgy, hogy az új rekordokat a fájl végére, egy rendezetlen területre írjuk be. Ekkor a beszúrás műveletigénye csökken. Azonban a fájl végén lévő rendezetlen blokkokat időnként (üresjárati időben, kötegelt feldolgozásban) bele kell illeszteni a rendezett fájlba.\\\\ + \renewcommand{\arraystretch}{1.5} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & $\log_{2}b + k,\ \text{ahol \textit{k} a rendezetlen blokkok száma}$ + \\ \hline + \textit{\textbf{Beszúrás}} & $1\ \text{olvasás} + 1\ \text{írás}$ + \\ \hline + \textit{\textbf{Törlés}} & $\text{keresés} + 1\ \text{írás (\emph{törölt flag beállítás})}$ + \\ \hline + \textit{\textbf{Módosítás}} & $\text{keresés} + 1\ \text{írás}$ + \\ \hline + \textit{\textbf{Karbantartás}} & $b \log_{2}b\ \text{(\emph{adatbázis újrarendezés})}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent Másik lehetőség a beszúrás javítására, ha üres helyeket hagyunk a blokkokban. Például lehet minden blokk kezdetben csak félig telítve. Ilyenkor szükség van az adatbázis karbantartására. A túltelített blokkokat szétvágni, nehogy teljesen beteljenek.\\\\ + \renewcommand{\arraystretch}{1.15} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $2b$ + \\ \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & $\log_{2}b + 1,\ \textit{logaritmikus keresés}$ + \\ \hline + \textit{\textbf{Beszúrás}} & $\text{keresés} + 1\ \text{írás}$ + \\ \hline + \textit{\textbf{Törlés}} & $\text{keresés} + 1\ \text{írás (\emph{törölt flag beállítás})}$ + \\ \hline + \textit{\textbf{Módosítás}} & $\text{keresés} + 1\ \text{írás}$ + \\ \hline + \textit{\textbf{Karbantartás}} & $\text{költséges}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1} + + \section*{Indexstruktúrák} + + Ha tudjuk, hogy egy mező szerint sokat fogunk keresni, akkor az adatbázist a szerint a mező szerint indexeljük. Ha \emph{az adatfájl rendezett}, \emph{\textbf{elsődleges index}ről beszélünk}. Ha az adatfájl \emph{nem rendezett}, vagy egy \emph{másik mezőre készítünk indexet}, akkor azt \textbf{\emph{másodlagos index}}nek nevezzük. Egy index lehet ritka és sűrű index. A ritka indexben csak az egyes blokkok elején lévő kulcsot tüntetjük fel, a sűrű indexben minden értéket. Ritka indexet csak rendezett adatfájlra lehet használni. + + \subsection*{Elsődleges index} + + Az elsődleges index olyan mezőre vonatkozik, amelyik szerint az adatfájl rendezett, így csak egy elsődleges index adható meg. Elsődleges indexnek használhatunk ritka indexet. A ritka indexben csak az adatfájl blokkjainak elején lévő kulcs-értékeket tüntetjük fel. Az indexben csak a kulcs-blokkszám párokat kell tárolni, ezért az index rekordmérete is kicsi. Az index rekordjainak száma megegyezik az adatfájl blokkjainak számával.\\\\ + \renewcommand{\arraystretch}{1.15} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $b_{I}=\lceil \ddfrac{b}{bf_{I}} \rceil \ll b$ + \\ \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & $\log_{2}b_{I} + 1$ \text(beolvasás) $\ll \log_{2}b$,\ \textit{logaritmikus keresés} + \\ \hline + \textit{\textbf{Frissítések}} & $\text{bonyolult, ld. rendezett adatfájl}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1} + + \subsection*{Másodlagos index} + + A másodlagos index olyan mezőre vonatkozik, amelyik szerint nincs rendezve az adatfájl. Lehet rendezetlen az adatfájl, vagy lehet, hogy másik mező szerint rendeztük. A másodlagos index egy sűrű index, az adatfájl egyes rekordjához egy index-rekord tartozik. Az index egy rekordjában kulcs-rekord mutató párok vannak.\\\\ + \renewcommand{\arraystretch}{1.15} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $b_{I}=\lceil \ddfrac{r}{bf_{I}} \rceil$ + \\ \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & $\log_{2}b_{I},\ \textit{logaritmikus keresés}$ + \\ \hline + \textit{\textbf{Frissítések}} & $\text{bonyolult, ld. rendezett adatfájl}$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\ + + \noindent Az indexek frissítésekor ugyanazok a problémák merülhetnek fel, mint a rendezett \lword{adatfájloknál}. A beszúrás gyorsítására itt is használható részben kitöltött blokk, egy így tovább. + + \subsection*{Bitmap index} + + A bitmap indexeket az oszlopok adott értékeihez szokták hozzárendelni, az alábbi módon: + \begin{itemize} + \item Ha az oszlopban az $i$. sor értéke megegyezik az adott értékkel, akkor a bitmap index $i$. tagja + egy 1-es. + + \item Ha az oszlopban az $i$. sor értéke viszont nem egyezik meg az adott értékkel, akkor a bitmap + index $i$. tagja egy 0. + \end{itemize} + + \noindent Így egy lekérdezésnél csak megfelelően össze kell AND-elni, illetve OR-olni a bitmap indexeket, és az így kapott számsorozatban megkeresni, hol van 1-es. A bináris értékeket szokás szakaszhossz kódolással tömöríteni a hatékonyabb tárolás érdekében. + + \subsection*{Többszintű indexek, keresőfák, B-fák} + + Az index olyan, mint egy rendezett adatfájl, ezért szintén indexelhető elsődleges indexel. Ha az indexet is indexeljük, akkor \emph{\textbf{többszintű indexelés}}ről beszélünk. Mivel az index már rendezett, azt ritka indexel lehet indexelni. Ráadásul az index rekordmérete is kisebb, mint az adattábláé, ezért nagyobb a blokkolási faktora. Ilyenkor az indexek tárigénye növekszik, de a keresés sokkal gyorsabb lesz.\\ + + \noindent A $t$. szintű index: az indexszinteket is indexeljük, összesen $t$ szintig.\\ + A $t$. szinten ($I(t)$) bináris kereséssel keressük meg a fedő indexrekordot.\\ + + \noindent Követjük a mutatót, minden szinten, és végül a főfájlban: $\log_{2}\Big(B\big(I(t)\big)\Big) + t$ blokkolvasás. Ha a legfelső szint 1 blokkból áll, akkor $t+1$ blokkolvasást jelent. Minden szint blokkolási faktora megegyezik, mert egyforma hosszúak az indexrekordok.\\ + + \noindent A $t$. szinten 1 blokk: $1=\ddfrac{B}{bf(I)^{t}}$. Azaz $t=\log_{bf(I)}(B) < \log_{2}(B) $, tehát jobb a rendezett fájlszervezésnél.\\ + + \noindent A $log_{bf(I)}(B) < \log_{2}\big(B(I)\big) $ is teljesül általában, így az egyszintű indexeknél is gyorsabb.\\ + + \renewcommand{\arraystretch}{1.7} + \noindent \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Tárigény}} & $b_{1} + b_{2} + \ldots + b_{t}$ + \\ \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & \makecell{$t + \log_{2}b_{t}$,\\ \text{ahol \emph{t} a szintek száma és a legfelső szinten} $b_{t}$\ \text{blokk van}} + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1}\\\\ + + \noindent Logikailag az index egy rendezett lista. Fizikailag a rendezett sorrendet táblába rendezett mutatók biztosítják.\\ + + \noindent A fa struktúrájú indexek B-fákkal ábrázolhatók. A B-fák megoldják a bináris fák kiegyenlítetlenségi problémáját, mivel "alulról" töltjük fel őket. A B-fa egy csomópontjához több kulcsérték tartozhat. A mutatók más csomópontokra mutatnak, és így az összes kulcsértékre az adott csomóponton. Mivel a B-fák kiegyenlítettek (minden ág egyenlő hosszú, vagyis ugyanazon a szinten fejeződik be), kiküszöbölik a változó elérési időket, amik a bináris fákban megfigyelhetők.\\ + + \noindent Bár a kulcsértékek és a hozzájuk kapcsolódó címek még mindig a fa minden szintjén megtalálhatók, és ennek eredménye: egyenlőtlen elérési utak, és egyenlőtlen elérési idő, valamint komplex fakeresési algoritmus az adatfájl logikailag soros olvasására.\\ Ez kiküszöbölhető, ha nem engedjük meg az adatfájl címek tárolását levélszint felett. Ebből következően: minden elérés ugyanolyan hosszú utat vesz igénybe, aminek egyenlő elérési idő az eredménye, és egy logikailag soros olvasása az adatfájlnak a levélszint elérésével megoldható. Nincs szükség komplex fakeresési algoritmusra.\\ + + \noindent A B-fa egy csomópontjához több kulcsérték tartozhat. A mutatók más csomópontokra mutatnak, és így az összes kulcsértékre az adott csomóponton. Ilyenkor a keresés \lword{műveletigénye} tovább csökken, bár most is logaritmikus, de a logaritmus alapszáma $bf_{I}$ ritka indexre vonatkozó blokkolási faktor. A módosíthatóság javítására pedig a blokkokban üres helyeket hagyunk. Ezt minden szinten elvégezve a beszúrás, törlés műveletigénye is logaritmikus lesz.\\\\ + \renewcommand{\arraystretch}{1.7} + \begin{tabular}{|l|l|} + \hline + \textit{\textbf{Szintek száma}} & $t = \log_{bfI} b$ + \\ \hline + \textit{\textbf{Tárigény}} & \text{nagyságrendben lineáris} + \\ \hline + \textit{\textbf{Keresés} ($A=a$ alakú)} & $t + \log_{bfI} b$ + \\ \hline + \textit{\textbf{Frissítési műveletek}} & $t + \log_{bfI} b$ + \\ \hline + \end{tabular} + \renewcommand{\arraystretch}{1} + + \subsection*{Hasító index} + \begin{itemize} + \item A hasító függvényekkel az A=a alakú kereséseket tudjuk felgyorsítani. A rekordok edényekbe (bucket) particionálva helyezkednek el, melyekre a $h$ hasítómezőn értelmezett függvény osztja szét őket. + \item Hatékony egyenlőségi keresés, beszúrás, és törlés jellemzi, viszont nem támogatja az intervallumos keresést ($a < A < b$). + \item A rekordokat blokkláncokba soroljuk, és a blokklánc utolsó blokkjának első üres helyére tesszük a rekordokat a beérkezés sorrendjében. + \item A blokkláncok száma lehet + \begin{itemize} + \item előre adott (\emph{statikus hasítás}, ekkor a számot $K$-val jelöljük), vagy + \item a tárolt adatok alapján változhat (\emph{dinamikus hasítás}). + \end{itemize} + \item A besorolás az indexmező értékei alapján történik. Egy $h(x) \in \left\{1,..,K\right\}$ hasító függvény értéke mondja meg, + hogy melyik kosárba tartozik a rekord, ha $x$ volt az indexmező értéke a rekordban. + \item A hasító függvény általában maradékos osztáson alapul (például $mod(K)$). + \item Akkor jó egy hasító függvény, ha nagyjából egyforma hosszú blokkláncok keletkeznek, azaz egyenletesen sorolja be a rekordokat. Ekkor a blokklánc $\ddfrac{B}{K}$ blokkból áll. +\newpage + \item A keresés költsége (A=a alakú): + \begin{itemize} + \item Ha az indexmező és keresési mező eltér, akkor kupac szervezést jelent. + \item Ha az indexmező és keresési mező megegyezik, akkor csak elég a $h(a)$ sorszámú kosarat végignézni, + amely $\ddfrac{B}{K}$ blokkból álló kupacnak felel meg, azaz\\ + $\ddfrac{B}{K}$ legrosszabb esetben. + A keresés így $K$-szorosára gyorsul. + \end{itemize} + \item Miért nem érdemes nagy $K$-t választani? + A tárméret $B$, ha minden blokk nagyjából tele van. + \begin{itemize} + \item Nagy $K$ esetén sok olyan blokklánc lehet, amely egy blokkból fog állni, és a blokkban is csak 1 rekord lesz. Ekkor a keresési idő: 1 blokkbeolvasás, + de $B$ helyett $T$ számú blokkban tároljuk az adatokat. + \item Módosításnál $\ddfrac{B}{K}$ blokkból álló kupac szervezésű kosarat kell módosítani. + \end{itemize} + \end{itemize} + + \section*{Lekérdezések végrehajtása, optimalizálása} + + A lekérdezésfeldolgozó egy relációs adatbázis-kezelő komponenseinek azon csoportja, amelyik a felhasználó lekérdezéseit, valamint adatmódosító utasításait lefordítja adatbázis-műveletekre, amiket végre is hajt. + + \begin{figure}[H] + \centering + $\begin{array}{C{.5\textwidth}C{.5\textwidth}} + \includegraphics[width=0.75\linewidth]{img/queryprocessing} + & + \includegraphics[width=0.75\linewidth]{img/querycompiling} + \end{array}$ + \caption{A lekérdezésfeldolgozás és lekérdezésfordítás lépései.} + \end{figure} + + \noindent A lekérdezés végrehajtása tulajdonképpen az adatbázist manipuláló algoritmusok összessége, azonban a végrehajtás előtt szükség van a lekérdezések fordítására.\\ + + \paragraph*{A lekérdezés-fordítás lépései} + \begin{enumerate} + \item Egy elemző fát építünk fel, amely a lekérdezést és annak szerkezetét jellemzi + + \item Az elemző fából egy kezdeti lekérdezés-tervet készítünk, amelyet átalakítunk + egy ezzel ekvivalens tervvé, aminek végrehajtási ideje várhatóan kisebb lesz. Elkészül a logikai + lekérdezésterv, amely relációs algebrai kifejezéseket tartalmaz. + + \item A logikai tervet átalakítjuk fizikai tervvé úgy, hogy a logikai terv operátoraihoz kiválasztunk egy + algoritmust, valamint meghatározzuk az operátorok végrehajtási sorrendjét. A fizikai terv olyan részleteket is + tartalmaz, hogy pl. kell-e rendezni, vagy hogyan férünk hozzá az adatokhoz. + \end{enumerate} + + \subsection*{Algebrai optimalizálás} + + A relációs algebrai kifejezéseket minél gyorsabban akarjuk kiszámolni. A kiszámítás költsége arányos a relációs algebrai kifejezés részkifejezéseinek megfelelő relációk tárolási méreteinek összegével. A módszer az, hogy műveleti tulajdonságokon alapuló ekvivalens átalakításokat alkalmazunk, azért, hogy várhatóan kisebb méretű relációk keletkezzenek.\\ + + \noindent Az eljárás heurisztikus, tehát nem az argumentum relációk valódi méretével számol. Az eredmény nem egyértelmű, ugyanis az átalakítások sorrendje nem determinisztikus, így más sorrendben végrehajtva az átalakításokat más végeredményt kaphatunk, de mindegyik általában jobb költségű, mint amiből kiindultunk.\\ + + \noindent Az optimalizáló algoritmus a következő heurisztikus elveken alapul: + \begin{itemize} + \item Minél hamarabb szelektáljunk, hogy a részkifejezések várhatóan kisebb relációk legyenek. + \item A szorzás utáni kiválasztásokból próbáljunk természetes összekapcsolásokat képezni, mert az összekapcsolás hatékonyabban kiszámolható, mint a szorzatból történő kiválasztás. + \item Vonjuk össze az egymás utáni unáris műveleteket (kiválasztásokat és vetítéseket), és ezekből lehetőleg egy kiválasztást, vagy vetítést, vagy kiválasztás utáni vetítést képezzünk. Így csökken a műveletek száma, és általában a kiválasztás kisebb relációt eredményez, mint a vetítés. + \item Keressünk közös részkifejezéseket, amiket így elég csak egyszer kiszámolni a kifejezés kiértékelése során. + \end{itemize} +\newpage + \subsection*{Relációs algebrai műveletek megvalósítása} + + \noindent \emph{Jelölések}: $\sigma\ (\textit{szigma}),\ \theta\ (\textit{théta}),\ \pi\ (\textit{pi})$ + + \subsubsection*{Kiválasztás} + + A kiválasztás ($\sigma$) lehetséges megvalósításai: + + \begin{itemize} + \item Lineáris keresés: Olvassunk be minden lapot és keressük az egyezéseket (egyenlőség vizsgálat esetén). + Az átlagos költség a lapok száma, ha a mező nem kulcs, illetve a lapok számának fele, ha a mező kulcs. + \item Bináris (logaritmikus) keresés: Csak rendezett mező esetén használható. + \item Elsődleges index használata. + \item Másodlagos index használata. + \end{itemize} + + \noindent \textbf{Összetett kiválasztás} + Előfordulhat, hogy több feltétel van, amelyek és/vagy kapcsolatban vannak egymással. Ennek lehetséges megvalósításai a következők. + \begin{itemize} + \item Konjunkciós kiválasztás esetén ($\sigma_{\theta_{1} \wedge ... \wedge \theta_{n}}$): + \begin{itemize} + \item Válasszuk ki a legkisebb költségű $\sigma_{\theta_{i}}$-t, és azt végezzük el (lásd fent), + majd az eredményt szűrjük a többi feltételre. \\ + \emph{Költség}: Az egyszerű kiválasztás költsége lesz a kiválasztott $\sigma_{\theta_{i}}$-re. + + \item Ha mindegyik $\theta_{i}$ mezőjére van indexünk, akkor keressük az indexekben és adjuk vissza a megfelelő + sorok rowid-jeit. Végül vegyük ezek \emph{\textbf{metszetét}}. \\ + \emph{Költség}: az indexekben való keresés összköltsége + a rekordok beolvasása. + \end{itemize} + + \item Diszjunkciós kiválasztás esetén ($\sigma_{\theta_{1} \vee ... \vee \theta_{n}}$): + \begin{itemize} + \item Lineáris keresés. + + \item Ha mindegyik $\theta_{i}$ mezőjére van indexünk, akkor keressük az indexekben és adjuk vissza a megfelelő + sorok rowid-jeit. Végül vegyük ezek \emph{\textbf{unióját}}. \\ + \emph{Költség}: az indexekben való keresés összköltsége + a rekordok beolvasása. + \end{itemize} + \end{itemize} + + \subsection*{Vetítés és halmazműveletek} + + Vetítésnél és halmazműveleteknél a duplikátumokat ki kell szűrni.\\ + + \noindent \textbf{Vetítés ($\pi$) megvalósítása}: + + \begin{enumerate} + \item Kezdeti átnézés: eldobjuk a felesleges mezőket. + \item Duplikátumok törlése: ehhez az eredményt rendezzük az összes mező szerint, így a duplikáltak szomszédosak + lesznek. Ezeket kell eldobni. + \end{enumerate} + + \noindent A költség a kezdeti átnézés, a rendezés és a duplikátumok törlésének összköltsége lesz. + + \subsection*{Összekapcsolások} + + \subsubsection*{Beágyazott ciklusú összekapcsolás (nested loop join) ($R \bowtie_{Z} S$)} + Bármekkora méretű relációra használható, nem szükséges, hogy az egyik reláció elférjen a memóriában. Két fajtája van, a \emph{sor} és a \emph{blokk} alapú. + \begin{itemize} + \item \textbf{Sor alapú beágyazott ciklusú összekapcsolás} + \begin{itemize} + \item Legyen $R$ és $S$ a két összekapcsolandó reláció + \begin{itemize} + \item $S$ belső reláció (kisebb méretű) + \item $R$ külső reláció + \end{itemize} + \item Az algoritmus a következő: \\\\ + {\small + $\begin{array}{llll} + \multicolumn{2}{l}{\textbf{R}\ \text{minden}\ t_{R}\ \text{rekordján}} & & \\ + & \multicolumn{2}{l}{\textbf{S}\ \text{minden}\ t_{S}\ \text{rekordján}} & \\ + & & \multicolumn{2}{l}{\text{ha}\ (t_{R}\ \text{egyezik}\ t_{S}\ Z-n)\quad t_{R}.t_{S}\ \text{kiírása}} \\ + & \text{vége} & & \\ + \text{vége} & & & \\ + \end{array}$}\\ + \item Költség: + \begin{itemize} + \item Jó esetben $S$ belefér a memóriába, ekkor csak egyszer kell beolvasni $S$-t, majd mindvégig a memóriában tarthatjuk.\\ + Ebben az esetben mindkét reláció lapjait egyszer kell beolvasni: $B_R + B_S$ + \item Legrosszabb esetben mindkét relációból csak egy-egy lap fér bele a memóriába.\\ + Ekkor $R$ \emph{minden egyes soránál} végig kell olvasni $S$-t: $N_R * B_S + B_R$. + \end{itemize} + \end{itemize} + \item \textbf{Blokk alapú beágyazott ciklusú összekapcsolás} + \begin{itemize} + + \item Az algoritmus a következő: \\\\ + {\small + $\begin{array}{llllll} + \multicolumn{2}{l}{\textbf{R}\ \text{minden}\ X_{R}\ \text{lapján}} & & & & \\ + & \multicolumn{2}{l}{\textbf{S}\ \text{minden}\ X_{S}\ \text{lapján}} & & & \\ + & & \multicolumn{2}{l}{\textbf{R}\ \text{minden}\ t_{R}\ \text{rekordján}} & & \\ + & & & \multicolumn{2}{l}{\textbf{S}\ \text{minden}\ t_{S}\ \text{rekordján}} & \\ + & & & & \multicolumn{2}{l}{\text{ha}\ (t_{R}\ \text{egyezik}\ t_{S}\ Z-n)\ t_{R}.t_{S}\ \text{kiírása}} \\ + & & & \text{vége} & & \\ + & & \text{vége} & & & \\ + & \text{vége} & & & & \\ + \text{vége} & & & & & \\ + \end{array}$}\\ + \item Költség: + \begin{itemize} + \item Jó esetben $S$ belefér a memóriába, ekkor csak egyszer kell beolvasni $S$-t, majd mindvégig a memóriában tarthatjuk.\\ + Ebben az esetben mindkét reláció lapjait egyszer kell beolvasni: $B_R + B_S$ + \item Legrosszabb esetben mindkét relációból csak egy-egy lap fér bele a memóriába.\\ + Ekkor $R$ \emph{minden egyes lapjánál} végig kell olvasni $S$-t: $B_R * B_S + B_R$. + \end{itemize} + \end{itemize} + \end{itemize} + + \subsubsection*{Összefésüléses rendező összekapcsolás (merge join)} + \begin{itemize} + \item A relációk az összekapcsolási mezők szerint rendezettek. + \item Egyesítjük a rendezett relációkat: + \begin{itemize} + \item mutatók az első rekordra mindkét relációban + \item beolvasunk $S$-ből egy rekordcsoportot, ahol az összekapcsolási attribútum értéke megegyezik + \item beolvasunk rekordokat $R$-ből és feldolgozzuk. + \end{itemize} + \item A rendezett relációkat csak egyszer kell végigolvasni + \begin{itemize} + \item Összekapcsolás költsége:\\ + rendezés költsége + $B_s + B_R$ (a két reláció lapjainak száma). + \end{itemize} + \end{itemize} + + \subsubsection*{Hasításos összekapcsolás (hash join)} + \begin{itemize} + \item Az összekapcsolási attribútumot használjunk hasítókulcsként, és felosztjuk a rekordokat a memóriába elférő részekre + \begin{itemize} + \item $R$ rekordjainak felosztása $R_0\ldots R_n-1$ + \item $S$ rekordjainak felosztása $S_0\ldots S_n-1$ + \end{itemize} + \item Ez után az egymáshoz rendelt kosárpárokat összekapcsoljuk blokk alapú beágyazott ciklusú összekapcsolással, hasítófüggvény alapú indexet használva. + \begin{itemize} + \item Összekapcsolás költsége: $2 * (B_R + B_S) + (B_R + B_S)$ + \end{itemize} + \end{itemize} + + \subsubsection*{Több tábla összekapcsolása} + + Az összekapcsolások kommutatívak és asszociatívak, ezért az eredmény szempontjából mindegy, hogy milyen sorrendben kapcsoljuk össze őket. A sorrend viszont befolyásolhatja a hatékonyságot, ugyanis rossz választás esetén a köztes eredmények nagy méretűek lesznek.\\ + + \noindent A legjobb összekapcsolási fa megtalálása $n$ reláció egy halmazához: + \begin{itemize} + \item Hogy megtaláljuk a legjobb összekapcsolási fát $n$ reláció egy $S$ halmazához, + vegyük az összes lehetséges tervet mely így néz ki: $S_{1} \Join (S - S_{1})$, ahol $S_{1}$ az $S$ tetszőleges nem üres részhalmaza. + + \item Rekurzívan számítsuk ki $S$ részhalmazainak összekapcsolásának költségeit, hogy meghatározzuk minden egyes terv költségét. Válasszuk a legolcsóbbat. + + \item Mikor bármely részhalmaz terve kiszámításra került, az újbóli kiszámítás helyett tároljuk el és hasznosítsuk újra amikor ismét szükség lesz rá. + \end{itemize} + + \section*{Tranzakciókezelés} + + \noindent \textbf{Konzisztens adatbázis}: Az adatbázisokra különböző megszorítások adhatók meg. Az adatbázis konzisztens állapotban + van, ha kielégíti az összes ilyen megszorítást. Konzisztens adatbázis egy olyan adatbázis, amely konzisztens állapotban van.\\ + + \noindent A konzisztencia sérülhet a következő esetekben: + \begin{itemize} + \item Tranzakcióhiba: hibásan megírt, rosszul ütemezett, félbehagyott tranzakciók. + \item Adatbázis--kezelési hiba: az adatbázis-kezelő valamelyik komponense nem, vagy rosszul hajtja végre a feladatát. + \item Hardverhiba: elvész egy adat, vagy megváltozik az értéke. + \item Adatmegosztásból származó hiba. + \end{itemize} + + \noindent \textbf{Tranzakció}: Konzisztenciát tartó adatbázis-műveletek sorozata.\\ + Ezek után mindig feltesszük, hogy ha a $T$ tranzakció indulásakor az adatbázis konzisztens állapotban van, akkor ha $T$ egyedül fut le, az adatbázis konzisztens állapotban lesz a futás végén (közben kialakulhat inkonzisztens állapot).\\ + + \noindent \emph{Helyesség feltétele}: + \begin{itemize} + \item Ha leáll egy vagy több tranzakció (abort, vagy hiba miatt), akkor is konzisztens adatbázist kapunk. + \item Minden egyes tranzakció induláskor konzisztens adatbázist lát. + \end{itemize} + + \noindent A tranzakcióktól a következő tulajdonságokat szoktuk elvárni (ACID): + + \begin{itemize} + \item Atomosság (\textbf{A}, azaz \emph{Atomicity}): a tranzakció "mindent vagy semmit" jellegű \lword{végrehajtása} (vagy teljesen végrehajtjuk, vagy egyáltalán nem hajtjuk végre). + \item Konzisztencia (\textbf{C}, azaz \emph{Consistency}): az a feltétel, hogy a tranzakció megőrizze az adatbázis konzisztenciáját, azaz a tranzakció végrehajtása után is teljesüljenek az adatbázisban előírt konzisztenciamegszorítások. + \item Elkülönítés (\textbf{I}, azaz \emph{Isolation}): az a tény, hogy minden tranzakciónak látszólag úgy kell lefutnia, mintha ez alatt az idő alatt semmilyen másik tranzakciót sem hajtanánk végre. + \item Tartósság (\textbf{D}, azaz \emph{Durability}): az a feltétel, hogy ha egyszer egy tranzakció befejeződött, akkor már soha többé nem veszhet el a tranzakciónak az adatbázison kifejtett hatása. + \end{itemize} + A konzisztenciát mindig adottnak tekintjük. A másik három tulajdonságot viszont az adatbázis-kezelő rendszernek kell biztosítania, de ettől időnként eltekintünk. Feltesszük, hogy az adatbázis adategységekből, elemekből áll. Az adatbáziselem a fizikai adatbázisban tárolt adatok egyfajta funkcionális egysége, amelynek értékét tranzakciókkal lehet elérni (kiolvasni) vagy módosítani (kiírni). Adatbáziselem pl. a reláció, relációsor, lap. + + \subsection*{A tranzakciók alaptevékenységei} + + \noindent A tranzakció és az adatbázis kölcsönhatásának három fontos helyszíne van: + \begin{itemize} + \item Az adatbázis elemeit tartalmazó lemezblokkok területe. + \item A pufferkezelő által használt virtuális vagy valós memóriaterület. + \item A tranzakció memóriaterülete. + \end{itemize} + + \noindent Ahhoz, hogy a tranzakció egy adatbáziselemet beolvashasson, azt előbb memóriapuffer(ek)be kell hozni, ha még nincs ott. Ezt követően tudja a puffer(ek) tartalmát a tranzakció saját memóriaterületére beolvasni.\\ + + \noindent Az adatbáziselem új értékének kiírás fordítva történik: előbb a tranzakció kialakítja az új értéket saját memóriaterületén, majd ez az érték másolódik át a megfelelő puffer(ek)be.\\ + + \noindent A pufferek tartalmának lemezre írásáról a pufferkezelő dönt. Vagy azonnal lemezre írja a változásokat, vagy nem.\\ + + \noindent A naplózási algoritmusok és más tranzakciókezelő algoritmusok tanulmányozása során különböző jelölésekre lesz szükség, melyekkel a különböző területek közötti adatmozgásokat írhatjuk le.\\\\ + \noindent A következő alapműveletek használjuk: + \begin{itemize} + \item $INPUT(X)$: + \begin{itemize} + \item Az $X$ adatbáziselemet tartalmazó lemezblokk másolása a pufferbe. + \end{itemize} + \item $READ(X,t)$: + \begin{itemize} + \item Az X adatbáziselem bemásolása a tranzakció $t$ lokális változójába. + \item Ha az $X$-et tartalmazó blokk még nincs a memóriában, akkor $INPUT(X)$-et is beleértjük. + \end{itemize} + \item $WRITE(X,t)$: + \begin{itemize} + \item A $t$ lokális változó tartalmaz az $X$ adatbáziselem memóriapufferbeli tartalmába másolódik. + \item Ha az $X$-et tartalmazó blokk még nincs a pufferben, akkor előbb $INPUT(X)$ is végrehajtódik. + \end{itemize} + \item $OUTPUT(X)$: + \begin{itemize} + \item Az $X$ adatbáziselemet tartalmazó blokk kiírása lemezre. + \end{itemize} + \end{itemize} + + \noindent A továbbiakban feltételezzük, hogy egy adatbáziselem nem nagyobb egy blokknál. + + \subsection*{Naplózás és helyreállítás} + + Az adatokat meg kell védeni a rendszerhibáktól, ezért szükség van az adatok helyreállíthatóságára. Erre az elsődleges technika a naplózás, amely valamilyen biztonságos módszerrel rögzíti az adatbázisban végrehajtott módosítások történetét.\\ + + \noindent A napló (log) nem más, mint naplóbejegyzések (log records) sorozata, melyek arról tartalmaznak információt, hogy mit tett egy tranzakció. Rendszerhiba esetén a napló segítségével rekonstruálható, hogy mit tett a tranzakció a hiba fellépéséig. + + \subsubsection*{Naplóbejegyzések} + + Úgy kell tekintenünk, hogy \emph{a napló}, mint fájl \emph{kizárólag bővítésre van megnyitva}.\\ + Tranzakció végrehajtásakor a naplókezelőé a feladat, hogy minden fontos eseményt rögzítsen a naplóban.\\ + + \noindent Az összes naplózási módszer által használt naplóbejegyzések: + \begin{itemize} + \item $\langle START \ T \rangle$: Ez a bejegyzés jelzi a \emph{T} tranzakció végrehajtásának kezdetét. + \item $\langle COMMIT \ T \rangle$: A \emph{T} tranzakció rendben befejeződött, már nem akar további módosításokat végrehajtani. + \item $\langle ABORT \ T \rangle$: A \emph{T} tranzakció abortált, nem tudott sikeresen befejeződni. Az általa tett változtatásokat + nem kell a lemezre másolni, vagy ha a lemezre másolódtak, akkor vissza kell állítani. + \end{itemize} + + \subsubsection*{Semmisségi (undo) naplózás} + + \noindent A semmisségi naplózás lényege, hogy ha nem biztos, hogy egy tranzakció műveletei rendben befejeződtek és minden változtatás lemezre íródott, akkor a tranzakció hatását vissza kell vonni, azaz az adatbázist olyan állapotba kell visszaállítani, mintha a tranzakció el se kezdődött volna.\\ + + \noindent A semmisségi naplózásnál szükség van még egy fajta naplóbejegyzésre, a módosítási bejegyzésre, amely egy $\langle T,X,v\rangle$ hármas: + \begin{itemize} + \item $T$ tranzakció az + \item $X$ adatbáziselemet módosította, és + \item $X$-nek a módosítás előtti értéke $v$ volt. + \end{itemize} + + \noindent \textbf{A semmisségi naplózás szabályai}: + \begin{itemize} + \item Ha a $T$ tranzakció módosítja az $X$ adatbáziselemet, akkor a $\langle T,X,v\rangle$ naplóbejegyzést az előtt kell a lemezre írni, hogy az új értéket a lemezre írná a rendszer. + \item Ha a tranzakció hibamentesen befejeződött, akkor a $COMMIT$ bejegyzést csak azután szabad lemezre írni, hogy a tranzakció által végrehajtott összes módosítás lemezre íródott. + \end{itemize} + + \paragraph{Helyreállítás a semmisségi naplózás használatával} + + Tegyük fel, hogy rendszerhiba történt. Ekkor előfordulhat, hogy egy tranzakció nem atomosan hajtódott végre, azaz bizonyos módosításai már lemezre íródtak, de mások még nem. Ekkor az adatbázis inkonzisztens állapotba kerülhet. + Ezért rendszerhiba esetén gondoskodni kell az adatbázis konzisztenciájának visszaállításáról. Semmisségi naplózás esetén ez a be nem fejeződött tranzakciók által végrehajtott módosítások semmissé tételét jelenti.\\ + + \paragraph*{Visszaállítás ellenőrzőpont nélkül} + + \noindent Ez a legegyszerűbb módszer. A teljes naplót látjuk. + \begin{itemize} + \item Az első feladat a tranzakciók felosztása sikeresen befejezett és befejezetlen tranzakciókra. + \begin{itemize} + \item Egy $T$ tranzakció sikeresen befejeződött, ha van a naplóban $\langle COMMIT \ T \rangle$ bejegyzés. Ekkor $T$ önmagában nem hagyhatta inkonzisztens állapotban az adatbázist. + \end{itemize} + \item Amennyiben találunk a naplóban $\langle START \ T \rangle$ bejegyzést, de $\langle COMMIT \ T \rangle$ bejegyzést nem, akkor feltételezhetjük, hogy $T$ végrehajtott olyan módosítást az adatbázisban, amely még nem íródott ki lemezre. + \begin{itemize} + \item Ekkor $T$ nem befejezett tranzakció, hatását semmissé kell tenni. + \end{itemize} + \item Az algoritmus a következő: + \begin{itemize} + \item A helyreállítás-kezelő elkezdi vizsgálni a naplóbejegyzéseket az utolsótól kezdve, visszafelé haladva, közben feljegyzi azokat a $T$ tranzakciókat, melyre $\langle COMMIT \ T \rangle$ vagy $\langle ABORT \ T \rangle$ bejegyzést talált. + \item Visszafelé haladva, amikor $\langle T,X,v\rangle$ naplóbejegyzést lát: + \begin{enumerate} + \item Ha $T$-re találkozott már $COMMIT$ bejegyzéssel, akkor nem tesz semmit. + \item Más esetben $T$ nem teljes vagy abortált. Ekkor a helyreállítás-kezelő az $X$ adatbáziselem értékét $v$-re változtatja. + \end{enumerate} + \end{itemize} + \end{itemize} + + \noindent A fenti változtatások végrehajtás után minden nem teljes $T$ tranzakcióra $\langle ABORT \ T \rangle$-t ír a napló végére és kiváltja a napló lemezre írását. Ezt követően az adatbázis normál használata folytatódhat. + + \subsubsection*{Ellenőrzőpont-képzés} + + A helyreállítás elvben a teljes napló átvizsgálását igényelné. Ha undo naplózást használunk, akkor ha egy $T$ tranzakcióra + van $COMMIT$ bejegyzés a naplóban, akkor a $T$ tranzakcióra vonatkozó bejegyzések nem szükségesek a helyreállításhoz, viszont + nem feltétlenül igaz az, hogy törölhetjük a $T$ tranzakcióra vonatkozó $COMMIT$ előtti bejegyzéseket. A legegyszerűbb megoldás + időnként ellenőrzőpontokat készíteni.\\ + + \paragraph{Az egyszerű ellenőrzőpont képzése} + \begin{enumerate} + \item Új tranzakció indítására vonatkozó kérések leállítása. + \item A még aktív tranzakciók befejeződésének és a $COMMIT/ABORT$ bejegyzés naplóba írásának kivárása. + \item A napló lemezre írása. + \item A $\langle CKPT \rangle$ naplóbejegyzés képzése, naplóba írása, majd a napló lemezre írása. + \item Tranzakcióindítási kérések kiszolgálásának újraindítása. + \end{enumerate} + + \noindent Az ellenőrzőpont előtt végrehajtott tranzakciók befejeződtek, módosításaik lemezre kerültek. Ezért elég az utolsó ellenőrzőpont utáni részét elemezni a naplónak helyreállításnál. + + \paragraph{Ellenőrzőpont létrehozása a rendszer működése közben} + + Az egyszerű ellenőrzőpont-képzéssel az a probléma, hogy nem engedi új tranzakciók elindítását, amíg az aktív tranzakciók be nem fejeződnek. Ez viszont még sok időt igénybe vehet, a felhasználó számára pedig leállítottnak tűnik a rendszer, hiszen nem + tud új tranzakciót indítani. Ezt nem engedhetjük meg. Egy bonyolultabb módszer azonban lehetővé teszi ellenőrzőpont képzését anélkül, hogy az új tranzakciók indítását fel kellene függeszteni.\\ + + \noindent E módszer lépései: + \begin{enumerate} + \item $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ bejegyzés készítése és a napló lemezre írása.\\ + $T_{1},..T_{k}$ az éppen aktív, befejezetlen tranzakciók. + \item Meg kell várni a $T_{1},..T_{k}$ tranzakciók befejeződését.\\ + Eközben indíthatók új tranzakciók. + \item Ha az ellenőrzőpont-képzés kezdetén még aktív $T_{1},..T_{k}$ tranzakciók mindegyike befejeződött, akkor + $\langle END \ CKPT \rangle$ naplóbejegyzés készítése és lemezre írása. + \end{enumerate} + + \noindent \textbf{Helyreállítás}: Visszafelé elemezve megtaláljuk a be nem fejezett tranzakciókat, az ezen tranzakciók által + módosított adatbáziselemek tartalmát a régi értékre állítjuk vissza. \\ + Két eset fordulhat elő, vagy $\langle END \ CKPT \rangle$, vagy + $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ \lword{naplóbejegyzéssel} találkozunk előbb. + + \begin{itemize} + \item Ha előbb $\langle END \ CKPT \rangle$ bejegyzéssel találkozunk, akkor az összes be nem fejezett tranzakcióra + vonatkozó bejegyzés megtalálható a legközelebbi \\ $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ bejegyzésig. Az ennél korábbiakkal nem kell foglalkoznunk. + \item Ha $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ bejegyzéssel találkozunk előbb, akkor a hiba + ellenőrzőpont-képzés közben történt. Ekkor a $T_{1},..T_{k}$ tranzakciók közül a legkorábban elindítottnak + a START bejegyzéséig kell visszamenni, ami viszont biztosan az ezt megelőző START CKPT bejegyzés után található. + \end{itemize} + + \noindent Általános szabályként, ha END CKPT-ot írunk a lemezre, akkor az azt megelőző START CKPT bejegyzést megelőző bejegyzésekre nincs szükség a helyreállítás szempontjából. + + \subsection*{Helyrehozó (redo) naplózás} + + \noindent \textbf{Redo vs. undo naplózás}: + \begin{itemize} + \small + \item A helyrehozó naplózás a semmisségi naplózással szemben helyreállításnál figyelmen kívül hagyja a befejezetlen + tranzakciókat és befejezi a normálisan befejezettek által végrehajtott változtatásokat. + + \item Undo naplózás esetén a COMMIT naplóba írása előtt megköveteljük a módosítások lemezre írását. Ezzel szemben + redo naplózás esetén csak akkor írjuk lemezre a tranzakció által végrehajtott módosításokat, ha a COMMIT bejegyzés + a naplóba íródott és lemezre került. + + \item Undo naplózásnál a módosított elemek régi értékére van szükség helyreállításnál, redo-nál pedig az újra. + \end{itemize} + + \noindent \textbf{Helyrehozó naplózás szabályai}: Itt a $\langle T,X,v\rangle$ bejegyzés jelentse azt, hogy a \\ + T tranzakció az X adatbáziselemet értékét \emph{v}-re változtatta. Annak sorrendjét, hogy az adat- és naplóbejegyzések hogyan kell, hogy lemezre kerüljenek, az alábbi, ún. "írj korábban" + naplózási szabály határozza meg: Mielőtt az adatbázis bármely X elemét a lemezen módosítanánk, szükséges, hogy + a $\langle T,X,v\rangle$ és $\langle COMMIT \ T\rangle$ naplóbejegyzések lemezre kerüljenek.\\ + + \noindent \textbf{Helyreállítás helyrehozó naplózás használatával}: + \begin{itemize} + \item Ha egy T tranzakció esetén nincs $\langle COMMIT \ T\rangle$ bejegyzés a naplóban, akkor tudjuk, hogy T módosításai nem kerültek lemezre, így ezekkel nem kell foglalkozni. + \item Ha viszont T befejeződött, azaz van $\langle COMMIT \ T\rangle$ bejegyzés, akkor vagy lemezre kerültek a módosításai, vagy nem. Ezért meg kell ismételni T módosításait. + \end{itemize} + + \noindent \textbf{Helyreállítás}: + \begin{enumerate} + \item Meghatározni azon tranzakciókat, amelyre van COMMIT bejegyzés a naplóban. + \item Elemezni a naplót az elejéről kezdve. Ha $\langle T,X,v\rangle$ bejegyzést találunk, akkor + ha T befejezett tranzakció, akkor v értékét kell X-be írni. Ha T befejezetlen, nem teszünk semmit. + \item Ha végig értünk a naplón, akkor minden be nem fejezett T tranzakcióra $\langle ABORT \ T\rangle$ + naplóbejegyzést írunk a naplóba és a naplót lemezre írjuk. + \end{enumerate} + + \paragraph{Helyrehozó naplózás ellenőrzőpont-képzéssel} + Helyrehozó naplózásnál a működés közbeni ellenőrzőpont-képzés lépései: + \begin{enumerate} + \item $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ naplóbejegyzés készítése és lemezre írása, ahol + $T_{1}, ... T_{k}$ az aktív tranzakciók. + + \item Az összes olyan adatbáziselem kiírása lemezre, amelyeket olyan tranzakciók írtak pufferbe, amelyek + $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ előtt befejeződtek (COMMIT), de puffereik még nem kerültek + lemezre. + + \item $\langle END \ CKPT \rangle$ naplóbejegyzés készítése és lemezre írása. + \end{enumerate} + + \noindent \textbf{Visszaállítás ellenőrzőponttal kiegészített redo naplózásnál}:\\ + Két eset fordulhat elő: az utolsó ellenőrzőponttal kapcsolatos naplóbejegyzés vagy START CKPT, vagy END CKPT. + + \begin{itemize} + \item Tegyük fel, hogy az utolsó ellenőrzőpont-bejegyzés a naplóban END CKPT.\\ + Ekkor a $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ előtt befejeződött tranzakciók módosításai már biztosan lemezre kerültek, ezekkel nem kell foglalkoznunk, viszont + a $T_{i}$-kel és a START CKPT bejegyzés után indított tranzakciókkal foglalkoznunk kell. Ekkor olyan visszaállítás kell tennünk, + mint a sima helyrehozó naplózásnál, annyi különbséggel, hogy csak a $T_{i}$-ket és a START CKPT után indított tranzakciókat + kell figyelembe venni. A keresésnél a legkorábbi $\langle START \ T_{i}\rangle$ bejegyzésig kell visszamenni, ahol $T_{i}$ a + $T_{1},...T_{k}$ valamelyike. + + \item Tegyük fel, hogy az utolsó ellenőrzőpont-bejegyzés a naplóban \\ + $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$. Nem lehetünk biztosak benne, hogy az ez előtt befejeződött tranzakciók módosításai lemezre íródtak, ezért az ezt megelőző + END CKPT előtti $\langle START \ CKPT(S_{1},S_{2},\ldots,S_{m}) \rangle$ kell visszamenni. Vissza kell állítani azoknak a + tranzakcióknak a módosításait, amik $S_{i}$-k közül valók, vagy \\ + $\langle START \ CKPT(S_{1},S_{2},\ldots,S_{m}) \rangle$ után indultak és befejeződtek. + \end{itemize} + + \subsubsection*{Semmisségi/helyrehozó (undo/redo) naplózás} + + \noindent Undo/redo naplózásnál a módosítást jelző naplóbejegyzések $\langle T,X,v,w \rangle$ alakúak, ami azt jelenti, hogy a T tranzakció + az X adatbáziselem értékét v-ről w-re változtatta.\\ + + \noindent Undo/redo naplózás esetén a következő előírást kell betartani: Mielőtt az adatbázis bármely X elemének értékét módosítanánk a lemezen, + a $\langle T,X,v,w \rangle$ naplóbejegyzésnek a lemezre kell kerülnie.\\ + + \noindent Speciálisan a $\langle COMMIT \ T\rangle$ bejegyzés megelőzheti és követheti is a módosítások lemezre írását. + + \paragraph{Helyreállítás undo/redo naplózásnál} + \noindent Az alapelvek: + \begin{enumerate} + \item A legkorábbitól kezdve állítsuk helyre minden befejezett tranzakció hatását. + \item A legutolsótól kezdve tegyük semmissé a be nem fejezett tranzakciók hatását. + \end{enumerate} + + + \noindent \textbf{Undo/redo naplózás ellenőrzőpont-képzéssel}: + \begin{enumerate} + \item Írjunk a naplóba $\langle START \ CKPT(T_{1},T_{2},...T_{k}) \rangle$ bejegyzést, ahol $T_{1},..T_{k}$ az aktív + tranzakciók, majd írjuk lemezre a naplót. + + \item Írjuk lemezre azokat a puffereket, amelyek módosított adatbáziselemeket tartalmaznak (piszkos pufferek). Redo naplózással + ellentétben itt minden piszkos puffert lemezre írunk, nem csak a befejezettekét. + + \item Írjunk $\langle END \ CKPT \rangle$ naplóbejegyzést a naplóba és írjuk ki lemezre. + \end{enumerate} + + \subsection*{Konkurenciakezelés} + + A tranzakciók közötti egymásra hatás az adatbázis inkonzisztenssé válását okozhatja, még akkor is, amikor a tranzakciók külön-külön megőrzik a konzisztenciát és rendszerhiba sem történt. Ezért valamiképpen szabályoznunk kell, hogy a különböző tranzakciók egyes + lépései milyen sorrendben következzenek egymás után. \\\\ + A tranzakciós lépések szabályozásának feladatát az adatbázis-kezelő rendszer \emph{\textbf{ütemező}} (scheduler) része végzi. Azt az általános folyamatot, amely biztosítja, hogy a tranzakciók egyidejű végrehajtása során megőrizzék a konzisztenciát, \emph{\textbf{konkurenciavezérlés}}nek nevezzük.\\ + + \noindent Amint a tranzakciók az adatbáziselemek olvasását és írását kérik, ezek a kérések az ütemezőhöz kerülnek, amely legtöbbször közvetlenül végrehajtja azokat. Amennyiben a szükséges adatbáziselem nincs a pufferben, először a pufferkezelőt hívja meg.\\ + Bizonyos esetekben azonban nem biztonságos azonnal végrehajtani a kéréseket. Az ütemezőnek ekkor késleltetnie kell a kérést, sőt bizonyos esetben abortálnia kell a kérést kiadó tranzakciót. \\\\ + Az alapfeltevésünk (helyességi elv), hogy ha minden egyes tranzakciót külön hajtunk végre, akkor azok megőrzik a konzisztens + adatbázis-állapotot. A gyakorlatban viszont a tranzakciók általában konkurensen futnak, ezért a helyességi elv nem + alkalmazható közvetlenül. Így olyan ütemezéseket kell tekintenünk, amelyek biztosítják, hogy ugyanazt az eredményt állítják elő, + mintha a tranzakciókat egymás után, egyesével hajtottuk volna végre. + + \subsubsection*{Ütemezések} + + \noindent Az \emph{\textbf{ütemezés}} egy vagy több tranzakció által végrehajtott műveletek időrendben vett sorozata, amelyben az egy tranzakcióhoz tartozó műveletek sorrendje megegyezik a tranzakcióban megadott sorrenddel. Az ütemezéseknél csak az olvasási és írási műveletekkel foglalkozunk.\\ + + \noindent \textbf{Soros ütemezés}: Egy ütemezés soros, ha bármely $T$ és $T'$ tranzakcióra, ha $T$-nek van olyan művelete, amely + megelőzi $T'$ valamely műveletét, akkor $T$ minden művelete megelőzi $T'$ minden műveletét. A soros ütemezést a tranzakciók + felsorolásával adjuk meg, pl. ($T_{1},T_{2}$).\\ + + \noindent \textbf{Sorbarendezhetőség}: Egy ütemezés sorba rendezhető, ha ugyanolyan hatással van az adatbázis állapotára, + mint valamelyik soros ütemezés, függetlenül az adatbázis kezdeti állapotától.\\ + + \noindent \textbf{Jelölések}: + \begin{itemize} + \item $w_{i}(x)$ azt jelenti, hogy a $T_{i}$ tranzakció írja az $x$ adatbáziselemet. + \item $r_{i}(x)$ azt jelenti, hogy a $T_{i}$ tranzakció olvassa az $x$ adatbáziselemet. + \end{itemize} +\newpage + \noindent \textbf{Konfliktus}: Konfliktus akkor van, ha van olyan egymást követő műveletpár az ütemezésben, amelynek ha a sorrendjét felcseréljük, akkor legalább az egyik tranzakció viselkedése megváltozik. Tegyük fel, hogy $T_{i}$ és $T_{j}$ különböző tranzakciók.\\ + Ekkor nincs konfliktus, ha a pár: + \begin{itemize} + \item $r_{i}(X)$ és $r_{j}(Y)$, még akkor sem, ha $X = Y$. Azaz két különböző tranzakció által végrehajtott olvasási művelet + sosem áll konfliktusban egymással, még akkor sem, ha ugyanarra az adatbázis-elemre vonatkoznak. + + \item $r_{i}(X)$ és $w_{j}(Y)$, ha $X \not = Y$ + + \item $w_{i}(X)$ és $r_{j}(Y)$, ha $X \not = Y$ + + \item $w_{i}(X)$ és $w_{j}(Y)$, ha $X \not = Y$ + \end{itemize} + + \noindent Konfliktus van, ha: + \begin{itemize} + \item Ugyanannak a tranzakciónak bármely két művelete konfliktusban van, hiszen ezek nem cserélhetők fel. + \item Ugyanazt az adatbáziselemet két különböző tranzakció éri el, és ezek közül legalább az egyik írási művelet. + \end{itemize} + + \noindent \textbf{Konfliktusekvivalens ütemezések}: Két ütemezés konfliktusekvivalens, ha szomszédos műveletek nem konfliktusos + cseréjével egymásba vihetők.\\ + + \noindent \textbf{Konfliktus-sorbarendezhető ütemezések}: Egy ütemezés konfliktus-sorbarendezhető, ha konfliktusekvivalens valamely + soros ütemezéssel. A konfliktus-sorbarendezhetőség elégséges, de nem szükséges feltétele a sorbarendezhetőségnek. Piaci rendszerekben + a konfliktus-sorbarendezhetőséget ellenőrzik.\\ + + \noindent \textbf{Megelőzési gráf}: Adott a $T_{1}$ és $T_{2}$ tranzakcióknak, esetleg további tranzakcióknak is, egy $S$ ütemezése. + $T_{1}$ megelőzi $T_{2}$-t S-ben, ha van a $T_{1}$-ben olyan $A_{1}$ művelet és $T_{2}$-ben olyan $A_{2}$ művelet, melyekre: + \begin{enumerate} + \item $A_{1}$ megelőzi $A_{2}$-t $S$-ben, + \item $A_{1}$ és $A_{2}$ ugyanarra az adatbáziselemre vonatkoznak, és + \item legalább az egyik írási művelet + \end{enumerate} + Ezek pont azok a feltételek, amikor $A_{1}$ és $A_{2}$ konfliktusban vannak, nem cserélhetők fel. Ezeket a megelőzéseket megelőzési + gráffal szemléltethetjük. A megelőzési gráf csomópontjai S-beli tranzakciók. Ha a tranzakciókat $T_{i}$-vel jelöljük, legyen $i$ + a $T_{i}$-hez tartozó csomópont a gráfban. Az $i$ csomópontból $j$ csomópontba megy irányított él, ha $T_{i}$ megelőzi $T_{j}$-t.\\ + + \noindent \textbf{Megelőzési gráf és a konfliktus-sorbarendezhetőség kapcsolata}: Egy $S$ ütemezés konfliktus-sorbarendezhető + akkor és csak akkor, ha megelőzési gráfja körmentes. Ekkor a megelőzési gráf csúcsainak bármely topologikus rendezése megad + egy konfliktus-ekvivalens soros ütemezést. + + \section*{Zárak} + + Zárak használatával is elérhető a konfliktus-sorbarendezhetőség. Ha az ütemező zárakat használ, akkor a tranzakcióknak zárakat + kell kérniük és feloldaniuk az adatbáziselemek olvasásán és írásán felül. A zárak használatának két értelemben is helyesnek kell + lennie: + + \begin{itemize} + \item Tranzakciók konzisztenciája: A műveletek és a zárak az alábbi elvárások szerint kapcsolódnak egymáshoz: + \begin{enumerate} + \item A tranzakció csak akkor olvashat vagy írhat egy elemet, ha már korábban zárolta azt, és még nem oldotta + fel a zárat. + + \item Ha egy tranzakció zárol egy elemet, akkor azt később fel kell szabadítania. + \end{enumerate} + + \item Az ütemezések jogszerűsége: A zárak értelme feleljen meg a szándék szerinti elvárásnak: nem zárolhatja két tranzakció + ugyanazt az elemet, csak úgy, ha az egyik előbb már feloldotta a zárat. + \end{itemize} + + \iffalse + \noindent \textbf{Jelölések}: + \begin{itemize} + \item $l_{i}(x)$: A $T_{i}$ tranzakció zárat kér az $x$ adatbáziselemre. + \item $u_{i}(x)$: A $T_{i}$ tranzakció az $x$ adatbáziselem zárolását feloldja. + \end{itemize} + \fi + + \noindent \textbf{Zárolási ütemező}: A zárolási ütemező feladata, hogy akkor és csak akkor engedélyezze a kéréseket, ha + az jogszerű ütemezést eredményez. Ebben segít a zártábla, amely minden adatbáziselemhez megadja azt a tranzakciót, feltéve, hogy + van ilyen, amelyik éppen zárolja az adott elemet.\\ + + \noindent \textbf{Kétfázisú zárolás}: Kétfázisú zárolásról (2FZ) beszélünk, ha minden tranzakcióban minden zárolási művelet + megelőz minden feloldási műveletet. Azok a tranzakciók, amelyek eleget tesznek 2FZ-nek, 2FZ tranzakcióknak nevezzük. Konzisztens, + 2FZ tranzakciók jogszerű ütemezése konfliktus-sorbarendezhető.\\ + + \begin{center} + $T_{i} = …… l_{i}(A) ……… u_{i}(A) ……$ \\ + $ \ \ \ \quad \ \ \rightarrow \ \ \ \nexists l_{j}(X) \ \ \ \leftarrow $ + \end{center} + + \noindent \textbf{Holtpont}: Holtpontról beszélünk, ha az ütemező arra kényszerít egy tranzakciót, hogy örökké várjon egy olyan zárra, amelyet egy másik tranzakció tart zárolva. Tipikus példa holtpont kialakulására, ha 2 tranzakció egymás által zárolt elemeket akar zárolni.\\ + A kétfázisú zárolás nem tudja megakadályozni holtpontok kialakulását.\\ + + \noindent A felismerésben segít a zárkérések sorozatához tartozó \emph{\textbf{várakozási gráf}}: csúcsai a tranzakciók és akkor van él $T_i$-ből $T_j$-be, ha $T_i$ vár egy olyan zár elengedésére, amit $T_j$ tart éppen. A várakozási gráf változik az ütemezés során, ahogy újabb zárkérések érkeznek vagy zárelengedések történnek, vagy az ütemező abortáltat egy tranzakciót. + + \begin{figure}[H] + \centering + \includegraphics[width=0.4\linewidth]{img/deadlock} + \caption{Példa holtpontra: $l_{1}(A); l_{2}(B); l_{3}(C); l_{1}(B); l_{2}(C); l_{3}(A)$} + \label{fig:deadlock} + \end{figure} + + \subsection*{Különböző zármódú zárolási rendszerek} + + \textbf{Probléma:} A $T$ tranzakciónak akkor is zárolnia kell az $X$ adatbáziselemet, ha csak olvasni akarja $X$-et, írni nem. + \begin{itemize} + \item Ha nem zárolnánk, akkor esetleg egy másik tranzakció azalatt írna $X$-be új értéket, mialatt $T$ aktív, ami nem sorba rendezhető viselkedést okoz. + \item Másrészről pedig miért is ne olvashatná több tranzakció egyidejűleg $X$ értékét mindaddig, amíg egyiknek sincs engedélyezve, hogy írja. + \end{itemize} + + \subsubsection*{Osztott és kizárólagos zárak} + Mivel ugyanannak az adatbáziselemnek két olvasási művelete nem eredményez konfliktust, így ahhoz, hogy az olvasási műveleteket egy bizonyos sorrendbe soroljuk, nincs szükség zárolásra. \\ + Viszont szükséges azt az elemet is zárolni, amelyet olvasunk, mert ennek az elemnek az írását nem szabad közben megengednünk.\\ + Az íráshoz szükséges zár viszont "erősebb", mint az olvasáshoz szükséges zár, mivel ennek mind az olvasásokat, mind az írásokat meg kell akadályoznia. \\\\ + A legelterjedtebb zárolási séma két különböző zárat alkalmaz: az \emph{\textbf{osztott zár}}akat vagy olvasási zárakat, és a \emph{\textbf{kizárólagos zár}}akat vagy írási zárakat. \\\\ + Tetszőleges $X$ adatbáziselemet vagy egyszer lehet zárolni kizárólagosan, vagy akárhányszor lehet zárolni osztottan, ha még nincs kizárólagosan zárolva. \\ + Amikor írni akarjuk $X$-et, akkor $X$-en kizárólagos zárral kell rendelkeznünk, de ha csak olvasni akarjuk, akkor $X$-en akár osztott, akár kizárólagos zár megfelelő. \\\\ + Feltételezzük, hogy ha olvasni akarjuk $X$-et, de írni nem, akkor előnyben részesítjük az osztott zárolást. + + \begin{enumerate} + \item Tranzakciók konzisztenciája: Nem írhatunk kizárólagos zár fenntartása nélkül, és nem olvashatunk valamilyen zár fenntartása nélkül.\\ + Minden zárolást követnie kell egy ugyanannak az elemnek a zárolását feloldó műveletnek. + \item Tranzakciók kétfázisú zárolása: A zárolásoknak meg kell előzniük a zárak feloldását. + \item Az ütemezések jogszerűsége: Egy elemet vagy egyetlen tranzakció zárol kizárólagosan, vagy több is zárolhatja osztottan, de a kettőegyszerre nem lehet. + \end{enumerate} + + \paragraph*{Kompatibilitási mátrix} + + A kompatibilitási mátrix minden egyes zármódhoz rendelkezik egy sorral és egy oszloppal.\\ + + \noindent A sorok egy másik tranzakció által az $X$ elemre már érvényes záraknak felelnek meg, az oszlopok pedig az $X$-re kért zármódoknak felelnek meg. \\ + + \noindent A kompatiblitási mátrix használatának szabálya: Egy $A$ adatbáziselemre $C(=S \vee X)$ módú zárat akkor és csak akkor engedélyezhetünk, ha a táblázat minden olyan $R$ sorára, amelyre más tranzakció már zárolta $A$-t $R$ módban, a $C$ oszlopban ,,$\emph{Igen}$" szerepel. + + \begin{figure}[H] + \centering + \includegraphics[width=0.40\linewidth]{img/kompmatrix} + \caption{Az osztott ($S$) és kizárólagos ($X$) zárak kompatibilitási mátrixa.} + \label{fig:kompmatrix} + \end{figure} + + \paragraph*{Kompatibilitási mátrixok használata} + \begin{enumerate} + \item A mátrix alapján dönti el az ütemező, hogy egy ütemezés/zárkérés legális-e, illetve ez alapján várakoztatja a tranzakciókat. Minél több az ,,\emph{Igen}" a mátrixban, annál kevesebb lesz a várakoztatás. + \item A mátrix alapján keletkező várakozásokhoz elkészített várakozási gráf segítségével az ütemező kezeli a holtpontot. + \item A mátrix alapján készíti el az ütemező a megelőzési gráfot egy zárkérés-sorozathoz: + \begin{itemize} + \item a megelőzési gráf csúcsai trakzakciók és akkor van és $T_i$-ből $T_j$-be, ha van olyan $A$ adategység, amelyre az ütemezés során $Z_k$ zárat kért és kapott $T_i$, ezt engedte, majd + \item ezután $A$-ra legközelebb $T_j$ kért és kapott olyan $Z_{s}$ zárat, hogy a mátrixban a $Z_k$ sor $Z_{s}$ oszlopában ,,\emph{Nem}" áll.\\ + Vagyis olyankor lesz él, ha a két zár nem kompatibilis egymással; nem mindegy a két művelet sorrendje\\ + \begin{center} + $\ldots T_i:Z_k(A) \ldots T_i:UZ_k(A) \ldots T_j:Z_s(A)$\\ + $\uparrow \quad \text{ nem kompatibilis } \qquad \uparrow$ + \end{center} + \end{itemize} + \end{enumerate} + + \noindent A sorbarendezhetőséget a megelőzési gráf segítségével lehet eldönteni.\\ + + \noindent \textbf{T:} Egy csak zárkéréseket és zárelengedéseket tartalmazó jogszerű ütemezés sorbarendezhető akkor és csak akkor, ha a kompatibilitási mátrix alapján felrajzolt megelőzési gráf nem tartalmaz irányított kört. +\end{document} \ No newline at end of file diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/PTI BSc ZV tetelek 2015.pdf b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/PTI BSc ZV tetelek 2015.pdf new file mode 100644 index 0000000..7168d30 Binary files /dev/null and b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/PTI BSc ZV tetelek 2015.pdf differ diff --git a/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/README.md b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/README.md new file mode 100644 index 0000000..0e40620 --- /dev/null +++ b/Régebbi záróvizsga kidolgozások/2015 (Prahár László)/README.md @@ -0,0 +1,42 @@ +# Forrás: [https://gitlab.com/laszlo.prahar/zv_kidolgozasok_2020](https://gitlab.com/laszlo.prahar/zv_kidolgozasok_2020) + +# ELTE IK - Bsc Záróvizsga 2018- + +Ebben a projektben a 2018. évi új tételsort megelőző záróvizsga tételsor került átdolgozásra. + +Az eredeti tétel-kidolgozások elérhetők a következő címen: [ELTE IK ZV kidolgozás 2015](https://gitlab.com/dobreffandras/ZV_kidolgozas) + +Az eredeti tételeket készítették: + +**Ancsin Ádám**, **Bálint Márton**, **Dobreff András**, és **Fekete Dóra** + +Az itt elkészített kidolgozásokhoz különböző helyekről válogattam az anyagokat. Mivel a forrásmegjelölés hiányzik az átláthatóság megőrzése végett, így a kidolgozások **jelenlegi formájukban** máshol *nem publikálhatók*, és *nem használtók fel*, azonban itt vagy más verziókezelő platformon továbbfejlesztés, egyszerűsítés természetesen megengedett amennyiben a fork a README-ben visszamutat ide. + +A felhasznált anyagok a teljesség igénye nélkül a következő helyekről származnak: + +- [Gregorics Tibor weboldala (ELTE)](https://people.inf.elte.hu/gt) +- [Tichler Krisztián weboldala (ELTE)](http://web.cs.elte.hu/~tichlerk/logika/) +- [Laki Sándor weboldala (ELTE)](http://lakis.web.elte.hu/teaching.html) +- [Hideg András weboldala (ELTE)](https://people.inf.elte.hu/hiaiaat/matek/) +- [Dobrádi Anna - Rendezési algoritmusok áttekintése (Szakdolgozat, ELTE)](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2017/dobradi_anna.pdf) +- [dr. Szalkai István és Mikó Teréz - Matematikai analízis I.](https://math.uni-pannon.hu/~szalkai/Anal-Tk1B-d-180125.pdf) +- [Mezei István, Faragó István, Simon Péter - Bevezetés az analízisbe (ELTE)](https://simonp.web.elte.hu/files/jegyzet1.pdf) +- [Vass Lajos - Hatványsorok és alkalmazásaik](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2011/vass_lajos.pdf) +- [Heizlerné Bakonyi Viktória, Horváth László, Illés Zoltán, Nagy Tibor, Lutár Patrícia - Számítógépes alapismeretek II.](https://regi.tankonyvtar.hu/hu/tartalom/tamop412A/2010-0011_szamalap2/adatok.html) +- [Tujner Zoltán - Lineáris algebrai egyenletrendszerekiterációs módszereinek konvergenciája (Szakdolgozat, ELTE)](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2016/tujner_zoltan.pdf) +- [Kis Ágnes - Lineáris algebrai egyenletrendszerek iteratívmegoldási módszerei (Szakdolgozat, ELTE)](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2012/kis_agnes.pdf) +- [Támop 412](http://tamop412.elte.hu) +- [Dr. Kovács László - PL/SQL](https://users.iit.uni-miskolc.hu/~kovacs/db2/ora4.html) +- [Puskás Imre - Interpoláció és Weierstrass approximáció (Szakdolgozat, ELTE)](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_alkmat/2012/puskas_imre.pdf) +- [Baloghné Koterla Orsolya - Interpolációs eljárások (Szakdolgozat, ELTE)](https://web.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2017/baloghne_koterla_orsolya.pdf) +- [Sövergjártó András - Numerikus Analízis II.](http://progmat.uw.hu/oktseg/numanal/numanal2/numanal2.pdf) +- [Gazdag Zsolt - Bevezetés a számításelméletbe](https://people.inf.elte.hu/gazdagzs/logika/szelmJegyzet.pdf) +- [Mezei István, Faragó István, Simon Péter - Bevezetés az analízisbe](https://simonp.web.elte.hu/files/jegyzet1.pdf) +- [Szili László - Többváltozós analízis](https://people.inf.elte.hu/mabraai/anal3/Tobbvalt-an_An3_B_C_2013.pdf) +- [Siki Zoltán - Adatbázistervezés és kezelés](http://www.agt.bme.hu/szakm/adatb/db3.htm#p3.5.5) +- [Szentmiklóssy Zoltán - Hatványsorok, Taylor sor](http://web.cs.elte.hu/~szzoltan/bmk/bmk21.html#tpol) +- [Gergó Lajos - Numerikus módszerek, Kidolgozott példák - feladatok] +- Wikipédia +*(kizárólag tartalmilag nagyon hasonló (ellenőrzött forrásokkal összevetett), de a Wikipédián (közérthetőbb) megfogalmazás esetén)* + +**További módosítás már nem várható.**