Wiecej rzeczy

This commit is contained in:
Kacper Donat 2018-02-24 14:39:51 +01:00
parent 3ccab96afa
commit 93e7733cab
15 changed files with 1049 additions and 195 deletions

5
.gitignore vendored
View File

@ -5,3 +5,8 @@
*.log *.log
*.fdb_latexmk *.fdb_latexmk
*.dvi *.dvi
*.idx
*.ilg
*.out
*.ind
*.pgf-*

View File

@ -1,52 +0,0 @@
%! TEX root = main.tex
\section{25.01.2018 kolokwium \#2}
\task Rozważ problem wyznaczania wartości indeksu chromatycznego $n$-wierzchołkowego grafu $G$, czyli $\chi'(G)$.
Uzasadnij prawdziwość lub fałszywość następujących twierdzeń dotyczących tego problemu.
\subtask Istnieje algorytm 1-absolutnie aproksymacyjny o złożoności $O(n)$ \label{task:2018:1}
\subtask Istnieje algorytm $\frac{3}{2}$-względnie aproksymacyjny
\subtask Istnieje algorytm $\frac{4}{3}$-względnie aproksymacyjny
\subtask Istnieje algorytm $\frac{5}{4}$-względnie aproksymacyjny
\subtask Istnieje schemat aproksymacyjny o złożoności niewielomianowej
\subtask Istnieje całkowicie wielomianowy schemat aproksymacyjny
\task Problem istnienia cyklu Hamiltona w grafie $G$ należy do klasy \NP. Udowodnij ten fakt.
\task Wypełnij poniższą tabelę wpisując do niej \textbf{TAK}, \textbf{NIE}, \textbf{NW} (Nie Wiadomo).
\begin{table}[H]
\centering
\begin{tabular}{rl|c|c}
& klasa & Weryfikowalne & Rozwiązywalne \\\hline
\subtask & \P & & \\
\subtask & \NP & & \\
\subtask & \NPC & & \\
\subtask & \NP-trudne & & \\
\end{tabular}
\end{table}
\note{W niektórych wypadkach więcej niż jedna odpowiedź jest poprawna}
\task Algorytm \textit{Largest First} (\problem{LF}) dla kolorowania wierzchołków grafu maluje je zachłannie
poczynając od wierzchołka o najwyższym stopniu i kończąc na weierzchołku o najniższym stopniu.
\subtask Oszacuj złożoność obliczeniową algorytmu \problem{LF} jako funnkcję $n$ za pomocą symbolu $\Theta$
\subtask Udowodnij, że \problem{LF} optymalnie koloruje cykle $C_4$ i $C_5$ ale suboptymalnie $C_6$
\subtask Wykonaj algorytm \problem{LF} na załączonym grafie
\subtask Udowodnij, że algorytm \problem{LF} nie jest aproksymacyjny, tj. nie istnieje stałą $c$ taka, że $\mathtt{LF}(G) \leq c \cdot \chi(G)$
\subtask Udowodnij, że \problem{LF} jest $k$-bezwzględnie aproksymacyjny i $l$-wzzględnie aproksymacyjny w odniesieniu
do grafów kubicznych tj. ustal wartości k i l
\task \textit{Kolorowanie Kosztowe} (\problem{KK}) polega na tym, że kolory mają swoje koszty
$c_1 \leq c_2 \leq \ldots \leq c_n$ i za każdym razem, gdy kolorujemy kolejny wierzchołek, przydzielamy mu koszt tego
koloru. Problem polaga na tym, by tak pokolrowoać graf aby sumaryczny koszt kolorowania $\text{skk}(G)$ wszystkich
wierzchołków był jak najmniejszy. Udowodnij, że nawet jeżeli $c_1 = c_2 = \ldots = c_k \leq c_{k+1}$ to problem ten
jest \NP-trudny.
\task Alicja jest częstym klientem sklepu \textit{SuperShop} i uzbierała 5 kuponów rabatowych o różnych wartościach
zniżek. Ma zapisane na liście zakupowej $n$ produktów, które chce dzisiaj kupić oraz ich ceny. Chce pójść dzisiaj do
sklepu bez gotówki i kupić wybrane produkty używajac tylko kuponów. Nie chce natomiast zmarnować żadnego kuponu, czyli
używa tylko tych, których wartość zostanie w pełni wykorzystana. Zastnawia się czy istnieje zestaw produktów i
odpowiednia kombinacja kuponów, by mogła pójść na zakupy i kupić cokolwiek?
\note{Wszystkie kwoty są zaokrąglane do pełnych złotówek}
\subtask Spróbuj ułożyć algorytm wielomianowy, który rozwiązuje ten problem
\subtask Jeśli nie potrafisz, udowodnij jego \NP-zupełność

View File

@ -2,14 +2,12 @@
\def\b{3} \def\b{3}
\def\r{2cm} \def\r{2cm}
\begin{tikzpicture} \foreach \i in {1,...,\a}
\foreach \i in {1,...,\a} \node[draw, small vertex] (a-\i) at (\i*\r, \r) {};
\node[draw, small vertex] (a-\i) at (\i*\r, \r) {};
\foreach \i in {1,...,\b}
\foreach \i in {1,...,\b} \node[draw, small vertex] (b-\i) at (\i*\r, 0) {};
\node[draw, small vertex] (b-\i) at (\i*\r, 0) {};
\foreach \u in {1,...,\a}
\foreach \u in {1,...,\a} \foreach \v in {1,...,\b}
\foreach \v in {1,...,\b} \draw (a-\u) -- (b-\v);
\draw (a-\u) -- (b-\v);
\end{tikzpicture}

View File

@ -1,11 +1,9 @@
\def\n{5} \def\n{5}
\def\radius{2cm} \def\radius{2cm}
\begin{tikzpicture} \foreach \i in {1,...,\n}
\foreach \i in {1,...,\n} \node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {};
\node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {};
\foreach \u in {1,...,\n}
\foreach \u in {1,...,\n} \foreach \v in {\u,...,\n}
\foreach \v in {\u,...,\n} \draw (v\u) -- (v\v);
\draw (v\u) -- (v\v);
\end{tikzpicture}

20
gfx/kol-kk.tex Normal file
View File

@ -0,0 +1,20 @@
% The block diagram code is probably more verbose than necessary
\begin{tikzpicture}[auto, node distance=2cm]
\node[problem] (kol) {\problem{KOL}};
\node[solution, right of=kol] (r-kol) {T/N};
\node[left of=kol] (i-kol) {$G, n$};
\node[problem, below of=kol] (kk) {\problem{KK}};
\node[solution, right of=kk] (r-kk) {T/N};
\node[left of=kk, align=center] (i-kk) {$G, c, c_k, k,$ \\ $c_{k+1}, c_{k+2}, \ldots$};
\draw[->, alpha, left] (i-kol) -- node[right] {$f$} (i-kk);
\draw[->] (kol) -- (r-kol);
\draw[->] (kk) -- (r-kk);
\draw[->] (i-kol) -- (kol);
\draw[->] (i-kk) -- (kk);
\draw[Implies-Implies, double distance=2pt] (r-kol) -- (r-kk);
\end{tikzpicture}

91
macros.tex Normal file
View File

@ -0,0 +1,91 @@
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
\usetikzlibrary{shapes.geometric, arrows, intersections}
\tikzstyle{problem} = [draw,outer sep=0,inner sep=5,minimum size=10]
\tikzstyle{solution} = [outer sep=0,inner sep=1,minimum size=10]
\tikzstyle{alpha} = [decorate, decoration={snake, amplitude=.5mm}, help lines]
\tikzstyle{max edge} = [very thick, blue]
\tikzstyle{vertex} = [draw, circle, thick]
\tikzstyle{small vertex} = [draw, circle, scale=.75]
\tikzstyle{weight} = [scale=.75, fill=white, draw, circle]
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\newcounter{task}[section]
\newcounter{subtask}[task]
\newcounter{tip}[task]
\newcounter{note}[task]
\let\oldthetask\thetask
\let\oldthesubtask\thesubtask
\renewcommand{\thesection}{\arabic{section}}
\renewcommand{\thesubtask}{\alph{subtask}}
\renewcommand{\thetask}{\thesection.\oldthetask}
\renewcommand{\thetip}{\#\arabic{tip}}
\renewcommand{\thenote}{\#\arabic{note}}
\makeatletter
\newcommand{\note@nostar}[1]{\refstepcounter{note}\par\noindent\textbf{Uwaga \thenote:} #1\par}
\newcommand{\note@star}[1]{\par\noindent\textbf{Uwaga:} #1\par}
\newcommand{\note}{\@ifstar\note@star\note@nostar}
\newcommand{\tip@nostar}[1]{\refstepcounter{tip}\par\noindent\textit{Wskazówka \thetip:} #1\par}
\newcommand{\tip@star}[1]{\par\noindent\textit{Wskazówka:} #1\par}
\newcommand{\tip}{\@ifstar\tip@star\tip@nostar}
\renewcommand{\Function}[2]{%
\csname ALG@cmd@\ALG@L @Function\endcsname{#1}{#2}%
\def\jayden@currentfunction{\proc{#1}}%
}
\newcommand{\funclabel}[1]{%
\@bsphack
\protected@write\@auxout{}{%
\string\newlabel{#1}{{\jayden@currentfunction}{\thepage}}%
}%
\@esphack
}
\newcommand{\kadet@solution}{\par\vspace{.5cm}\noindent\textbf{Proponowane rozwiązanie:}\par}
\newenvironment{solution}{\kadet@solution}{\taskend}
\makeatother
\newcommand{\proc}[1]{{\textsc{#1}}}
\newcommand{\NP}{\texttt{NP}\xspace}
\newcommand{\NPC}{\texttt{NPC}\xspace}
\newcommand{\NPI}{\texttt{NPI}\xspace}
\renewcommand{\P}{\texttt{P}\xspace}
\newcommand{\problem}[1]{{\tt #1}\index{#1}}
\newcommand{\taskend}{\par\vspace{.1cm}\hfill$\square$\vspace{.4cm}\par}
\newcommand{\task}{%
\vspace{.25cm}\refstepcounter{task}\par%
\addcontentsline{toc}{subsection}{Zadanie \arabic{task}}%
\noindent\texttt{Zadanie \thetask.\hspace{.1cm}}%
}
\newcommand{\subtask}[1][]{\refstepcounter{subtask}\par\noindent\hspace{.3cm}\thesubtask#1)\ }
\newcommand{\alphareduction}[2]{#1\ $\alpha$\ #2}
\newenvironment{shortcut}
{\vspace{\baselineskip}\hbox{\textbf{Na skróty:}}\nointerlineskip\kern3pt\noindent\hrulefill\par\vspace{.5\baselineskip}}
{\par\noindent\hrulefill\par\vspace{.5\baselineskip}}
\newenvironment{column}[1]{\noindent\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}}
\floatname{algorithm}{Program}
\floatstyle{plain}
\newfloat{program}{thp}{lop}
\floatname{program}{Program}
\renewcommand\leq\leqslant
\renewcommand\geq\geqslant

188
main.tex
View File

@ -1,4 +1,4 @@
\documentclass[]{article} \documentclass[openany]{book}
\usepackage[T1]{fontenc} \usepackage[T1]{fontenc}
\usepackage{polski} \usepackage{polski}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
@ -25,83 +25,127 @@
\usepackage[polish]{babel} \usepackage[polish]{babel}
\usepackage{braket} \usepackage{braket}
\usepackage{subcaption} \usepackage{subcaption}
\usepackage{imakeidx}
\DeclarePairedDelimiter\ceil{\lceil}{\rceil} %\usepackage{showidx}
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor} %\usepackage[bookmarks]{hyperref}
\usepackage{pgfplots}
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning} \makeindex
\usetikzlibrary{shapes.geometric, arrows}
\tikzstyle{problem} = [draw,outer sep=0,inner sep=5,minimum size=10]
\tikzstyle{solution} = [outer sep=0,inner sep=1,minimum size=10]
\tikzstyle{alpha} = [decorate, decoration={snake, amplitude=.5mm}, help lines]
\tikzstyle{max edge} = [very thick, blue]
\tikzstyle{vertex} = [draw, circle, thick]
\tikzstyle{small vertex} = [draw, circle, scale=.75]
\tikzstyle{weight} = [scale=.75, fill=white, draw]
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\renewcommand\leq\leqslant
\renewcommand\geq\geqslant
% opening % opening
\title{PAA - Kolokwia, rozwiązania} \title{Podstawy Analizy Algorytmów dla opornych}
\author{Kacper Donat} \author{Kacper Donat}
\newcounter{task}[section] \input{macros.tex}
\newcounter{subtask}[task]
\newcounter{tip}[task]
\newcounter{note}[task]
\let\oldthetask\thetask
\let\oldthesubtask\thesubtask
\renewcommand{\thesubtask}{\alph{subtask}}
\renewcommand{\thetask}{\thesection.\oldthetask}
\renewcommand{\thetip}{\#\arabic{tip}}
\renewcommand{\thenote}{\#\arabic{note}}
\makeatletter
\newcommand{\note@nostar}[1]{\refstepcounter{note}\par\noindent\textbf{Uwaga \thenote:} #1\par}
\newcommand{\note@star}[1]{\par\noindent\textbf{Uwaga:} #1\par}
\newcommand{\note}{\@ifstar\note@star\note@nostar}
\newcommand{\tip@nostar}[1]{\refstepcounter{tip}\par\noindent\textit{Wskazówka \thetip:} #1\par}
\newcommand{\tip@star}[1]{\par\noindent\textit{Wskazówka:} #1\par}
\newcommand{\tip}{\@ifstar\tip@star\tip@nostar}
\makeatother
\newcommand{\NP}{\texttt{NP}\xspace}
\newcommand{\NPC}{\texttt{NPC}\xspace}
\newcommand{\NPI}{\texttt{NPI}\xspace}
\renewcommand{\P}{\texttt{P}\xspace}
\newcommand{\problem}[1]{{\tt #1}}
\newcommand{\taskend}{\par\vspace{.1cm}\hfill$\square$\vspace{.4cm}\par}
\newcommand{\task}{\vspace{.25cm}\refstepcounter{task} \noindent\par\texttt{Zadanie \thetask.\hspace{.25cm}}}
\newcommand{\subtask}[1][]{\refstepcounter{subtask}\par\noindent\hspace{.3cm}\thesubtask#1)\ }
\newcommand{\solution}{\par\vspace{.5cm}\noindent\textbf{Proponowane rozwiązanie:}\par}
\newcommand{\alphareduction}[2]{#1\ $\alpha$\ #2}
\newenvironment{shortcut}
{\vspace{\baselineskip}\hbox{\textbf{Na skróty:}}\nointerlineskip\kern3pt\noindent\hrulefill\par\vspace{.5\baselineskip}}
{\par\noindent\hrulefill\par\vspace{.5\baselineskip}}
\newenvironment{column}[1]{\noindent\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}}
\floatname{algorithm}{Program}
% \setlength{\parskip}{.5em}
\begin{document} \begin{document}
%\maketitle
%\tableofcontents
\input{2013.01.26.tex} \chapter{Złożoności obliczeniowe}
\input{2011.01.18.tex} \input{part-1/intro.tex}
\input{2018.bonus.tex} \input{part-1/2018.tex}
\input{2018.01.25.tex}
\chapter{Problemy w informatyce}
\input{part-2/intro.tex}
\input{part-2/2013.tex}
\input{part-2/2011.tex}
\input{part-2/2018.tex}
\input{part-2/2018.bonus.tex}
\appendix
\input{npc.tex}
\twocolumn
\chapter{Przydatne wzory i twierdzenia}
\section{Sumy wyrażeń} \label{appendix:sum-formulas}
\begin{equation}\label{eqn:sum:1}
1 + 1 + 1 + \cdots = \sum_{i=1}^n 1 = n
\end{equation}
\begin{equation}\label{eqn:sum:i}
1 + 2 + 3 + \cdots = \sum_{i=1}^n i = \frac{n(n+1)}{2}
\end{equation}
\begin{equation}\label{eqn:sum:i2}
1 + 4 + 9 + \cdots = \sum_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6}
\end{equation}
\begin{equation}\label{eqn:sum:i3}
1 + 8 + 27 + \cdots = \sum_{i=1}^n i^3 = \left(\frac{n(n+1)}{2}\right)^2
\end{equation}
\begin{equation}\label{eqn:sum:newton}
\sum_{i=0}^n {n \choose k} = 2^n
\end{equation}
\begin{equation}\label{eqn:sum:lower-bound}
\sum_{j=i}^{n} a_j = \sum_{j=1}^n a_j - \sum_{j=1}^{i-1} a_j
\end{equation}
np. dla sumy stałych:
\begin{align}
\sum_{j=i}^{n} 1 &= \sum_{j=1}^n 1 - \sum_{j=1}^{i-1} 1 = n - (i - 1) \nonumber \\
&= n - i + 1
\end{align}
\section{Wzory rekurencyjne}
\subsection{Dziel i zwyciężaj}
Dla funkcji postaci
\begin{equation*}
T(n) = aT\left(\frac{n}{b}\right) + d(n)
\end{equation*}
\noindent gdzie $d(n)$ jest funkcją multiplikatywną (tj. $d(a\cdot b) = d(a)\cdot d(b)$), wiadomo, że
\begin{equation} \label{eqn:recursive:divide}
T(n) = \begin{cases}
\Theta(n^{\log_b d(b)}) & d(b) > a \\
\Theta(n^{\log_b a}\log n) & a = d(b) \\
\Theta(n^{\log_b a}) & a > d(b) \\
\end{cases}
\end{equation}
\subsection{Jeden krok w tył}
Dla funkcji postaci
\begin{equation*}
T(n) = aT(n - 1) + d(n)
\end{equation*}
\noindent wiadomo, że:
\begin{equation} \label{eqn:recursive:1-step}
T(n) = \begin{cases}
\Theta(a^n) & d(n) = O(\frac{a^n}{n^\varepsilon}), \varepsilon > 1 \\
O(na^n) & d(n) = O(a^n) \\
O(nd(n)) & d(n) = \omega(a^n) \\
\end{cases}
\end{equation}
\section{Twierdzenia i własności}
\begin{description}
\item[tw. Vizinga] Każdy graf można pokolorować krawędziowo $\Delta$ bądź $\Delta + 1$ kolorami. Tj.
$\chi'(G) = \Delta$ lub $\chi'(G) = \Delta + 1$. \label{theorem:vizing}
\item[tw. Kuratowskiego] Graf $G$ jest planarny wtedy i tylko wtedy kiedy nie ma w nim podgrafu $K_5$ i $K_3,3$.
\begin{figure}[H]
\centering
\begin{subfigure}[c]{.5\linewidth}
\centering
\begin{tikzpicture}[scale=.7]
\input{gfx/k5.tex}
\end{tikzpicture}
\caption{$K_5$}
\end{subfigure}%
\begin{subfigure}[c]{.5\linewidth}
\centering
\begin{tikzpicture}[scale=.7]
\input{gfx/k3-3.tex}
\end{tikzpicture}
\caption{$K_{3,3}$}
\end{subfigure}%
\end{figure}
\label{theorem:kuratowski}
\item[tw. O 4 kolorach] Każdy graf planarny można pokolorować wierzchołkowo za pomocą $\leq 4$ kolorów. \label{theorem:4-colors}
\item[lemat o uściskach dłoni] Suma stopni wierzchołków w grafie zawsze jest liczbą parzystą. \label{theorem:handshake}
\item[Graf Eulerowski] Graf jest Eulerowski wtedy i tylko wtedy gdy wszystkie wierzchołki są stopnia parzystego. \label{theorem:euler}
\item[tw. Brooksa] Jeżeli graf jest pełny bądź jest cyklem nieparzystym to $\chi(G) = \Delta + 1$, w innym wypadku
$\chi(G) \leq \Delta$ \label{theorem:brooks}
\item Dla każdego grafu $G$ zachodzi $\chi(G) \leq \omega(G)$ gdzie $\omega(G)$ oznacza największą klikę w grafie.
\item Każdy graf dwudzielny da się pokolorować dwoma kolorami. Dodatkowo - każde drzewo jest grafem dwudzielnym.
\end{description}
\end{document} \end{document}

16
npc.tex Normal file
View File

@ -0,0 +1,16 @@
\chapter{Lista problemów \NPC}
\begin{table}[H]
\centering
\renewcommand{\arraystretch}{1.4}
\begin{tabularx}{\linewidth}{p{3cm}clX}
\textbf{Nazwa} & & \textbf{Parametry} & \textbf{Opis} \\ \hline
\textit{Podziału Zbioru} & \problem{PZ} & $A$ & Czy zbiór $A$ da się podzielić na dwa rozłączne podzbiory tak, żeby suma ich elementów była równa? \\
\textit{Sumy Podzbioru} & \problem{SP} & $A$, $n \in \mathbb N$ & Czy w zbiorze $A$ istnieje podzbiór, którego elementy sumują się do $n$? \\
\textit{Kliki} & \problem{KLIKA} & $G$ - graf, $n \in \mathbb N$ & Czy w grafie $G$ znajduje się klika (podgraf pełny) $K_n$? \\
\textit{Zbioru Niezależnego} & \problem{ZN} & $G$ - graf, $n \in \mathbb N$ & Czy w grafie $G$ znajduje się zbiór niezależny wielkości $n$? \\
\textit{Ścieżki Hamiltona} & \problem{SH} & $G$ - graf & Czy w grafie $G$ istnieje ścieżka Hamiltona? \\
\textit{Cyklu Hamiltona} & \problem{CH} & $G$ - graf & Czy w grafie $G$ istnieje cykl Hamiltona? \\
\textit{Kolorowania Wierzchołkowego} & \problem{KOL} & $G$ - graf, $n$ & Czy graf $G$ da się pokolorować wierzchołkowo za pomocą $n$ kolorów? \\
\textit{Kolorowania Krawędziowego} & \problem{KOLW} & $G$ - graf, $n$ & Czy graf $G$ da się pokolorować krawędziowo za pomocą $n$ kolorów? \\
\end{tabularx}
\end{table}

384
part-1/2018.tex Normal file
View File

@ -0,0 +1,384 @@
%! TEX root = ../main.tex
\section{Zerówka 2018}
\task Dla programu poniżej:
\begin{algorithm}[H]
\caption{Program do przanalizowania}
\begin{algorithmic}[1]
\For{$i = 1 \ldots n^2$} \label{prog:1-2018:to-n2}
\For{$j = i \ldots n$} \label{prog:1-2018:to-n}
\State $k \gets 1$
\While{$k < n$}
\State $k \gets k + k$ \label{prog:1-2018:1-basic}
\EndWhile
\EndFor
\EndFor
\end{algorithmic}
\end{algorithm}
\noindent Wybierz najlepsze możliwe oszacowanie liczby kroków spośród:
\vspace{.3cm}
$n^4$ \quad $n^3 \log_2 n$ \quad $n^3$ \quad $n^2 \log_2 n$ \quad $n^2 \log_2 \sqrt n$ \quad $n^2$
\vspace{.2cm}
\begin{solution}
Bez dokładnego przeanalizowania programu łatwo zauważyć, że mamy dwie pętle, jedną ograniczoną przez $n^2$ w linii
\ref{prog:1-2018:to-n2}, oraz jedną ograniczoną przez $n$ w linii \ref{prog:1-2018:to-n}. $n^3$ jednak nie jest
poprawną odpowiedzią, zauważmy że w linii \ref{prog:1-2018:to-n} iteracja zaczyna się od $i$ a nie od $1$. Zatem
jeżeli $i > n$ to pętla w ogóle się nie wykona. Musimy zatem rozbić analizę programu na dwa osobne przedziały:
\begin{column}{.5}
\begin{equation} \label{eqn:1-2018:1-n}
i = 1 \ldots n
\end{equation}
\end{column}
\begin{column}{.5}
\begin{equation} \label{eqn:1-2018:n-n2}
i = n \ldots n^2
\end{equation}
\end{column}
Jak zauważyliśmy, w przedziale $n \ldots n^2$ pętla z linii \ref{prog:1-2018:to-n} w ogóle się nie wykona. Zatem
za operację podstawową przyjmiemy iterację najbardziej zewnętrznej pętli. Pętla ta wykona się $n^2 - n$ razy.
\begin{equation}\label{eqn:1-2018:1:T1}
T_1 = n^2 - n
\end{equation}
W przypadku \ref{eqn:1-2018:1-n}, jako operację podstawową musimy przyjąć jednak najbardziej wewnętrzną operację,
czyli linię \ref{prog:1-2018:1-basic}. Ponieważ $k \gets k+k$ jest tym samym co $k \gets 2k$ to wiemy, że z
każdą iteracją pętli \textbf{while} k rośnie wykładniczo.
\begin{equation*}
k = 1,\ 2,\ 4,\ 8,\ 16,\ 32,\ \ldots
\end{equation*}
Zakładając, że $l$ to liczba wykonań pętli możemy zapisać:
\begin{equation}
k = 2^l
\end{equation}
Czyli warunek $k < n$ przestanie być spełnionym gdy
\begin{equation*}
2^l \geq n \iff l \geq \log_2 n
\end{equation*}
Skąd możemy wywnioskować, że maksymalna liczba wykonań pętli wynosi
\begin{equation}
l_{\text{max}} = \log_2 n
\end{equation}
Zgodnie z tym, co ustaliliśmy we wprowadzeniu, czas w którym ten program będzie się wykonywał możemy zaprezentować
w formie sumy takiej jak poniżej:
\begin{align*}
T_2 &= \sum_{i=1}^n \sum_{j=i}^n \sum_{k=1}^{\log_2 n} 1 = \sum_{i=1}^n \sum_{j=i}^n \log_2 n
= (\log_2 n)\sum_{i=1}^n \sum_{j=i}^n 1 \\
&= (\log_2 n)\sum_{i=1}^n (n - i + 1) = (\log_2 n)\cdot\left(\sum_{i=1}^n n - \sum_{i=1}^n i + \sum_{i=1}^n 1\right) \\
&= (\log_2 n)\cdot\left(n^2 - \frac{n(n+1)}{2} + n\right) = (\log_2 n)\cdot\left(n^2 - \frac{1}{2}n^2 - \frac{1}{2}n + n\right) \\
&= (\log_2 n)\cdot\left(\frac{1}{2}n^2 -\frac{1}{2}n\right) = \frac{1}{2}n^2\log_2n + \frac{1}{2}n^2\log_2n \\
\end{align*}
ponieważ $a\log_c b = \log_c b^a$ uzyskujemy
\begin{equation}\label{eqn:1-2018:1:T2}
T_2 = n^2\log_2 \sqrt n + n\log_2 \sqrt n
\end{equation}
Łącząc czas $T_2$ z \refeq{eqn:1-2018:1:T2} czasem $T_1$ z \refeq{eqn:1-2018:1:T1}, uzyskujemy łącznie:
\begin{equation}
T = T_1 + T_2 = n^2\log_2 \sqrt n + n^2 + n\log_2 \sqrt n - n
\end{equation}
Ponieważ szacujemy czas, interesuje nas głównie składnik najbardziej rzutujący na czas - w typ wypadku jest to
$n^2\log_2\sqrt n$.
\end{solution}
\task Graf kubiczny (tj. $3$-regularny) $G$ zapisano w postaci macierzy sąsiedztwa wierzchołków. Napisz program, który
zwraca liczbę diamentów (tj. $K_4 - e$) w grafie $G$, uzasadnij jego poprawność oraz złożoność obliczeniową.
\tip{Czy $G$ może mieć 2 sklejone ze sobą diamenty?}
\begin{solution}
Zadanie definiuje diament jako $K_4 - e$ - graf pełny o 4 wierzchołkach, pozbawiony jednej krawędzi. spróbujmy
jakoś scharakteryzować ten graf.
\begin{figure}[H]
\centering
\begin{tikzpicture}
\foreach \pos[count=\i] in{(0,1),(1,0),(0,-1),(-1,0)} \node[vertex] (\i) at \pos {\i};
\foreach \u/\v in {1/2,1/3,1/4,2/3,4/3} \draw[thick] (\v) edge (\u);
\end{tikzpicture}
\caption{diament}
\end{figure}
Graf ten posiada 4 wierzchołki, z czego 2 stopnia conajmniej 3 (połączone z pozostałymi, wchodzącymi w skład
diamentu) - na rysunku wyżej są to wierzchołki 1 i 3, a 2 stopnia conajmniej 2 - oba połączone z tymi stopnia
conajmniej 3 - na rysunku są to wierzchołki 4 oraz 2.
Możemy też zauważyć, że z wierzchołka 1 do 3 można dojść 3 ścieżkami, jedną o długości 1, oraz dwiema długosci 2
(poprzez wierzchołki 4 i 2).
Dla grafu przedstawionego w formie macierzy sąsiedztwa $A$, $n$-ta potęgę macierzy $A$ możemy interpretowac jako
liczbę ścieżek długości $n$ między danymi wierzchołkami - z uwagi na powyższe, ten fakt będzie nam bardzo pomocny.
Macierz można podnieść do potęgi wykorzystując szybki algorytm mnożenia macierzy, działający w czasie
$O(n^{2.374})$, mając taką macierz wystarczy tylko przejść po wszystkich wierzchołkach i sprawdzić czy do dowolnego
sąsiada jesteśmy w stanie znaleźć dokładnie jedną ścieżkę długości 1 i 2 ścieżki długości 2.
W takim rozważaniu musimy jednak uwzględnić, że każdy z diamentów zostanie policzony dokładnie 2 razy, ponieważ
policzymy zarówno wierzchołki $1$ jak i $3$. Wynik uzyskany z procedury musimy z tego powodu podzielić przez 2.
\begin{algorithm}[H]
\caption{algorytm rozwiązujący problem}
\begin{algorithmic}[1]
\State $A_2 \gets A^2$ \Comment{$O(2.374)$}
\State $c \gets 0$
\ForAll{$v \in V(G)$} \Comment{$\Theta(n)$}
\ForAll{$u$ sąsiadujący z $v$} \Comment{$\Theta(n)$}
\If{$A_2[v, u] \geq 2 \land A[v, u] = 1$} \Comment{$\Theta(1)$}
\State $c \gets c + 1$ \Comment{$\Theta(1)$}
\EndIf
\EndFor
\EndFor
\State \Return $\frac{1}{2}c$
\end{algorithmic}
\end{algorithm}
Złożoność pętli to zatem $\Theta(n^2)$, jednak ponieważ czas potrzebny na podniesienie macierzy do potęgi ma
złożoność $O(n^{2.374})$, to podniesienie do potęgi ma większy narzut czasowy niż pętla, zatem złożoność naszej
procedury ostatecznie jest równa złożoności podnoszenia macierzy do kwadratu.
\end{solution}
\task Problem znajdowania drogi długości $k$ w nieobciążonym grafie $n$-wierzchołkowym ma następujące algorytmy.
\begin{itemize}
\item Monien (1989)
\item Alon i in. (1994)
\item Kneis i in. (2006)
\item Koutis (2008)
\item Williams (2009)
\item Bj\"orklund (2010)
\item Bj\"orklund i in. (2010)
\end{itemize}
Przypisz im odpowiednie złożoności spośród: $O(4^kn^{O(1)})$, $O(k!n^{O(1)})$, $O(1.66^kn^{O(1)})$, $O((2e)^kn^{O(1)})$, $O((2^k)n^{O(1)})$, $O(2^{\frac{3k}{2}}n^{O(1)})$, $O(1.66^nn^{O(1)})$
\begin{solution}
Na całe szczęście zadanie nie wymaga od nas pamiętania kiedy jaki algorytm powstał - ciężko byłoby to nawet znaleźc.
Spokojnie jednak można założyć, że żaden autor nie bedzie chwalił się tym, że napisał gorszy algorytm - wystarczy
zatem posortowac te algorytmy od najwolniejszego do najszybszego.
Szczęśliwie wszystkie podane złożoności są wykładnicze - za wyjątkiem jednej zawierającej $k!$. Wiadomo, że silnia
rośnie szybciej od każdej możliwej funkcji wykłaniczej, zatem pierwszemu algorytmowi przypiszemy złożoność $O(k!n^{O(1)})$
Zastanawiać może jeszcze obecność $n^{O(1)}$ - wyrażenie to w zasadzie oznacza, że mamy doczynienia z jakimś
wielomianem o nieznym największym wykładniku. Wykładnik ten jest jednak stały i niezależny od $n$ - stąd $O(1)$.
Ponieważ wszystkie funkcje mają różne podstawi lub wykładniki to spokojnie możemy pominąć ten kawałek w dalszych
rozważaniach.
Zostało nam więc uszeregować pozostałe funkcje, na ten moment nie są one jednak przedstawione w formie, która
umożliwiłaby łatwe porównanie. Przedstawmy wszystkie złożoności tak, aby w podstawie była jakaś liczba (a
przynajmiej jej przybliżona wartość):
\begin{table}[H]
\centering
\begin{tabular}{ll}
\textbf{złożoność} & \textbf{złożoność znormalizowana} \\\hline
$O(4^k)$ & $O(4^k)$ \\
$O(1.66^k)$ & $O(1.66^k)$ \\
$O((2e)^k)$ & $O(5.44^k)$ \\
$O(2^k)$ & $O(2^k)$ \\
$O(2^\frac{3k}{2})$ & $O(2.83^k)$ \\
$O(1.66^n)$ & $O(1.66^n)$
\end{tabular}
\end{table}
Dla funkcji wykładniczych o różnych podstawach, szybciej rośnie zawsze funkcja o większej podstawie, tzn. mając
przykładowe funkcje
\begin{align}
f(n) = 2^n && g(n) = 3^n
\end{align}
wiemy, że $f = o(g)$, czyli $f$ rośnie zdecydowanie wolniej od $g$. To pozwala uszeregować nam większość złożoności:
$O((2e)^kn^{O(1)}), O(4^kn^{O(1)}), O(2^\frac{3k}{2}n^{O(1)}), O(2^kn^{O(1)})$. Pozostały nam jeszcze dwie:
$O(1.66^nn^{O(1)}), O(1.66^kn^{O(1)})$.
Obie te funkcje mają jednakową podstawę potęgi jednak różne wykładniki: $k$ i $n$, co wiemy o relacji między tymi
dwoma wartościami? W grafie $n$ wierzchołkowym najdłuśza droga będzie miała długość $n$ - i będzie to cykl hamiltona.
Z tego wynika, że
\begin{equation}
k \leq n
\end{equation}
Stąd wniosek, że poprawną kolejnością będzie $O(1.66^nn^{O(1)}), O(1.66^kn^{O(1)})$. Podsumowując:
\begin{table}[H]
\centering
\begin{tabular}{lrl}
\textbf{autor} & \textbf{rok} & \textbf{złożoność} \\\hline
Monien & 1989 & $O(k!n^{O(1)})$ \\
Alon i in. & 1994 & $O((2e)^kn^{O(1)})$ \\
Kneis i in. & 2006 & $O(4^kn^{O(1)})$ \\
Koutis & 2008 & $O(2^\frac{3k}{2}n^{O(1)})$ \\
Williams & 2009 & $O(2^kn^{O(1)})$ \\
Bj\"orklund & 2010 & $O(1.66^nn^{O(1)})$ \\
Bj\"orklund i in. & 2010 & $O(1.66^kn^{O(1)})$ \\
\end{tabular}
\end{table}
\end{solution}
\task W pewnym systemie informacyjnym chcemy mieć bazę danych, która w czasie stałym - $O(1)$ - będzie odpowiadała na
pytania, jaka jest odległość między dwoma węzłamu $u, b \in V$, grafu $G = (V, E)$ gdzie $|V| = n$. Zaprojektuj
taką strukturę danych i oszacuj jako funkcję $n$ jej złożoność pamięciową i złożoność czasową jej budowania.
\tip{Zastosuj algorytm Dijkstry}
\begin{solution}
Potrzebujemy, aby dostęp do danych był w czasie $O(1)$ - czyli wszystkie potrzebne dane musimy już mieć wygenerowane.
Połączenia możemy zapisac w postaci macierzy sąsiedztwa, a macierz sąsiedztwa $n$ wierzchołków zajmuje $\Theta(n^2)$
bajtów.
Jeżeli chodzi o złożoność budowania tej struktury, to korzystamy z podpowiedzi. Musimy przeliczyć odległości między
wszystkimi parami wierzchołków. Jak wiemy, par tych jest $O(n^2)$. Z podpowiedzi wiemy, że powinniśmy zastosować
algorytm Dijkstry, jego złożoność wynosi $O(m\log n)$ - i te informacje trzeba było chyba znaleźć w jakiejś książce.
Algorytm Dijkstry nie tylko wyznacza odległość pomiędzy dwoma wierzchołkami, ale w zasadzie odległości z danego
wierzchołka do wszystkich wierzchołków. Wszystkich wierzchołków jest $n$ i dla każdego musimy wykonać algorytm
dijkstry, co ostatecznie daje nam złożoność $O(nm\log n)$. \textit{Tej odpowiedzi nie jestem pewien.}
\end{solution}
\task Dana jest procedura:
\begin{algorithm}[H]
\caption{Program do zbadania}
\begin{algorithmic}
\Function{zagadka}{$n$} \funclabel{proc:1-2018:zagadka}
\For{$i = 1 \ldots 2n^2$}\EndFor
\Statex
\If{$n \leq 2$}
\State \Return 1
\Else
\State \Return $8 \cdot $\Call{zagadka}{$\floor{\frac{n}{2}}$}$ - $\Call{zagadka}{$\floor{\frac{n}{4}}$}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
\subtask Oszacuj od dołu liczbę kroków wykonanych przez procedurę \ref{proc:1-2018:zagadka}
\subtask Oszacuj od góry liczbę kroków wykonanych przez procedurę \ref{proc:1-2018:zagadka}
\subtask Oszacuj złożoność obliczeniową procedury \ref{proc:1-2018:zagadka}
\subtask Oszacuj od dołu tempo wzrostu funkcji \ref{proc:1-2018:zagadka}
\subtask Oszacuj od góry tempo wzrostu funkcji \ref{proc:1-2018:zagadka}
\subtask Złożoność procedury \ref{proc:1-2018:zagadka} jest: subliniowa, liniowa, kwadratowa, subwykładnicza, wykładnicza, superwykładnicza
\begin{solution}
Liczbę kroków wykonanych przez te funkcję oznaczmy przez $L$. Pamiętając, że każde wywołanie funkcji kosztuje czas
możemy ułożyć równanie wyrażające liczbę kroków.
\begin{equation}
L(n) = \begin{cases}
n^2 & \text{dla } n \leq 2 \\
L\left(\floor*{\frac{n}{2}}\right) + L\left(\floor*{\frac{n}{4}}\right) + n^2 & \text{dla } n > 2
\end{cases}
\end{equation}
Ponieważ funkcję rozważamy generalnie dla dużych $n$ to możemy spokojnie pominąć pierwszy przypadek i skupić się
tylko na tym pierwszym. Dla tego typu funkcji nie mamy żadnego twierdzenia pozwalajacego oszacowac ją dokładnie.
Musimy zatem oszacować ją z góry i z dołu. Aby tego dokonac, zauważmy, że liczba kroków na ogół jest funkcją rosnącą
względem argumentu - ciężko wyobrazić sobie algorytm, który dla mniejszej ilości danych musiałby wykonywac mniej
operacji.
Zatem dla każdego $a > b$ zachodzi $L(a) > L(b)$. Bez wątpienia, $\frac{n}{2} > \frac{n}{4}$, co za tym idzie
\begin{equation}
L\left(\floor*{\frac{n}{2}}\right) > L\left(\floor*{\frac{n}{4}}\right)
\end{equation}
Zatem jeżeli zastąpimy $L(\floor{\frac{n}{4}})$ przez $L(\floor{\frac{n}{2}})$ na pewno uzyskamy większą wartość.
\begin{equation}
L(n) = L\left(\floor*{\frac{n}{2}}\right) + L\left(\floor*{\frac{n}{4}}\right) + n^2 < 2L\left(\floor*{\frac{n}{2}}\right) + n^2
\end{equation}
Tego typu funkcję jesteśmy już w stanie oszacować zgodnie z zależnością dla funkcji typu ,,dziel i zwyciężaj'':
\begin{equation*}
T(n) = aT\left(\floor*{\frac{n}{b}}\right) + d(n)
\end{equation*}
\begin{equation}\label{eqn:1:divide-and-conquer}
T(n) = \begin{cases}
\Theta(n^{\log_b d(b)}) & d(b) > a \\
\Theta(n^{\log_b a}\log n) & a = d(b) \\
\Theta(n^{\log_b a}) & a > d(b) \\
\end{cases}
\end{equation}
W tym wypadku $a = 2$, $b = 2$, $d(n) = n^2, d(b) = 4$ czyli przypadek 1, złożoność wynosi $\Theta(n^{\log_2 4}) = \Theta(n^2)$.
Jednak pamiętajmy, że w tym wypadku rozpatrywaliśmy ograniczenie górne, zatem nasza pierwotna funkcja jest
asymptotycznie ograniczona z góry, a złożoność to ostatecznie $O(n^2)$.
Szacując od dołu musimy znaleźć jakąś funkcję, która zawsze będzie mniejsza. Ponieważ mamy same dodawania liczb
dodatnich to wystarczy, że pozbędziemy się jednego - preferowalnie tego mniejszego - składnika, w tym wypadku
w ogóle opuścimy rozważanie $L(\floor*{\frac{n}{4}})$.
\begin{equation}
L(n) = L\left(\floor*{\frac{n}{2}}\right) + L\left(\floor*{\frac{n}{4}}\right) + n^2 > L\left(\floor*{\frac{n}{2}}\right) + n^2\
\end{equation}
W tym wypadku stosując analogiczne rozumowanie do ograniczenia z góry otrzymamy ograniczenie dolne $\Omega(n^2)$.
Ponieważ liczba jest jednocześnie $O(n^2)$ oraz $\Omega(n^2)$ to możemy powiedziec, że jest to $\Theta(n^2)$.
W złożoności obliczeniowej uwzględniamy wzrost względem rozmiaru danych, a nie konkretnych danych. W wypadku liczb
rozmiarem danych jest liczba bitów potrzebna do zapisania liczby. Przykładowo dla rozmiaru $n = 5$, maksymalna liczba
która odpowiada temu rozmiarowi to $2^5 = 32$. Licząc złożoność takich procedur za każde $n$ podstawiamy $2^n$,
czyli złożoność procedury to $\Theta((2^n)^2)$ czyli $\Theta(4^n)$.
Wartości zwracane przez funkcję można opisac za pomocą poniższego równania:
\begin{equation}
\proc{zagadka}(n) = \begin{cases}
1 & \text{dla } n \leq 2 \\
8\cdot\proc{zagadka}(\floor*{\frac{n}{2}}) - \proc{zagadka}(\floor*{\frac{n}{4}}) & \text{dla } n > 2
\end{cases}
\end{equation}
Policzmy kilka kolejnych wartości funkcji, aby wiedzieć z czym mniej wiecej mamy doczynienia:
\begin{table}[H]
\centering
\begin{tabular}{l|rrrrrrrrrr}
$n$ & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\\hline
$\proc{zagadka}(n)$ & 1 & 1 & 7 & 7 & 55 & 55 & 55 & 55 & 433 & 433 \\
\end{tabular}
\end{table}
Jak widać funkcja ta jest funkcją rosnącą, zatem możemy wynioskować że dla $a > b$ zachodzi
$\proc{zagadka}(a) \geq \proc{zagadka}(b)$. Aby ograniczyć funkcję z góry, pozbędziemy się
mniejszego z czynników doodawaniu: $\proc{zagadka}(\floor*{\frac{n}{4}})$:
\begin{equation}
8\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right)
\geq 8\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right) - \proc{zagadka}\left(\floor*{\frac{n}{4}}\right)
\end{equation}
Taką postać jesteśmy w stanie łatwo oszacować z zależności dziel i rządź: $a = 8$ $b = 2$ $d(n) = 0$. Ostatecznie
uzyskujemy, że $\proc{zagadka}(n) = O(n^{\log_2}{8}) = O(n^3)$. Szacując z góry, zamieniamy mniejszy czynnik na
większy zatem $\proc{zagadka}(\floor*{\frac{n}{4}})$ zamieniamy na $\proc{zagadka}(\floor*{\frac{n}{2}})$, uzyskując:
\begin{equation*}
8\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right) - \proc{zagadka}\left(\floor*{\frac{n}{2}}\right) = 7\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right)
\end{equation*}
\begin{equation}
7\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right)
\leq 8\cdot\proc{zagadka}\left(\floor*{\frac{n}{2}}\right) - \proc{zagadka}\left(\floor*{\frac{n}{4}}\right)
\end{equation}
Szacując analogicznie otrzymamy ograniczenie z dołu $\Omega(n^{\log_2 7})$.
\end{solution}
\task Procedura szybkiego sortowania tablicy wywoływana jako \ref{proc:1-2018:quicksort}, zdefiniowana jest następująco:
\begin{algorithm}[H]
\caption{Definicja funkcji \ref{proc:1-2018:quicksort}}
\begin{algorithmic}
\Function{QuickSort}{$l, r$}\funclabel{proc:1-2018:quicksort}
\If{$l < r$}
\State $i \gets~$\Call{PodzielTablicę}{$l, r$}\Comment{kosztem $\leq n$ operacji podziel fragmenty tablicy}
\State \Call{QuickSort}{$l, i-1$} \Comment{posortuj lewą część}
\State \Call{QuickSort}{$i, r$} \Comment{posortuj prawą część}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
\subtask Rozważ optymistyczną liczbę kroków, tj. gdy za każdym razem wybieramy medianę sortowanego fragmentu tablicy.
Ułóż odpowiednie równanie rekurencyjne, a następnie podaj jego rozwiązanie asymptotyczne.
\subtask Rozważ pesymistyczną liczbę kroków, tj. gdy za każdym razem wybieramy element najmniejszy w sortowanym
fragmencie tablicy. Ułóż odpowiednie równanie rekurencyjne, a następnie podaj jego rozwiązanie asymptotyczne.

146
part-1/intro.tex Normal file
View File

@ -0,0 +1,146 @@
%! TEX root = ../main.tex
\section{Wprowadzenie}
Tworząc oprogramowanie jednym z aspektów, na które powinniśmy zwrócić szczególną uwagę jest wydajność - zarówno czasowa,
jak i pamięciowa. Wydajność czasową rozumiemy oczywiscie przez czas, w którym wykonuje się nasz program, a przez
pamięciową ilość pamięci operacyjnej, którą potrzebuje program do działania.
Wydajność czasowa nie może być rozumiana jako ilość sekund potrzebna do wykonania danego programu. Absolutny wymiar czasu
- podany w sekundach - jest zależny od wielu czynników, w tym szybkości komputera czy zajętości jego zasobów. Dlatego
w celu badania wydajnosci czasowej programu najczęściej rozpatrujemy liczbę operacji jaką musi wykonać program dla
pewnych danych. Dlatego w dalszej mówiąc o czasie będziemy się skupiać na liczbie takich kroków.
\subsection{Przedstawienie liczby operacji w formie sumy}
Załóżmy, że mamy pętlę:
\begin{algorithmic}[1]
\For{$i = 1 \ldots n$}
\State \Call{$f$}{$i$}
\EndFor
\end{algorithmic}
Wiemy, że czas działania (rozumiany jako liczba operacji) funkcji $f$ możemy wyznaczyć za pomocą funkcji $T_f(n)$ (ta
konwencja oznaczania będzie utrzymana przez dalsze rozdziały). Pętla wywołuję funkcję $f$ dla każdego $i$ od 1 do $n$,
zatem czas działania funkcji możemy przedstawić następująco:
\begin{equation}
T = T_f(1) + T_f(2) + T_f(3) + \cdots + T_f(n) = \sum_{i = 1}^{n} T_f(i) \label{eq:1-intro:loop-to-sum}
\end{equation}
Weźmy inny program:
\begin{algorithmic}[1]
\For{$i = 1; i < n; i \gets 2i$}
\State \Call{$f$}{$i$}
\EndFor
\end{algorithmic}
W tym wypadku, kolejne wartości $i$ będą kolejnymi potęgami 2, zatem czas jaki przeznaczymy na wykonanie tej pętli
zapiszemy jako:
\begin{equation*}
T = T_f(1) + T_f(2) + T_f(4) + T_f(8) + \cdots
\end{equation*}
Na pierwszy rzut oka ciężko zamienić ten program na matematyczną sumę. Jak jednak zostało zauważone, kolejne wartości
$i$ są kolejnymi potęgami 2. Załóżmy zatem, że $l$ jest licznikiem wykonań pętli, tj. reprezentuje ilość już wykonanych
iteracji. W takim wypadku moglibyśmy powiedzieć, że:
\begin{equation*}
i = 2^l
\end{equation*}
czyli warunek $i < n$ byłby spełniony wtedy i tylko wtedy, gdy:
\begin{equation*}
2^l < n \iff l < \log_2 n
\end{equation*}
Ponieważ $l$ z założenia jest licznikiem pętli - to wiemy, że pętla wykona się nie więcej niż $\log_2 n$ razy.
Łącząc te 2 informacje uzyskamy taki wzór na czas:
\begin{equation*}
T = T_f(1) + T_f(2^1) + T_f(2^2) + T_f(2^3) + \cdots = \sum_{i=0}^{\log_2 n} T_f(2^i)
\end{equation*}
Oczywiście nic nie stoi na przeszkodzie, aby rozważać pętle w pętlach:
\begin{program}[H]
\begin{algorithmic}[1]
\For{$i = 1\ldots n$}
\For{$j = 1\ldots n$}
\State \Call{$f$}{$i, j$}
\EndFor
\EndFor
\end{algorithmic}
\end{program}
Zgodnie z wcześniejszymi ustaleniami wewnętrzna pętla wykona sie przez czas $T_w = \sum_{j = 1}^n T_f(i, j)$.
Zewnętrzną rozpatrzymy analogicznie, uzyskując:
\begin{equation}
T = \sum_{i=1}^n T_w = \sum_{i=1}^n \sum_{j = 1}^n T_f(i, j)
\end{equation}
Załóżmy, że mamy program który sumuje nam wszystkie liczby od 1 do $n$, program prezentuje się następująco:
\begin{program}[H]
\begin{algorithmic}[1]
\Require
\Statex $n$ - liczba naturalna \label{line:1-intro:n}
\Statex
\State $S \gets 0$ \Comment{$S \gets 0$ oznacza, że do zmiennej $S$ przypisujemy wartość $0$} \label{line:1-intro:S}
\For{$i = 1 \ldots n$}
\State $S \gets S + i$ \label{line:1-intro:loop}
\EndFor
\end{algorithmic}
\end{program}
Linia \ref{line:1-intro:S} to jedna operacja przypisania, wykonująca się w czasie $T_\gets$, a w pętli wykonujemy
operacje przpisania i dodania o łącznym czasie $T_\gets + T_+$. Ponieważ w komputerach operujemy zwykle na liczbach
o stałym rozmiarze to możemy założyć, że oba te czasy są niezależne od zmiennej $i$. Zgodnie z równaniem
\ref{eq:1-intro:loop-to-sum} możemy zapisac, że łączny czas wykonania tego programu wynosi
\begin{equation*}
T = T_\gets + \sum_{i = 1}^{n}(T_\gets + T_+)
\end{equation*}
Ponieważ $T_\gets + T_+$ jest stałe (tj. nie zależy od zmiennej $i$) to możemy wyciągnąć to wyrażenie przed znak sumy:
\begin{equation*}
T = T_\gets + (T_\gets + T_+)\sum_{i = 1}^{n} 1
\end{equation*}
A ponieważ $\sum_{i = 1}^n 1 = n$ (patrz \ref{eqn:sum:1} z strony \pageref{appendix:sum-formulas}), to
całe równanie możemy sprowadzić do:
\begin{equation}
T = T_\gets + (T_\gets + T_+)n = (n+1)T_\gets + nT_+
\end{equation}
Program wykona zatem $n+1$ operacji przypisania i $n$ operacji dodawania.
\subsection{Asymptotyczne tempo wzrostu - notacja dużego $O$}
Jak widac po powyższych przykładach, nawet dla prostych programów ustalenie dokładnej liczby kroków może być uciążliwe
i czasochłonne. Biorąc pod uwagę, że i tak nie jesteśmy zainteresowani czasem w sekundach często bardziej interesuje
nas ogólny pogląd na zachowanie programu. Wiemy np, że każda (rosnąca) funkcja liniowa rośnie szybciej od funkcji
stałej - gdzie przez ,,rośnie szybciej'' rozumiemy, że od pewnego momentu wykres funkcji liniowej na pewno znajdzie
się nad wykresem funkcji stałej (obie są prostymi, w dodatku nie równoległymi, więc na pewno się przetną) i tak już
pozostanie do końca.
Udowodnijmy, że żadna funkcja liniowa postaci $a_lx + b_l$ nie będzie rosła szybciej niż jakakolwiek funkcja kwadratowa
$a_kx^2 + b_kx + c_k$. Na nasze potrzeby potrzebujemy tylko rozważyć funkcje rosnące - ponieważ czas nie płynie do tyłu,
zatem $a_l, a_k > 0$. Chcąc wyznaczyć, kiedy funkcja liniowa jest większa od kwadratowej musimy rozpatrzyć następującą
nierówność:
\begin{equation}
a_lx + b_l > a_kx^2 b_kx + c_k
\end{equation}
Przenieśmy wszystkie składniki na lewą stronę nierówności:
\begin{equation*}
-a_kx^2 a_lx - b_kx + b_l - c_k > 0
\end{equation*}
\begin{equation*}
-a_kx^2 + (a_l - b_k)x + (b_l - c_k) > 0
\end{equation*}
Ponieważ z założenia $a_k > 0$ to parabola ma ramiona skierowane w dół, czyli od pewnego momentu na pewno znajduje się
poniżej osi \texttt{x}. Zatem nawet przy skrajnie dużej wartości współczynnika $a_l$ (określającego szybkość wzrostu funkcji
liniowej) oraz jednocześnie skrajnie małej wartości współczynnika $a_k$ funkcja liniowa w pewnym momencie znajdzie sie
pod funkcją kwadratową. Czyli nawet najszybsza funkcja liniowa rośnie wolniej od najwolniej rosnącej funkcji kwadratowej.
Jak widać po powyższym, dokładne wartości stałych nie mają w tym wypadku znaczenia. Analogiczny dowód możemy
przeprowadzić dla dowolnej innej funkcji wielomianowej, również o wykładniku niebędącym liczbą całkowitą.
Jeżeli między funkcjami $f$ i $g$ zachodzi taka zależność, to jest - bez względu na mnożnik, funkcja $f$ rośnie wolniej
od $g$ - to mówimy, że $f = o(g)$. Formalnie zależność te definiujemy następująco:
\begin{equation}
\forall_{c > 0}\exists_{n_0}\forall_{n > n_0} f(n) < c \cdot g(n)
\end{equation}

View File

@ -2,14 +2,13 @@
\section{18.01.2011 kolokwium \#2} \section{18.01.2011 kolokwium \#2}
\task{ \task
\textit{Problem Optymalnego Rozkroju} (\problem{POR}) zdefiniowany jest następująco ,,Dany jest arkusz blachy o wymiarach \textit{Problem Optymalnego Rozkroju} (\problem{POR}) zdefiniowany jest następująco ,,Dany jest arkusz blachy o wymiarach
$d \times sz$ oraz różne wielokąty wypukłe, które należy wykroić z tego arkusza. Czy można wybrać podzbiór $d \times sz$ oraz różne wielokąty wypukłe, które należy wykroić z tego arkusza. Czy można wybrać podzbiór
tych wielokątów i tak zaplanowac to wykrajanie aby odpady blachy były zerowe?'' W oparciu o problem \textit{Sumy Podzbioru} (\problem{SP}) tych wielokątów i tak zaplanowac to wykrajanie aby odpady blachy były zerowe?'' W oparciu o problem \textit{Sumy Podzbioru} (\problem{SP})
udowodnij, że $\problem{POR} \in \NPC$ udowodnij, że $\problem{POR} \in \NPC$
}
\solution \begin{solution}
Tak jak w poprzednio, aby udowodnić, że problem należy do klasy \NP, powinniśmy sprawdzić czy jesteśmy w stanie sprawdzić poprawność rozwiązania Tak jak w poprzednio, aby udowodnić, że problem należy do klasy \NP, powinniśmy sprawdzić czy jesteśmy w stanie sprawdzić poprawność rozwiązania
w czasie wielomianowym. Jeżeli za certyfikat przyjmiemy wielokąty w postaciu listy punktów i krawędzi to sprawdzenia można dokonać w czasie wielomianowym. Jeżeli za certyfikat przyjmiemy wielokąty w postaciu listy punktów i krawędzi to sprawdzenia można dokonać
w czasie wielomianowym - wystarczy sprawdzić, że żaden wierzchołek nie znajduje się w żadnym innym wielokącie a suma pól wielokątów w czasie wielomianowym - wystarczy sprawdzić, że żaden wierzchołek nie znajduje się w żadnym innym wielokącie a suma pól wielokątów
@ -45,15 +44,14 @@ rozpatrzymy prostokąty o stałej szerokości równej szerokości blachy, i zmie
Dla uproszeczenia, załóżmy że nasza długość $d = 1$, w takim wypadadku aby przekstałcić zbiór $A$ musimy utworzyć prostokąty o wymiarach $a_1 \times 1$, $a_2 \times 1$, itd. Dla uproszeczenia, załóżmy że nasza długość $d = 1$, w takim wypadadku aby przekstałcić zbiór $A$ musimy utworzyć prostokąty o wymiarach $a_1 \times 1$, $a_2 \times 1$, itd.
Czyli z $\alpha$-redukcji utrzymalibyśmy następujące parametry: $W = \text{wygenerowane prostokąty}$, $sz = n$, $d = 1$. Jak dowiedliśmy powyżej, takie przekształcenie zachowuje problem. Czyli z $\alpha$-redukcji utrzymalibyśmy następujące parametry: $W = \text{wygenerowane prostokąty}$, $sz = n$, $d = 1$. Jak dowiedliśmy powyżej, takie przekształcenie zachowuje problem.
\taskend \end{solution}
\task{ \task
Problem \textit{Ważonego Pokrycia Wierzchołkowego} (\problem{WPW}) zdefiniowany jest następująco: ,,Dany jest graf $G_w$ z obciążonymi Problem \textit{Ważonego Pokrycia Wierzchołkowego} (\problem{WPW}) zdefiniowany jest następująco: ,,Dany jest graf $G_w$ z obciążonymi
wierzchołkami (tj. wierzchołki mają wagi) oraz próg $p$; czy w $G_w$ istnieje pokrycie wierzchołkowe o łącznej wadze $\leq p$. wierzchołkami (tj. wierzchołki mają wagi) oraz próg $p$; czy w $G_w$ istnieje pokrycie wierzchołkowe o łącznej wadze $\leq p$.
Udowodnij, że $\problem{WPW} \in \NPC$ Udowodnij, że $\problem{WPW} \in \NPC$ \label{task:2:wpw}
}
\solution \begin{solution}
Tak jak zwykle, zacznijmy od udowodnienia, że problem w istocie należy do klasy $\NP$. Potrzebujemy więc jakiegoś certyfikatu, który Tak jak zwykle, zacznijmy od udowodnienia, że problem w istocie należy do klasy $\NP$. Potrzebujemy więc jakiegoś certyfikatu, który
mógłby potwierdzić, że odpowiedź na to pytanie jest poprawna - w tym wypadku oczywistym zdaje się być lista wierzchołków $V$ stanowiących to pokrycie. mógłby potwierdzić, że odpowiedź na to pytanie jest poprawna - w tym wypadku oczywistym zdaje się być lista wierzchołków $V$ stanowiących to pokrycie.
Sprawdzenie czy suma ich wag faktycznie jest mniejsza niż $p$ jest do wykonania w czasie liniowym. Aby sprawdzić czy pokrycie faktycznie Sprawdzenie czy suma ich wag faktycznie jest mniejsza niż $p$ jest do wykonania w czasie liniowym. Aby sprawdzić czy pokrycie faktycznie
@ -84,7 +82,6 @@ Problem \problem{WPW} jest w zasadzie uogólnionym problemem \problem{PW}. Na og
\caption{Przykładowy graf ważony $G_W$} \caption{Przykładowy graf ważony $G_W$}
\end{figure} \end{figure}
\end{minipage} \end{minipage}
\\\\
Można powiedzieć, że - w pewnym sensie - w grafie nieważonym wszystkie wierzchołki są równie ważne, a w grafie ważonym niektóre są ważniejsze. Można powiedzieć, że - w pewnym sensie - w grafie nieważonym wszystkie wierzchołki są równie ważne, a w grafie ważonym niektóre są ważniejsze.
Biorąc pod uwagę to podejście aby uzyskać graf ważony z grafu nieważonego o podobnych właściwościach należy wszystkim wierzchołkom nadać te samą Biorąc pod uwagę to podejście aby uzyskać graf ważony z grafu nieważonego o podobnych właściwościach należy wszystkim wierzchołkom nadać te samą
@ -93,7 +90,7 @@ wagę $w$. Przy takim podejściu, jeżeli w grafie $G$ pokrycie stanowiło $n$ w
Przypisania wagi do wierzchołków możemy dokonać w czasie liniowym, wyliczenie $p$ jest w zasadzie darmowe. Ponieważ uzyskaliśmy, że dla tak skonstruowanego Przypisania wagi do wierzchołków możemy dokonać w czasie liniowym, wyliczenie $p$ jest w zasadzie darmowe. Ponieważ uzyskaliśmy, że dla tak skonstruowanego
grafu $p = n$ mamy pewność, że taka $\alpha$-redukcja zachowuje problem. grafu $p = n$ mamy pewność, że taka $\alpha$-redukcja zachowuje problem.
\taskend \end{solution}
\task{Graf planarny jest maksymalny, gdy dodanie jakiejkolwiek krawędzi łączącej niesąsiednie wierzchołki psuje jego \task{Graf planarny jest maksymalny, gdy dodanie jakiejkolwiek krawędzi łączącej niesąsiednie wierzchołki psuje jego
planarność. \textit{Maksymalny Graf Planarny} (\textbf{MGP}) jest 3-barwny wtedy, gdy jest eulerowski.} planarność. \textit{Maksymalny Graf Planarny} (\textbf{MGP}) jest 3-barwny wtedy, gdy jest eulerowski.}
@ -102,7 +99,7 @@ planarność. \textit{Maksymalny Graf Planarny} (\textbf{MGP}) jest 3-barwny wte
\subtask{Przyjmując, że \textbf{MGP} dany jest w postaci macierzy sąsiedztwa wierzchołków, naszkicuj algorytm dla \subtask{Przyjmując, że \textbf{MGP} dany jest w postaci macierzy sąsiedztwa wierzchołków, naszkicuj algorytm dla
wyznaczania jego liczby chromatycznej i oszacuj jego złożonosć przy użyciu symbolu $\Theta$} wyznaczania jego liczby chromatycznej i oszacuj jego złożonosć przy użyciu symbolu $\Theta$}
\solution \begin{solution}
Przypomnijmy - graf planarny to graf, w którym nie istnieją przecinające się krawędzie. Naszym zadaniem jest narysować Przypomnijmy - graf planarny to graf, w którym nie istnieją przecinające się krawędzie. Naszym zadaniem jest narysować
taki graf planarny że ma 5 lub 6 wierzchołków oraz dodanie krawędzi niszczyłoby planarność. Najprostszym podejściem jest taki graf planarny że ma 5 lub 6 wierzchołków oraz dodanie krawędzi niszczyłoby planarność. Najprostszym podejściem jest
narysowanie grafu pustego (tj. wierzchołków tak jakbyśmy chcieli rysować wielokąt foremny) i dorysowywać kolejno: narysowanie grafu pustego (tj. wierzchołków tak jakbyśmy chcieli rysować wielokąt foremny) i dorysowywać kolejno:
@ -135,14 +132,18 @@ jednak są one stosunkowo proste w narysowaniu i wymyśleniu.
\begin{column}{.5}% \begin{column}{.5}%
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{gfx/k3-3.tex} \begin{tikzpicture}
\input{gfx/k3-3.tex}
\end{tikzpicture}
\caption{Graf $K_{3,3}$} \caption{Graf $K_{3,3}$}
\end{figure} \end{figure}
\end{column}% \end{column}%
\begin{column}{.5}% \begin{column}{.5}%
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{gfx/k5.tex} \begin{tikzpicture}
\input{gfx/k5.tex}
\end{tikzpicture}
\caption{Graf $K_{5}$} \caption{Graf $K_{5}$}
\end{figure} \end{figure}
\end{column} \end{column}
@ -198,14 +199,14 @@ $\chi(G_\text{MGP}) \leq 4$. Możemy zatem ułożyc bardzo prosty algorym:
Złożoność $\Theta(n^2)$ wynika z tego, że graf jest zapisany w macierzy sąsiedztwa. Policzenie wszystkich krawędzi Złożoność $\Theta(n^2)$ wynika z tego, że graf jest zapisany w macierzy sąsiedztwa. Policzenie wszystkich krawędzi
wymaga przejścia po wszystkich komórkach w macierzy a tych jest $n^2$. wymaga przejścia po wszystkich komórkach w macierzy a tych jest $n^2$.
\taskend \end{solution}
\task{Problem \textit{Maximum Edge Coloring} $\problem{MEC}(G, k)$ zdefiniowany jest następująco: \task{Problem \textit{Maximum Edge Coloring} $\problem{MEC}(G, k)$ zdefiniowany jest następująco:
,,Dane są: graf $G$ i liczba $k \in \mathbb{N}$; znaleźć spójny podgraf $G' \subset G$ zawierający największą możliwą liczbę krawędzi, który jest k-barwny krawędziowo.''} ,,Dane są: graf $G$ i liczba $k \in \mathbb{N}$; znaleźć spójny podgraf $G' \subset G$ zawierający największą możliwą liczbę krawędzi, który jest k-barwny krawędziowo.''}
\subtask{Podaj rozwiązanie problemu $\problem{MEC}(C_7, 2)$} \subtask{Podaj rozwiązanie problemu $\problem{MEC}(C_7, 2)$}
\subtask{Pokaż, że $\problem{MEC}(G, 2)$} jest \NP-trudny \subtask{Pokaż, że $\problem{MEC}(G, 2)$} jest \NP-trudny
\solution \begin{solution}
Spróbujmy pokolorować krawędziowo graf $C_7$, aby tego dokonać wybierzmy sobie dowolną pierwszą krawędź i pokolorujmy ją Spróbujmy pokolorować krawędziowo graf $C_7$, aby tego dokonać wybierzmy sobie dowolną pierwszą krawędź i pokolorujmy ją
na dany kolor, oznaczmy go \#1. Krawędzi sąsiadujące musimy więc pokolorować na inny kolor - \#2. Przechodzimy do następnej na dany kolor, oznaczmy go \#1. Krawędzi sąsiadujące musimy więc pokolorować na inny kolor - \#2. Przechodzimy do następnej
krawędzi (kierunek dowolny, ważne aby iść cały czas w tym samym), krawędź ta ma kolor \#2, więc następna musi być \#1. krawędzi (kierunek dowolny, ważne aby iść cały czas w tym samym), krawędź ta ma kolor \#2, więc następna musi być \#1.
@ -233,6 +234,7 @@ spójny możemy wywnioskować, że dla problemu $\problem{MEC}(G, 2)$ jedynymi m
Czyli $G'$ jest ścieżką lub cyklem przechodzącymi przez wszystkie wierzchołki - czyli odpowiednio ścieżki hamiltona Czyli $G'$ jest ścieżką lub cyklem przechodzącymi przez wszystkie wierzchołki - czyli odpowiednio ścieżki hamiltona
bądź cyklu hamiltona. Znalezienie zarówno ścieżki jak i cyklu hamiltona jest problemem \NP-trudnym, zatem bądź cyklu hamiltona. Znalezienie zarówno ścieżki jak i cyklu hamiltona jest problemem \NP-trudnym, zatem
$\problem{MEC}(G, 2)$ będący z nim tożsamy też jest \NP-trudny. $\problem{MEC}(G, 2)$ będący z nim tożsamy też jest \NP-trudny.
\end{solution}
\task{Dany jest zbiór $n$ różnych liczb naturalnych $A = \{a_1, ..., a_n\}$. Wiadomo, że problem polegający na \task{Dany jest zbiór $n$ różnych liczb naturalnych $A = \{a_1, ..., a_n\}$. Wiadomo, że problem polegający na
sprawdzeniu ,,czy zbiór $A$ można podzielić na sumę dwóch rozłącznych zbiorów $B$ i $C$ (tzn. takich, że sprawdzeniu ,,czy zbiór $A$ można podzielić na sumę dwóch rozłącznych zbiorów $B$ i $C$ (tzn. takich, że
@ -245,7 +247,7 @@ się wielomianowy przy następujących modyfikacjach?}
\subtask{sumy te muszą się różnić o więcej niż 3} \subtask{sumy te muszą się różnić o więcej niż 3}
\subtask{rozpatrujemy 3 zbiory zamiast 2} \subtask{rozpatrujemy 3 zbiory zamiast 2}
\solution \begin{solution}
Na wstępie oznaczmy nasz problem przez $\Pi$, a kolejne problemy przez $\Pi_a$ itd. Do tego $A_a$ będzie stanowić zbiór Na wstępie oznaczmy nasz problem przez $\Pi$, a kolejne problemy przez $\Pi_a$ itd. Do tego $A_a$ będzie stanowić zbiór
liczb dla modyfikacji a, a $n_a$ wielkość tego zbioru. Problem $\Pi$ to nic innego jak problem podziału zbioru. liczb dla modyfikacji a, a $n_a$ wielkość tego zbioru. Problem $\Pi$ to nic innego jak problem podziału zbioru.
@ -317,7 +319,7 @@ $\problem{TRY} \subseteq \P \subseteq \NP$. Stąd możemy naszkicować graf rela
\input{gfx/ss-redukcje.tex} \input{gfx/ss-redukcje.tex}
\caption{Graf relacji redukcji $\alpha$ między modyfikacjami problemu $\Pi$} \caption{Graf relacji redukcji $\alpha$ między modyfikacjami problemu $\Pi$}
\end{figure} \end{figure}
\taskend \end{solution}
\task{Problem \textit{Maksymalizacji Liczby Zapamiętanych Programów} (\problem{MLZP}) określony jest następująco: \task{Problem \textit{Maksymalizacji Liczby Zapamiętanych Programów} (\problem{MLZP}) określony jest następująco:
,,Dany jest zbiór $n$ programów o długościach $I_1, I_2, ..., I_n$ i 2 dyskietki o pojemności $L$ każda. Znaleźć ,,Dany jest zbiór $n$ programów o długościach $I_1, I_2, ..., I_n$ i 2 dyskietki o pojemności $L$ każda. Znaleźć
@ -328,13 +330,15 @@ w kolejności od najkrótszego do najdłuższego programu. Pokaż, że:}
\subtask {\problem{SF} jest $\frac{4}{3}$-aproksymacyjny} \subtask {\problem{SF} jest $\frac{4}{3}$-aproksymacyjny}
\subtask {dla \problem{MLZP} nie istnieje schemat FPTAS, chyba że $\P = \NP$} \subtask {dla \problem{MLZP} nie istnieje schemat FPTAS, chyba że $\P = \NP$}
\solution \begin{solution}
Problem \problem{MLZP}, zgodnie z tytułem, jest problemem maksymalizacyjnym. Zatem wiemy, że $A_\text{opt} \geq A$, gdzie Problem \problem{MLZP}, zgodnie z tytułem, jest problemem maksymalizacyjnym. Zatem wiemy, że $A_{opt} \geq A$, gdzie
$A_\text{opt}$ to odpowiedź optymalna, a $A$ to odpowiedź naszego algorytmu. Dodatkowo wiemy, że $A, A_\text{opt} \in \mathbb{N}$ $A_{opt}$ to odpowiedź optymalna, a $A$ to odpowiedź naszego algorytmu. Dodatkowo wiemy, że $A, A_{opt} \in \mathbb{N}$
oraz, że algorytm \problem{SF} jest $1$-absolutnie aproksymacyjny czyli: oraz, że algorytm \problem{SF} jest $1$-absolutnie aproksymacyjny czyli:
\begin{equation} \begin{equation}
|A_\text{opt} - A| \leq 1 \overset{\text{maksymalizacyjny}}{\implies} A_\text{opt} - A \leq 1 \implies A \geq A_\text{opt} - 1 |A_\text{opt} - A| \leq 1 \overset{\text{maksymalizacyjny}}{\implies} A_\text{opt} - A \leq 1 \implies A \geq A_\text{opt} - 1
\end{equation} \end{equation}
z tych 2 faktów z tych 2 faktów
wiemy, że A jest zawarta między dwiema kolejnymi liczbami naturalnymi począwszy od $A_\text{opt} - 1$: wiemy, że A jest zawarta między dwiema kolejnymi liczbami naturalnymi począwszy od $A_\text{opt} - 1$:
@ -412,4 +416,4 @@ Czyli jeżeli tylko $\varepsilon < \frac{1}{n}$ to otrzymany wynik będzie wynik
wielomianowym (zgodnie z definicją schamatu (F)PTAS) czyli rozwiązalibyśmy problem \NPC w czasie wielomianowym wielomianowym (zgodnie z definicją schamatu (F)PTAS) czyli rozwiązalibyśmy problem \NPC w czasie wielomianowym
co implikowałoby, że $\P = \NP$. co implikowałoby, że $\P = \NP$.
\taskend \end{solution}

View File

@ -5,7 +5,7 @@
\subtask{Spróbuj zaprojektować algorytm wielomianowy dla tego problemu decyzyjnego} \subtask{Spróbuj zaprojektować algorytm wielomianowy dla tego problemu decyzyjnego}
\subtask{Jeśli nie potrafisz, to spróbuj udowodnić jego \NP-zupełność} \subtask{Jeśli nie potrafisz, to spróbuj udowodnić jego \NP-zupełność}
\solution \begin{solution}
Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może być, że jest to problem zbliżony Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może być, że jest to problem zbliżony
do problemu sumy podzbioru - i jest to prawdą, jest to specyficzny wypadek problemu sumy podzbioru. do problemu sumy podzbioru - i jest to prawdą, jest to specyficzny wypadek problemu sumy podzbioru.
@ -28,16 +28,15 @@ jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mając 5 banknotów
Stąd wynika, że istnieje jedynie skończona ilość kombinacji, którymi możemy utworzyć 100zł. Wystarczy zatem sprawdzić Stąd wynika, że istnieje jedynie skończona ilość kombinacji, którymi możemy utworzyć 100zł. Wystarczy zatem sprawdzić
je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$. je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$.
\taskend \end{solution}
\task{ \task
Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym, Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym,
aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko
wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$ wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$
byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność. byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność.
}
\solution \begin{solution}
Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, w szczególności nie wiemy nic o tym czy jest Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, w szczególności nie wiemy nic o tym czy jest
hamiltonowski czy nie. Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie, hamiltonowski czy nie. Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie,
ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak, ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak,
@ -59,7 +58,7 @@ który nie jest połączony z żadnym innym.
\end{figure} \end{figure}
Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek
nie wystarczy na utworzenie kliki, a nie dodajemy żadnych krawedzi, które mogłyby doprowadzić do tego, że klika nagle powstała. nie wystarczy na utworzenie kliki, a nie dodajemy żadnych krawędzi, które mogłyby doprowadzić do tego, że klika nagle powstała.
Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się
do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy. do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy.
@ -69,14 +68,14 @@ wierzchołek musimy do macierzy dodać 1 wiersz i 1 kolumnę - czyli w zasadzie
utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla
grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie
stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne. stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne.
\taskend \end{solution}
\task{\textit{Ograniczony Problem Kliki} - \problem{OPK} - zdefiniowany jest następująco: ,,Dany jest graf $G$ i liczby \task{\textit{Ograniczony Problem Kliki} - \problem{OPK} - zdefiniowany jest następująco: ,,Dany jest graf $G$ i liczby
naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?''. Pokaż, że:} naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?''. Pokaż, że:}
\subtask{$\problem{OPK} \in \problem{NP}$} \subtask{$\problem{OPK} \in \problem{NP}$}
\subtask{$\problem{OPK} \in \problem{NPC}$} \subtask{$\problem{OPK} \in \problem{NPC}$}
\solution \begin{solution}
Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny
algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający
rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie
@ -107,16 +106,16 @@ Aby dokonać $\alpha$-redukcji musimy w wielomianowym czasie na podstawie danych
rozwiązując problem \problem{OPK} uzyskać odpowiedź na problem kliki. Wiemy, że \problem{OPK} zwróci nam prawdę jeżeli rozwiązując problem \problem{OPK} uzyskać odpowiedź na problem kliki. Wiemy, że \problem{OPK} zwróci nam prawdę jeżeli
w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego
rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby
zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że
takie podstawienie zachowuje problem udowodniliśmy już powyżej. takie podstawienie zachowuje problem udowodniliśmy już powyżej.
\taskend \end{solution}
\task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy: \task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy:
$(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków $(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków
$f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest $f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest
problemem NP-zupełnym.} problemem NP-zupełnym.}
\solution \begin{solution}
Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz
kolejny wykorzystamy tutaj podejście z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego kolejny wykorzystamy tutaj podejście z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego
jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakładamy, że $f = O(1)$. Przetworzenie jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakładamy, że $f = O(1)$. Przetworzenie
@ -158,7 +157,7 @@ $G = K_n, H = G_0$.
Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi
kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, jeżeli istnieje takie kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, jeżeli istnieje takie
przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$. przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$.
\taskend \end{solution}
\task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny \task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny
(tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy (tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy
@ -180,14 +179,15 @@ brzmi ona \textbf{tak} lub \textbf{nie}.}
\tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem \tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem
$G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)} $G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)}
\solution \begin{solution}
Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego
pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku
wiemy, że graf jest 3-regularny czyli dla każdego wierzhołka $v \in G$ wiemy, że jest połączony z 3 innymi wiemy, że graf jest 3-regularny czyli dla każdego wierzchołka $v \in G$ wiemy, że jest połączony z 3 innymi
wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$. wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$.
Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy n Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy
iepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielnosci grafu można osiągnąć za pomocą BFS-a lub DFS-a, czyli w złożoności $O(m+ n)$. niepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielności grafu można osiągnąć za pomocą BFS-a lub DFS-a,
czyli w złożoności $O(m+ n)$.
Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularności oczywistym jest, że Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularności oczywistym jest, że
$\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ $\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ
@ -206,6 +206,7 @@ Zatem podsumowując odpowiedzi:
\item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzielny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$ \item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzielny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$
\item $\chi(X) \geq 4$ - graf potrzebuje 4 kolorów tylko, gdy jest kliką $K_4$ - $O(1)$. \item $\chi(X) \geq 4$ - graf potrzebuje 4 kolorów tylko, gdy jest kliką $K_4$ - $O(1)$.
\end{enumerate} \end{enumerate}
\end{solution}
\task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$, \task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$,
który generuje digraf acykliczny. Problem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.} który generuje digraf acykliczny. Problem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.}
@ -216,7 +217,7 @@ który generuje digraf acykliczny. Problem ten ma prosty algorym 2-aproksymacyjn
\tip{Zakładamy, że digraf $D$ dany jest w postaci macierzy sąsiedztwa $A$} \tip{Zakładamy, że digraf $D$ dany jest w postaci macierzy sąsiedztwa $A$}
\tip{Jaki digraf definiuje górna/dolna macierz trójkątna macierzy $A$?} \tip{Jaki digraf definiuje górna/dolna macierz trójkątna macierzy $A$?}
\solution \begin{solution}
Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu. Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu.
W problemie chodzi o znalezienie największego podgrafu acyklicznego w digrafie $D$. W problemie chodzi o znalezienie największego podgrafu acyklicznego w digrafie $D$.
\begin{figure}[H] \begin{figure}[H]
@ -293,7 +294,7 @@ Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dok
graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek, graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek,
ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz
2 z 1. Jesteśmy w stanie skonstruować jednak taki graf 3 wierzchołkowy, ponieważ wystarczy że będziemy mieli dokładnie 2 z 1. Jesteśmy w stanie skonstruować jednak taki graf 3 wierzchołkowy, ponieważ wystarczy że będziemy mieli dokładnie
jedno połączenie wierzchołka "mniejszego" z "większym" oraz dokładnie jedno "większego" z "mniejszym" przy czym jedynym jedno połączenie wierzchołka ,,mniejszego'' z ,,większym'' oraz dokładnie jedno ,,większego'' z ,,mniejszym'' przy czym jedynym
ograniczeniem jest to, że nie mogą to być te same wierzchołki. ograniczeniem jest to, że nie mogą to być te same wierzchołki.
\begin{figure}[H] \begin{figure}[H]
@ -370,4 +371,4 @@ Jeżeli teraz przedzielimy obie strony nierówności przez $m + 1$ uzyskamy po p
\end{equation*} \end{equation*}
a co za tym idzie wystarczy, że $\varepsilon < \frac{1}{m+1}$ a będziemy w stanie wywnioskować dokładny wynik w czasie wielomianowym, co jest możliwe tylko gdy $\P = \NP$. a co za tym idzie wystarczy, że $\varepsilon < \frac{1}{m+1}$ a będziemy w stanie wywnioskować dokładny wynik w czasie wielomianowym, co jest możliwe tylko gdy $\P = \NP$.
\taskend \end{solution}

View File

@ -7,7 +7,7 @@ w problem $\Pi \in \NP$ przekaż wiadomość, mówiącą, że:}
\subtask{\alphareduction{\problem{3SAT}}{$\Pi$}} \subtask{\alphareduction{\problem{3SAT}}{$\Pi$}}
\subtask{\alphareduction{$\Pi$}{\problem{3SAT}}} \subtask{\alphareduction{$\Pi$}{\problem{3SAT}}}
\solution \begin{solution}
Wiemy, że nasz problem $\Pi \in \NP$ istnieje więc niedeterministyczny algorytm wielomianowy, który jest w stanie Wiemy, że nasz problem $\Pi \in \NP$ istnieje więc niedeterministyczny algorytm wielomianowy, który jest w stanie
go rozwiązać. Mamy pewność, że złożoność dowolnego algorytmu \textbf{deterministycznego} jest $\Omega(2^n)$ czyli go rozwiązać. Mamy pewność, że złożoność dowolnego algorytmu \textbf{deterministycznego} jest $\Omega(2^n)$ czyli
ograniczona przez funkcję wykładniczą z dołu. Ponieważ każda funkcja wykładnicza o podstawie większej niż 1 ograniczona przez funkcję wykładniczą z dołu. Ponieważ każda funkcja wykładnicza o podstawie większej niż 1
@ -44,7 +44,7 @@ wszystkie problemy $\NP$ (zgodnie z definicją klasy \NPC). W takim wypadku lepi
\begin{center} \begin{center}
0 symboli 0 symboli
\end{center} \end{center}
\taskend \end{solution}
\task Podaj status problemów (tj. czy są \P czy \NP-trudne) optymalizacyjnych podanych poniżej w podziałem na ich wersje maksymalizacyjne oraz wersje \task Podaj status problemów (tj. czy są \P czy \NP-trudne) optymalizacyjnych podanych poniżej w podziałem na ich wersje maksymalizacyjne oraz wersje
minimalizacyjne. minimalizacyjne.
@ -55,7 +55,7 @@ minimalizacyjne.
\subtask Największa/najmniejsza droga w grafie \subtask Największa/najmniejsza droga w grafie
\subtask Klika w grafie planarnym \subtask Klika w grafie planarnym
\solution \begin{solution}
Biorąc pod uwagę, że jedynym wymaganiem kolorowania wierzchołków w grafie jest to, żeby 2 sąsiednie wierzchołki nie Biorąc pod uwagę, że jedynym wymaganiem kolorowania wierzchołków w grafie jest to, żeby 2 sąsiednie wierzchołki nie
miały tego samego koloru to wersja maksymalizacyjna problemu jest problemem wielomianowym - wystarczy każdy miały tego samego koloru to wersja maksymalizacyjna problemu jest problemem wielomianowym - wystarczy każdy
wierzchołek pokolorować na inny kolor, co da nam maksymalną możliwą liczbę kolorów. Wersja decyzyjna problemu wierzchołek pokolorować na inny kolor, co da nam maksymalną możliwą liczbę kolorów. Wersja decyzyjna problemu
@ -95,7 +95,7 @@ Stąd też wiemy, że wersja minimalizacyjna jest \P.
\end{tabular} \end{tabular}
\caption{Podsumowanie statusów problemów z zadania} \caption{Podsumowanie statusów problemów z zadania}
\end{table} \end{table}
\taskend \end{solution}
\task Masz dany graf $G$ oraz liczbę $k$. Czy graf $G$ zawiera klikę o rozmiarze $k$? Do pomocy masz czarną skrzynkę. \task Masz dany graf $G$ oraz liczbę $k$. Czy graf $G$ zawiera klikę o rozmiarze $k$? Do pomocy masz czarną skrzynkę.
Możesz do niej włożyć tylko graf $G$ posiadający gwiazdę spinającą oraz liczbę $p$ będącą progiem. Skrzynka odpowie na Możesz do niej włożyć tylko graf $G$ posiadający gwiazdę spinającą oraz liczbę $p$ będącą progiem. Skrzynka odpowie na
@ -103,7 +103,7 @@ pytanie - ,,Czy w danym grafie istnieje klika o rozmiarze $k \geq p$?''. Jeżeli
skrzynka milczy. skrzynka milczy.
\tip{Gwiazda spinająca to inaczej wierzchołek połączony ze wszystkimi innymi wierzchołkami.} \tip{Gwiazda spinająca to inaczej wierzchołek połączony ze wszystkimi innymi wierzchołkami.}
\solution \begin{solution}
Przypomnijmy że klika to graf pełny, czyli inaczej taki graf, w którym każdy wierzchołek jest połączony z każdym innym. Przypomnijmy że klika to graf pełny, czyli inaczej taki graf, w którym każdy wierzchołek jest połączony z każdym innym.
Co za tym idzie, aby zwiększyć klikę o 1 należy dodać nowy wierzchołek, który jest połączony ze wszystkimi innymi Co za tym idzie, aby zwiększyć klikę o 1 należy dodać nowy wierzchołek, który jest połączony ze wszystkimi innymi
już istniejącymi wierzchołkami. już istniejącymi wierzchołkami.
@ -134,14 +134,14 @@ rozmiarze $n$ wystarczy sprawdzić czy w grafie $H$, istnieje klika o rozmiarze
Skrzynka odpowiada nam na pytanie czy w grafie istnieje klika $k \geq p$, jednak pamiętajmy, że zgodnie z powyższym Skrzynka odpowiada nam na pytanie czy w grafie istnieje klika $k \geq p$, jednak pamiętajmy, że zgodnie z powyższym
rozumowaniem mniejsze kliki są podgrafami klik większych, zatem nawet jeżeli skrzynka znajdzie podgraf $K_{10}$ a my rozumowaniem mniejsze kliki są podgrafami klik większych, zatem nawet jeżeli skrzynka znajdzie podgraf $K_{10}$ a my
szukamy ledwo $K_5$ to i tak wiemy, że $K_5$ istnieje w $K_{10}$. szukamy ledwo $K_5$ to i tak wiemy, że $K_5$ istnieje w $K_{10}$.
\taskend \end{solution}
\task Kierownik zmiany ma pod opieką $m = 4$ identycznych obrabiarek i $n$ różnych elementów do obrobienia. Na swoim \task Kierownik zmiany ma pod opieką $m = 4$ identycznych obrabiarek i $n$ różnych elementów do obrobienia. Na swoim
komputerze posiada PTAS o złożoności $O(n\log^{1/\varepsilon} n + m^m)$. Praca zaczyna się o 7:00 a o 15:00 jest mecz, komputerze posiada PTAS o złożoności $O(n\log^{1/\varepsilon} n + m^m)$. Praca zaczyna się o 7:00 a o 15:00 jest mecz,
który chce obejrzeć. Wiemy, że optymalny czas pracy wynosi 6h, jaką złożoność będzie miał algorytm, który pozwoli który chce obejrzeć. Wiemy, że optymalny czas pracy wynosi 6h, jaką złożoność będzie miał algorytm, który pozwoli
kierownikowi obejrzeć mecz? kierownikowi obejrzeć mecz?
\solution \begin{solution}
Problem ten jest problemem minimalizacyjnym oraz wiemy, że $A_\text{opt} = 6$. Aby zdążyć obejrzeć mecz musimy skończyć Problem ten jest problemem minimalizacyjnym oraz wiemy, że $A_\text{opt} = 6$. Aby zdążyć obejrzeć mecz musimy skończyć
pracę o 15:00, zatem wystarczy że algorytm przydzieli pracę tak, aby wszystkie elementy zostały obrobione w czasie pracę o 15:00, zatem wystarczy że algorytm przydzieli pracę tak, aby wszystkie elementy zostały obrobione w czasie
8 godzin skąd $A = 8$. 8 godzin skąd $A = 8$.
@ -163,7 +163,7 @@ Ponieważ znamy zarówno $A$ jak i $A_\text{opt}$ z łatwością możemy wyznacz
W taki sposób otrzymujemy złożoność $O(n\log^3 n + m^m)$, ponieważ $m$ jest stałe możemy pominąć je w obliczaniu W taki sposób otrzymujemy złożoność $O(n\log^3 n + m^m)$, ponieważ $m$ jest stałe możemy pominąć je w obliczaniu
złożoności uzyskując ostatecznie $O(n\log^3 n)$. złożoności uzyskując ostatecznie $O(n\log^3 n)$.
\taskend \end{solution}
\task Na płaszczyźnie znajduje się n punktów, chcemy znelźć ich średnicę, czyli największą odległość pomiędzy dwoma z nich. \task Na płaszczyźnie znajduje się n punktów, chcemy znelźć ich średnicę, czyli największą odległość pomiędzy dwoma z nich.
Następujący algorytm rozwiązuje ten problem w sposób 2-przybliżony. Udowodnij ten fakt. Następujący algorytm rozwiązuje ten problem w sposób 2-przybliżony. Udowodnij ten fakt.
@ -190,7 +190,7 @@ Następujący algorytm rozwiązuje ten problem w sposób 2-przybliżony. Udowodn
\end{figure} \end{figure}
\end{column} \end{column}
\solution \begin{solution}
Aby rozwiązać ten problem najpierw spróbujmy rozważyc jego uporoszczoną wersję - w jednym wymiarze. W tym wypadku Aby rozwiązać ten problem najpierw spróbujmy rozważyc jego uporoszczoną wersję - w jednym wymiarze. W tym wypadku
rozwiązanie problemu zawsze będzie dość proste - średnica będzie między punktem wysuniętym najbardziej na lewo i punktem rozwiązanie problemu zawsze będzie dość proste - średnica będzie między punktem wysuniętym najbardziej na lewo i punktem
najbardziej wysuniętym na prawo. Najprawdopodobniej jednak nasz punkt $1$ będzie znajdował się gdzieś między nimi. najbardziej wysuniętym na prawo. Najprawdopodobniej jednak nasz punkt $1$ będzie znajdował się gdzieś między nimi.
@ -237,7 +237,7 @@ Z poprzednich rozważań wiemy, że w wypadku punktu oznaczonego teraz jako $1'$
2-krotność swojej odpowiedzi. Odległość pomiędzy punktem 1 a jednym z punktów średnicy jest teraz na pewno większa 2-krotność swojej odpowiedzi. Odległość pomiędzy punktem 1 a jednym z punktów średnicy jest teraz na pewno większa
niż w wypadku $1'$ a co za tym idzie odpowiedź będzie bliższa tej poprawnej, czyli najgorszym wypadkiem wciąż pozostaje niż w wypadku $1'$ a co za tym idzie odpowiedź będzie bliższa tej poprawnej, czyli najgorszym wypadkiem wciąż pozostaje
pomyłka o 2-krotność odpowiedzi optymalnej, czyli algorytm jest 2-aproksymacyjny. pomyłka o 2-krotność odpowiedzi optymalnej, czyli algorytm jest 2-aproksymacyjny.
\taskend \end{solution}
\task Które ze zdań o powyższym problemie są prawdziwe? \task Które ze zdań o powyższym problemie są prawdziwe?
@ -249,7 +249,7 @@ pomyłka o 2-krotność odpowiedzi optymalnej, czyli algorytm jest 2-aproksymacy
\subtask Istnieje algorytm wielomianowy, który jest 2-absolutnie aproksymacyjny \subtask Istnieje algorytm wielomianowy, który jest 2-absolutnie aproksymacyjny
\subtask Nie istnieje schemat PTAS \subtask Nie istnieje schemat PTAS
\solution \begin{solution}
Aby znaleźć największą odległość między parami punktów na płaszczyźnie wystarczy sprawdzić wszystkie możliwe pary, Aby znaleźć największą odległość między parami punktów na płaszczyźnie wystarczy sprawdzić wszystkie możliwe pary,
których jest ${n \choose 2} = O(n^2)$, algorytm zatem jest wielomianowy, czyli należy do klasy \P. Co za tym których jest ${n \choose 2} = O(n^2)$, algorytm zatem jest wielomianowy, czyli należy do klasy \P. Co za tym
idzie nie może być problemem \NPC a tym bardziej \NP-trudnym. Warto jednak zaznaczyć, że gdyby pytanie dotyczyło idzie nie może być problemem \NPC a tym bardziej \NP-trudnym. Warto jednak zaznaczyć, że gdyby pytanie dotyczyło
@ -275,3 +275,4 @@ Odpowiedzi zatem klarują się następująco:
Nie istnieje schemat PTAS & \textbf{NIE} \\ Nie istnieje schemat PTAS & \textbf{NIE} \\
\end{tabular} \end{tabular}
\end{table} \end{table}
\end{solution}

194
part-2/2018.tex Normal file
View File

@ -0,0 +1,194 @@
%! TEX root = main.tex
\section{25.01.2018 kolokwium \#2}
\task Rozważ problem wyznaczania wartości indeksu chromatycznego $n$-wierzchołkowego grafu $G$, czyli $\chi'(G)$.
Uzasadnij prawdziwość lub fałszywość następujących twierdzeń dotyczących tego problemu.
\subtask Istnieje algorytm 1-absolutnie aproksymacyjny o złożoności $O(n)$ \label{subtask:1-2018:1:abs}
\subtask Istnieje algorytm $\frac{3}{2}$-względnie aproksymacyjny \label{subtask:1-2018:1:32approx}
\subtask Istnieje algorytm $\frac{4}{3}$-względnie aproksymacyjny \label{subtask:1-2018:1:43approx}
\subtask Istnieje algorytm $\frac{5}{4}$-względnie aproksymacyjny \label{subtask:1-2018:1:54approx}
\subtask Istnieje schemat aproksymacyjny o złożoności niewielomianowej \label{subtask:1-2018:1:nptas}
\subtask Istnieje całkowicie wielomianowy schemat aproksymacyjny \label{subtask:1-2018:1:fptas}
\begin{solution}
W rozwiązaniu tego wykorzystamy twierdzenie vizinga mówiące, że każdy graf da się pokolorować $\Delta$ bądź $\Delta + 1$
kolorami.
Na tej podstawie w podpunkcie \ref{subtask:1-2018:1:abs} możemy ułożyć algorytm, który zawsze zwraca
wartość $\Delta + 1$ i będzie on $1$-absolutnie aproksymacyjny. Jednak pozostaje kwestia złożoności obliczeniowej
wyznaczanie maksymalnego stopnia w grafie jest zadaniem zależnym od struktury danych. I tak w wypadku
macierzy sąsiedztwa będzie to $\Theta(n^2)$ a w wypadku pęków $O(n)$ - czli się da. Dlatego na podpunkt \ref{subtask:1-2018:1:abs}
odpowiedź to \textbf{TAK}.
\begin{table}[H]
\centering
\begin{tabular}{r|r}
$A_\text{opt}$ & $A$ \\\hline
1 & 2 \\
2 & 3 \\
3 & 4 \\
4 & 5 \\
$\vdots$ & $\vdots$
\end{tabular}
\caption{Tabela najgorszych odpowiedzi, jakie udzieli nasz algorytm}
\end{table}
Na ten moment nasz algorytm w najgorszym wypwadku (pierwszym) myli się 2-krotnie. Czy jesteśmy w stanie
scharakteryzowac wszystkie grafy, które da się pokolorowac 1 kolorem tak, abyśmy mogli sprawdzić ten fakt
wielomianowo? Tj. czy sprawdzenie $\chi'(G) = 1$ należy do \P? Tak, pokolorowanie jednym kolorem będzie możliwe
tylko wypadku gdy z każdym wierzchołkiem jest związana tylko jedna krawędź - czyli $\Delta = 1$.
\begin{table}[H]
\centering
\begin{tabular}{r|r}
$A_\text{opt}$ & $A$ \\\hline
1 & $\not 2$ 1 \\
2 & 3 \\
3 & 4 \\
4 & 5 \\
$\vdots$ & $\vdots$
\end{tabular}
\end{table}
Teraz nasz algorytm w najgorszym wypadku dla poprawnej odpowiedzi wynoszącej $2$ zwraca $3$ - czyli jest
$\frac{3}{2}$-aproksymacyjny. Zatem odpowiedź na podpunkt \ref{subtask:1-2018:1:32approx} to \textbf{TAK}.
Idźmy więc dalej, czy jesteśmy w stanie scharakteryzować wszystkie grafy, które da sie pokolorować max 2 koloroami?
Na pewno wiemy, że muszą to być grafy o $\Delta = 2$, jednak nie jest to warunek wystarczajacy.
\begin{figure}[H]
\centering
\begin{tikzpicture}
\foreach \pos[count=\i] in {(1,0),(-1,0),(0,1.73)} \node[vertex] (\i) at \pos {};
\draw[red] (1) -- (2);
\draw[green] (1) -- (3);
\draw[blue] (3) -- (2);
\end{tikzpicture}
\caption{Trójkąt to graf o $\Delta = 2$, jednak potrzebuje 3 kolorów do poprawnego kolorowania krawędziowego}
\end{figure}
Okazuje się, że wszystkie ściezki da się pokolorować krawędziowo dwoma kolorami, oraz wszystkie cykle parzyste.
Zatem jeżeli nasz graf składa się tylko z cykli parzystych oraz ścieżek - da się go pokolorować krawędziowo
dwoma kolorami. Aby sprawdzić ten fakt, wystarczy rozbić graf na składowe spójności co możemy zrobić zwykłym
\proc{DFS}-em lub \proc{BFS}-em a następnie sprawdzić czy są cyklami parzystymi bądź ścieżkami.
\begin{table}[H]
\centering
\begin{tabular}{r|r}
$A_\text{opt}$ & $A$ \\\hline
1 & $\not 2$ 1 \\
2 & $\not 3$ 2 \\
3 & 4 \\
4 & 5 \\
$\vdots$ & $\vdots$
\end{tabular}
\end{table}
Teraz najgorszym przypadkiem jest para 3 i 4, czyli algorytm jest $\frac{4}{3}$-aproksymacyjny. Stąd odpowiedź na
podpunkt \ref{subtask:1-2018:1:43approx} to \textbf{TAK}.
Dla kolorowania 3 kolorami nie ma już możliwosci sprawdzenia wielomianowego - i to jest rzecz, którą albo musimy
wiedzieć, albo wyczytać z książki. Zatem nie jesteśmy w stanie bardziej ulepszyć tej aproksymacji, a co za tym
idzie nie jest on $\frac{5}{4}$ aproksymacyjny, czyli dla \ref{subtask:1-2018:1:54approx} odpowiedź to \textbf{NIE}.
Każdy problem z klasy \NP można rozwiązać algorytmem deterministycznym w czasie niewielomianowym. Jeżeli jestesmy
w stanie rozwiązać problem w czasie niewielomianowym - to na pewno jesteśmy też go w stanie aproksymować, choćby
przez mnożenie dokładnego wyniku przes stałą. Dla podpunktu \ref{subtask:1-2018:1:nptas} odpowiedź to \textbf{TAK}.
Problem ten jest problemem minimalizacyjnym, zatem gdyby istniał FPTAS to bylibysmy w stanie przybliżyć jego
rozwiązanie z dowolną dokładnością:
\begin{equation*}
1 \leq \frac{A_{opt}}{A} \leq 1 + \varepsilon
\end{equation*}
\begin{equation}
A \leq A_{opt} \leq A + A\varepsilon
\end{equation}
Ponieważ odpowiedź na nasz problem jest liczbą całkowitą to wystarczy, że $A\varepsilon < 1$. Z Vizinga wiemy, że
\begin{equation}
A \leq \Delta + 1 \iff \frac{1}{\Delta + 1}A \leq 1
\end{equation}
Czyli jeżeli tylko $\varepsilon < \frac{1}{\Delta + 1}$ to będziemy w stanie wywnioskować odpowiedź dokładną.
Zatem schemat FPTAS może istnieć tylko jeżel $\P = \NP$.
\end{solution}
\task Problem istnienia cyklu Hamiltona w grafie $G$ należy do klasy \NP. Udowodnij ten fakt.
\begin{solution}
Aby udowodnić, że problem jest w \NP należy udowodnić, że istnieje taki certyfikat rozwiązania problemu, że
będziemy w stanie potwierdzić poprawność tego rozwiązania w czasie wielomianowym. W tym wypadku takim certyfikatem
może być lista wierzchołków po których powinnismy przechodzić po kolei. Sprawdzenie czy żaden wierzchołek się nie
powtarza może być wykonane w czasie wielomianowym, tak samo sprawdzenie czy między kazdymi wierzchołkami istnieje
połączenie.
Nie musimy dowodzić tego, że problem ten jest \NPC, więc nie jest tu potrzebna $\alpha$-redukcja.
\end{solution}
\task Wypełnij poniższą tabelę wpisując do niej \textbf{TAK}, \textbf{NIE}, \textbf{NW} (Nie Wiadomo).
\begin{table}[H]
\centering
\begin{tabular}{rl|c|c}
& klasa & Weryfikowalne & Rozwiązywalne \\\hline
\subtask & \P & & \\
\subtask & \NP & & \\
\subtask & \NPC & & \\
\subtask & \NP-trudne & & \\
\end{tabular}
\end{table}
\note{W niektórych wypadkach więcej niż jedna odpowiedź jest poprawna}
\task Algorytm \textit{Largest First} (\problem{LF}) dla kolorowania wierzchołków grafu maluje je zachłannie
poczynając od wierzchołka o najwyższym stopniu i kończąc na weierzchołku o najniższym stopniu.
\subtask Oszacuj złożoność obliczeniową algorytmu \problem{LF} jako funnkcję $n$ za pomocą symbolu $\Theta$
\subtask Udowodnij, że \problem{LF} optymalnie koloruje cykle $C_4$ i $C_5$ ale suboptymalnie $C_6$
\subtask Wykonaj algorytm \problem{LF} na załączonym grafie
\subtask Udowodnij, że algorytm \problem{LF} nie jest aproksymacyjny, tj. nie istnieje stałą $c$ taka, że $\mathtt{LF}(G) \leq c \cdot \chi(G)$
\subtask Udowodnij, że \problem{LF} jest $k$-bezwzględnie aproksymacyjny i $l$-wzzględnie aproksymacyjny w odniesieniu
do grafów kubicznych tj. ustal wartości k i l
\task \textit{Kolorowanie Kosztowe} (\problem{KK}) polega na tym, że kolory mają swoje koszty
$c_1 \leq c_2 \leq \ldots \leq c_n$ i za każdym razem, gdy kolorujemy kolejny wierzchołek, przydzielamy mu koszt tego
koloru. Problem polaga na tym, by tak pokolrowoać graf aby sumaryczny koszt kolorowania $\text{skk}(G)$ wszystkich
wierzchołków był jak najmniejszy. Udowodnij, że nawet jeżeli $c_1 = c_2 = \ldots = c_k \leq c_{k+1}$ to problem ten
jest \NP-trudny.
\begin{solution}
Aby udowodnić, że problem jest \NP-trudny musimy udowodnić, że jego wersja decyzyjna jest \NPC. W wypadku tego
problemu wersja decyzyjna może brzmiec następująco ,,Czy dany graf $G$ da się pokolorować kosztem $c$ zakładajac, że
koszty kolorowań to $c_1, c_2, c_3, ...$, przy czym wiemy, że koszt $k$ pierwszych kolorów to $c_k$?''.
Możemy zauważyć, że zadanie to jest bardzo podobne do zadania \ref{task:2:wpw} ze strony \pageref{task:2:wpw}.
Spróbujmy zredukować więc problem kolorowania wierzchołkowego grafu (\problem{KOL}) do problemu \problem{KK}.
\begin{figure}[H]
\centering
\input{gfx/kol-kk.tex}
\caption{$\alpha$-redukcja z problemu \problem{KOL} do \problem{KK}}
\end{figure}
Zauważmy, że jeżeli wszystkie kolory, którymi kolorujemy graf mają ten sam koszt $1$ to łączny koszt pokolorowania
tego grafu wyniesie $n$ (każdy wierzchołek kosztuje nas $1$, a wierzchołków jest $n$). Jeżeli natomiast jeden z
kolorów miałby koszt większy niż $1$ to z pewnością łączny koszt kolorowania takiego grafu musiałby być również
większy niż $n$.
Wykorzystamy te zależność na swoją korzyść - jeżeli $k$ pierwszych kolorów będzie miało koszt $1$ a pozostałe będą
droższe (załóżmy, że ich koszt to będzie 2) to koszt pokolorowania tego grafu $k$ kolorami wyniesie $n$. Jeżeli
natomiast potrzebujemy więcej niż $k$ kolorów to będziemy musieli wykorzystać kolor o koszcie 2 czyli koszt jaki
poniesiemy będzie na pewno większy niż $n$. Zatem graf da się pokolorować kosztem $n$ tylko kiedy graf da się
pokolorować $k$ kolorami, gdzie koszt każdego koloru wynosi $1$. Nasza $\alpha$-redukcja będzie zatem następująca:
\begin{equation*}
G, k \rightarrow \underset{G}{G}, \underset{c}{n}, \underset{c_k}{1}, \underset{k}{k}, \underset{c_{k+1}}{2}, \underset{c_{k+1}}{2}, \ldots
\end{equation*}
\end{solution}
\task Alicja jest częstym klientem sklepu \textit{SuperShop} i uzbierała 5 kuponów rabatowych o różnych wartościach
zniżek. Ma zapisane na liście zakupowej $n$ produktów, które chce dzisiaj kupić oraz ich ceny. Chce pójść dzisiaj do
sklepu bez gotówki i kupić wybrane produkty używajac tylko kuponów. Nie chce natomiast zmarnować żadnego kuponu, czyli
używa tylko tych, których wartość zostanie w pełni wykorzystana. Zastnawia się czy istnieje zestaw produktów i
odpowiednia kombinacja kuponów, by mogła pójść na zakupy i kupić cokolwiek?
\note{Wszystkie kwoty są zaokrąglane do pełnych złotówek}
\subtask Spróbuj ułożyć algorytm wielomianowy, który rozwiązuje ten problem
\subtask Jeśli nie potrafisz, udowodnij jego \NP-zupełność

4
part-2/intro.tex Normal file
View File

@ -0,0 +1,4 @@
%! TEX root = main.tex
\section{Wstęp}
Podczas pisania programów komputerowych, zwłaszcza wykonujących operacje na dużych zbiorach danych, potrzebujemy
szacowac ich czas wykonania.