Wiecej rzeczy
This commit is contained in:
parent
3ccab96afa
commit
93e7733cab
5
.gitignore
vendored
5
.gitignore
vendored
@ -5,3 +5,8 @@
|
||||
*.log
|
||||
*.fdb_latexmk
|
||||
*.dvi
|
||||
*.idx
|
||||
*.ilg
|
||||
*.out
|
||||
*.ind
|
||||
*.pgf-*
|
||||
|
@ -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ść
|
20
gfx/k3-3.tex
20
gfx/k3-3.tex
@ -2,14 +2,12 @@
|
||||
\def\b{3}
|
||||
\def\r{2cm}
|
||||
|
||||
\begin{tikzpicture}
|
||||
\foreach \i in {1,...,\a}
|
||||
\node[draw, small vertex] (a-\i) at (\i*\r, \r) {};
|
||||
|
||||
\foreach \i in {1,...,\b}
|
||||
\node[draw, small vertex] (b-\i) at (\i*\r, 0) {};
|
||||
|
||||
\foreach \u in {1,...,\a}
|
||||
\foreach \v in {1,...,\b}
|
||||
\draw (a-\u) -- (b-\v);
|
||||
\end{tikzpicture}
|
||||
\foreach \i in {1,...,\a}
|
||||
\node[draw, small vertex] (a-\i) at (\i*\r, \r) {};
|
||||
|
||||
\foreach \i in {1,...,\b}
|
||||
\node[draw, small vertex] (b-\i) at (\i*\r, 0) {};
|
||||
|
||||
\foreach \u in {1,...,\a}
|
||||
\foreach \v in {1,...,\b}
|
||||
\draw (a-\u) -- (b-\v);
|
||||
|
14
gfx/k5.tex
14
gfx/k5.tex
@ -1,11 +1,9 @@
|
||||
\def\n{5}
|
||||
\def\radius{2cm}
|
||||
|
||||
\begin{tikzpicture}
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u in {1,...,\n}
|
||||
\foreach \v in {\u,...,\n}
|
||||
\draw (v\u) -- (v\v);
|
||||
\end{tikzpicture}
|
||||
\foreach \i in {1,...,\n}
|
||||
\node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {};
|
||||
|
||||
\foreach \u in {1,...,\n}
|
||||
\foreach \v in {\u,...,\n}
|
||||
\draw (v\u) -- (v\v);
|
||||
|
20
gfx/kol-kk.tex
Normal file
20
gfx/kol-kk.tex
Normal 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
91
macros.tex
Normal 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
188
main.tex
@ -1,4 +1,4 @@
|
||||
\documentclass[]{article}
|
||||
\documentclass[openany]{book}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{polski}
|
||||
\usepackage[utf8]{inputenc}
|
||||
@ -25,83 +25,127 @@
|
||||
\usepackage[polish]{babel}
|
||||
\usepackage{braket}
|
||||
\usepackage{subcaption}
|
||||
|
||||
\DeclarePairedDelimiter\ceil{\lceil}{\rceil}
|
||||
\DeclarePairedDelimiter\floor{\lfloor}{\rfloor}
|
||||
|
||||
\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning}
|
||||
\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
|
||||
\usepackage{imakeidx}
|
||||
%\usepackage{showidx}
|
||||
%\usepackage[bookmarks]{hyperref}
|
||||
\usepackage{pgfplots}
|
||||
\makeindex
|
||||
|
||||
% opening
|
||||
\title{PAA - Kolokwia, rozwiązania}
|
||||
\title{Podstawy Analizy Algorytmów dla opornych}
|
||||
\author{Kacper Donat}
|
||||
|
||||
\newcounter{task}[section]
|
||||
\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}
|
||||
\input{macros.tex}
|
||||
|
||||
\begin{document}
|
||||
%\maketitle
|
||||
%\tableofcontents
|
||||
|
||||
\input{2013.01.26.tex}
|
||||
\input{2011.01.18.tex}
|
||||
\input{2018.bonus.tex}
|
||||
\input{2018.01.25.tex}
|
||||
\chapter{Złożoności obliczeniowe}
|
||||
\input{part-1/intro.tex}
|
||||
\input{part-1/2018.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}
|
||||
|
16
npc.tex
Normal file
16
npc.tex
Normal 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
384
part-1/2018.tex
Normal 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
146
part-1/intro.tex
Normal 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}
|
@ -2,14 +2,13 @@
|
||||
|
||||
\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
|
||||
$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})
|
||||
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
|
||||
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
|
||||
@ -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.
|
||||
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
|
||||
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
|
||||
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
|
||||
@ -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$}
|
||||
\end{figure}
|
||||
\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.
|
||||
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
|
||||
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
|
||||
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
|
||||
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ć
|
||||
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:
|
||||
@ -135,14 +132,18 @@ jednak są one stosunkowo proste w narysowaniu i wymyśleniu.
|
||||
\begin{column}{.5}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/k3-3.tex}
|
||||
\begin{tikzpicture}
|
||||
\input{gfx/k3-3.tex}
|
||||
\end{tikzpicture}
|
||||
\caption{Graf $K_{3,3}$}
|
||||
\end{figure}
|
||||
\end{column}%
|
||||
\begin{column}{.5}%
|
||||
\begin{figure}[H]
|
||||
\centering
|
||||
\input{gfx/k5.tex}
|
||||
\begin{tikzpicture}
|
||||
\input{gfx/k5.tex}
|
||||
\end{tikzpicture}
|
||||
\caption{Graf $K_{5}$}
|
||||
\end{figure}
|
||||
\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
|
||||
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:
|
||||
,,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{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ą
|
||||
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.
|
||||
@ -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
|
||||
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.
|
||||
\end{solution}
|
||||
|
||||
\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
|
||||
@ -245,7 +247,7 @@ się wielomianowy przy następujących modyfikacjach?}
|
||||
\subtask{sumy te muszą się różnić o więcej niż 3}
|
||||
\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
|
||||
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}
|
||||
\caption{Graf relacji redukcji $\alpha$ między modyfikacjami problemu $\Pi$}
|
||||
\end{figure}
|
||||
\taskend
|
||||
\end{solution}
|
||||
|
||||
\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źć
|
||||
@ -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 {dla \problem{MLZP} nie istnieje schemat FPTAS, chyba że $\P = \NP$}
|
||||
|
||||
\solution
|
||||
Problem \problem{MLZP}, zgodnie z tytułem, jest problemem maksymalizacyjnym. Zatem wiemy, że $A_\text{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}$
|
||||
\begin{solution}
|
||||
Problem \problem{MLZP}, zgodnie z tytułem, jest problemem maksymalizacyjnym. Zatem wiemy, że $A_{opt} \geq A$, gdzie
|
||||
$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:
|
||||
|
||||
\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
|
||||
\end{equation}
|
||||
|
||||
z tych 2 faktów
|
||||
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
|
||||
co implikowałoby, że $\P = \NP$.
|
||||
|
||||
\taskend
|
||||
\end{solution}
|
@ -5,7 +5,7 @@
|
||||
\subtask{Spróbuj zaprojektować algorytm wielomianowy dla tego problemu decyzyjnego}
|
||||
\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
|
||||
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ć
|
||||
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,
|
||||
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)$
|
||||
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
|
||||
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,
|
||||
@ -59,7 +58,7 @@ który nie jest połączony z żadnym innym.
|
||||
\end{figure}
|
||||
|
||||
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ę
|
||||
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
|
||||
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.
|
||||
\taskend
|
||||
\end{solution}
|
||||
|
||||
\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:}
|
||||
\subtask{$\problem{OPK} \in \problem{NP}$}
|
||||
\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
|
||||
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
|
||||
@ -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
|
||||
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
|
||||
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.
|
||||
\taskend
|
||||
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.
|
||||
\end{solution}
|
||||
|
||||
\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
|
||||
$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.}
|
||||
|
||||
\solution
|
||||
\begin{solution}
|
||||
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
|
||||
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
|
||||
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$.
|
||||
\taskend
|
||||
\end{solution}
|
||||
|
||||
\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
|
||||
@ -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
|
||||
$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
|
||||
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$.
|
||||
|
||||
Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy n
|
||||
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)$.
|
||||
Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy
|
||||
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
|
||||
$\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 4$ - graf potrzebuje 4 kolorów tylko, gdy jest kliką $K_4$ - $O(1)$.
|
||||
\end{enumerate}
|
||||
\end{solution}
|
||||
|
||||
\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.}
|
||||
@ -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{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.
|
||||
W problemie chodzi o znalezienie największego podgrafu acyklicznego w digrafie $D$.
|
||||
\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,
|
||||
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
|
||||
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.
|
||||
|
||||
\begin{figure}[H]
|
||||
@ -370,4 +371,4 @@ Jeżeli teraz przedzielimy obie strony nierówności przez $m + 1$ uzyskamy po p
|
||||
\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$.
|
||||
\taskend
|
||||
\end{solution}
|
@ -7,7 +7,7 @@ w problem $\Pi \in \NP$ przekaż wiadomość, mówiącą, że:}
|
||||
\subtask{\alphareduction{\problem{3SAT}}{$\Pi$}}
|
||||
\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
|
||||
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
|
||||
@ -44,7 +44,7 @@ wszystkie problemy $\NP$ (zgodnie z definicją klasy \NPC). W takim wypadku lepi
|
||||
\begin{center}
|
||||
0 symboli
|
||||
\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
|
||||
minimalizacyjne.
|
||||
@ -55,7 +55,7 @@ minimalizacyjne.
|
||||
\subtask Największa/najmniejsza droga w grafie
|
||||
\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
|
||||
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
|
||||
@ -95,7 +95,7 @@ Stąd też wiemy, że wersja minimalizacyjna jest \P.
|
||||
\end{tabular}
|
||||
\caption{Podsumowanie statusów problemów z zadania}
|
||||
\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ę.
|
||||
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.
|
||||
|
||||
\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.
|
||||
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.
|
||||
@ -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
|
||||
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}$.
|
||||
\taskend
|
||||
\end{solution}
|
||||
|
||||
\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,
|
||||
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?
|
||||
|
||||
\solution
|
||||
\begin{solution}
|
||||
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
|
||||
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
|
||||
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.
|
||||
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{column}
|
||||
|
||||
\solution
|
||||
\begin{solution}
|
||||
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
|
||||
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
|
||||
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.
|
||||
\taskend
|
||||
\end{solution}
|
||||
|
||||
\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 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,
|
||||
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
|
||||
@ -275,3 +275,4 @@ Odpowiedzi zatem klarują się następująco:
|
||||
Nie istnieje schemat PTAS & \textbf{NIE} \\
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
\end{solution}
|
194
part-2/2018.tex
Normal file
194
part-2/2018.tex
Normal 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
4
part-2/intro.tex
Normal 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.
|
Loading…
Reference in New Issue
Block a user