Chapter 5 first version

This commit is contained in:
Antti H S Laaksonen 2017-01-01 21:08:51 +02:00
parent d3d26a99dc
commit 226fd406bc
1 changed files with 63 additions and 68 deletions

View File

@ -680,79 +680,74 @@ Especially useful are optimizations that
occur at the top of the search tree because occur at the top of the search tree because
they can prune the search very efficiently. they can prune the search very efficiently.
\section{Puolivälihaku} \section{Meet in the middle}
\index{puolivxlihaku@puolivälihaku} \index{meet in the middle}
\key{Puolivälihaku} (''meet in the middle'') on tekniikka, \key{Meet in the middle} is a technique
jossa hakutehtävä jaetaan kahteen yhtä suureen osaan. where the search space is divided into
Kumpaankin osaan tehdään erillinen haku, two equally large parts.
ja lopuksi hakujen tulokset yhdistetään. A separate search is performed
for each of the parts,
and finally the results of the searches are combined.
Puolivälihaun käyttäminen edellyttää, The meet in the middle technique can be used
että erillisten hakujen tulokset pystyy if there is an efficient way to combine the
yhdistämään tehokkaasti. results of the searches.
Tällöin puolivälihaku on tehokkaampi In this case, the two searches may require less
kuin yksi haku, joka käy läpi koko hakualueen. time than one large search.
Tyypillisesti puolivälihaku tehostaa algoritmia Typically, we can turn a factor of $2^n$
niin, että aikavaativuuden kertoimesta $2^n$ into a factor of $2^{n/2}$ using the meet in the
tulee kerroin $2^{n/2}$. middle technique.
Tarkastellaan ongelmaa, jossa annettuna As an example, consider a problem where
on $n$ lukua sisältävä lista sekä kokonaisluku $x$. we are given a list of $n$ numbers and
Tehtävänä on selvittää, voiko listalta valita an integer $x$.
joukon lukuja niin, että niiden summa on $x$. Our task is to find out if it is possible
Esimerkiksi jos lista on $[2,4,5,9]$ ja $x=15$, to choose some numbers from the list so that
voimme valita listalta luvut $[2,4,9]$, the sum of the numbers is $x$.
jolloin $2+4+9=15$. For example, given the list $[2,4,5,9]$ and $x=15$,
Jos taas lista säilyy ennallaan ja $x=10$, we can choose the numbers $[2,4,9]$ to get $2+4+9=15$.
mikään valinta ei täytä vaatimusta. However, if the list remains the same but $x=10$,
it is not possible to form the sum.
Tavanomainen ratkaisu tehtävään on käydä kaikki A standard solution for the problem is to
listan alkioiden osajoukot läpi ja tarkastaa, go trough all subsets of the elements and
onko jonkin osajoukon summa $x$. check if the sum of any of the subsets is $x$.
Tällainen ratkaisu kuluttaa aikaa $O(2^n)$, The time complexity of this solution is $O(2^n)$
koska erilaisia osajoukkoja on $2^n$. because there are $2^n$ possible subsets.
Seuraavaksi näemme, However, using the meet in the middle technique,
miten puolivälihaun avulla on mahdollista luoda we can create a more efficient $O(2^{n/2})$ time solution.
tehokkaampi $O(2^{n/2})$-aikainen ratkaisu. Note that $O(2^n)$ and $O(2^{n/2})$ are different
Huomaa, että aikavaativuuksissa $O(2^n)$ ja complexities because $2^{n/2}$ equals $\sqrt{2^n}$.
$O(2^{n/2})$ on merkittävä ero, koska
$2^{n/2}$ tarkoittaa samaa kuin $\sqrt{2^n}$.
Ideana on jakaa syötteenä oleva lista The idea is to divide the list given as input
kahteen listaan $A$ ja $B$, to two lists $A$ and $B$ that each contain
joista kumpikin sisältää noin puolet luvuista. about half of the numbers.
Ensimmäinen haku muodostaa kaikki osajoukot The first search generates all subsets
listan $A$ luvuista ja laittaa muistiin niiden summat of the numbers in the list $A$ and stores their sums
listaan $S_A$. to list $S_A$.
Toinen haku muodostaa vastaavasti listan Correspondingly, the second search creates
$B$ perusteella listan $S_B$. the list $S_B$ from the list $B$.
Tämän jälkeen riittää tarkastaa, After this, it suffices to check if it is possible
onko mahdollista valita yksi luku listasta $S_A$ to choose one number from $S_A$ and another
ja toinen luku listasta $S_B$ niin, number from $S_B$ so that their sum is $x$.
että lukujen summa on $x$. This is possible exactly when there is a way to
Tämä on mahdollista tarkalleen silloin, form the sum $x$ using the numbers in the original list.
kun alkuperäisen listan luvuista saa summan $x$.
Tarkastellaan esimerkkiä, For example, assume that the list is $[2,4,5,9]$ and $x=15$.
jossa lista on $[2,4,5,9]$ First, we divide the list into $A=[2,4]$ and $B=[5,9]$.
ja $x=15$. After this, we create the lists
Puolivälihaku jakaa luvut kahteen $S_A=[0,2,4,6]$ and $S_B=[0,5,9,14]$.
listaan niin, että $A=[2,4]$ The sum $x=15$ is possible to form
ja $B=[5,9]$. because we can choose the number $6$ from $S_A$
Näistä saadaan edelleen summalistat and the number $9$ from $S_B$.
$S_A=[0,2,4,6]$ ja $S_B=[0,5,9,14]$. This choice corresponds to the solution $[2,4,9]$.
Summa $x=15$ on mahdollista muodostaa,
koska voidaan valita $S_A$:sta luku $6$
ja $S_B$:stä luku $9$.
Tämä valinta vastaa ratkaisua $[2,4,9]$.
Ratkaisun aikavaativuus on $O(2^{n/2})$, The time complexity of the algorithm is $O(2^{n/2})$
koska kummassakin listassa $A$ ja $B$ because both lists $A$ and $B$ contain $n/2$ numbers
on $n/2$ lukua ja niiden osajoukkojen and it takes $O(2^{n/2})$ time to calculate the sums of
summien laskeminen listoihin $S_A$ ja $S_B$ their subsets to lists $S_A$ and $S_B$.
vie aikaa $O(2^{n/2})$. After this, it is possible to check in
Tämän jälkeen on mahdollista tarkastaa $O(2^{n/2})$ time if the sum $x$ can be created
ajassa $O(2^{n/2})$, voiko summaa $x$ muodostaa using the numbers in $S_A$ and $S_B$.
listojen $S_A$ ja $S_B$ luvuista.