Chapter 5 first version
This commit is contained in:
parent
d3d26a99dc
commit
226fd406bc
131
luku05.tex
131
luku05.tex
|
@ -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.
|
|
Loading…
Reference in New Issue