Commit 6c19a203 authored by Varré Jean-Stéphane's avatar Varré Jean-Stéphane
Browse files

Prise en compte des remarques de M.Salson. Finalisation BM.

parent 467ea988
No preview for this file type
......@@ -7,7 +7,7 @@
\renewcommand{\algorithmicensure}{\textbf{Sortie:}}
\usepackage{minitoc}
\usepackage{url}
\usepackage[margin=2cm]{geometry}
\usepackage{titlesec}
......@@ -144,9 +144,8 @@ motif ont été comparés avec succès. Dans ce dernier cas on a une
\begin{todo}{}
Etant donné le texte $$T = \mbox{\tt les beaux haricots de harry
etaient caches dans le haras des harison}$$ et le motif $$M =
\mbox{\tt haras}$$ trouver toutes les
Etant donné le texte $$T = \mbox{\tt les haricots des harha caches dans le haras des harison}$$ et le motif $$M =
\mbox{\tt harha}$$ trouver toutes les
occurrences du motif $M$ dans $T$.
En profiter pour compter le nombre de comparaisons de caractères
......@@ -182,7 +181,7 @@ motif dans le texte de plus de 1 à chaque étape.
% -----------------------------------------------------------
Recommencons à appliquer l'algorithme naïf avec la recherche de
\texttt{haras} sur une texte qui commence par \texttt{hari}. On
\texttt{harha} sur une texte qui commence par \texttt{hari}. On
commence par tester la position 0, et on aboutit à un échec en positon
3.
......@@ -190,22 +189,22 @@ commence par tester la position 0, et on aboutit à un échec en positon
position: 0123...........
texte: hari...........
|||X
motif: haras
motif: harha
\end{verbatim}
Au bout de 4 comparaisons, on peut donc conclure que \texttt{haras} n'a pas
Au bout de 4 comparaisons, on peut donc conclure que \texttt{harha} n'a pas
d'occurrence à la position 0 de notre texte.
L'étape suivante de l'algorithme naïf consiste à chercher une
occurrence de \texttt{haras} à la position 1. Ce qui va nécessairement
occurrence de \texttt{harha} à la position 1. Ce qui va nécessairement
conduire à un échec.
\begin{todo}[Question]{}
Pourquoi n'a-t-on aucune chance de réussir à trouver
\texttt{haras} à la position suivante ?
\texttt{harha} à la position suivante ?
\end{todo}
% - Réponse : parce que `hara` ne contient pas de `i`
% - Réponse : parce que `harha` ne contient pas de `i`
\begin{todo}[Question]{}
À quelle position du texte faut-il recommencer à chercher pour
......@@ -286,7 +285,7 @@ le texte contient la lettre $b$ ($a \neq b$).
\end{todo}
\begin{todo}[Cas 3]{}
Supposons être dans la situation décrite ci-dessus et que le motif ne contienne plusieurs $b$
Supposons être dans la situation décrite ci-dessus et que le motif contienne plusieurs $b$
avant $a$ :
\begin{center}
\begin{tikzpicture}[xscale=0.5,yscale=0.5]
......@@ -330,18 +329,19 @@ position il n'y aura pas d'échec.
Remplir le tableau suivant qui indique, pour chaque position $j$
d'échec du motif, et pour chaque lettre $x$ (du texte) d'échec
possible, la dernière position (la plus à droite) d'occurrence de
$x$ dans $M[0:j]$.
$x$ dans $M[0:j+1]$ (le préfixe du motif s'arrêtant en position
$j$ comprise).
\begin{center}
\begin{tabular}{cc|p{1cm}p{1cm}p{1cm}p{1cm}p{1cm}}
& & \multicolumn{5}{c}{lettre d'échec $x$} \\
motif & $j$ & \texttt{h} & \texttt{a} & \texttt{r} & \texttt{s} & autre \\
\begin{tabular}{cc|p{1cm}p{1cm}p{1cm}p{1cm}}
& & \multicolumn{4}{c}{lettre d'échec $x$} \\
motif & $j$ & \texttt{h} & \texttt{a} & \texttt{r} & autre \\
\hline
\tt h & 0 & & & & & \\
\tt a & 1 & & & & & \\
\tt r & 2 & & & & & \\
\tt a & 3 & & & & & \\
\tt s & 4 & & & & & \\
\tt h & 0 & & & & \\
\tt a & 1 & & & & \\
\tt r & 2 & & & & \\
\tt h & 3 & & & & \\
\tt a & 4 & & & & \\
\end{tabular}
\end{center}
......@@ -400,14 +400,14 @@ L'algorithme devient alors~:
Remarquez que naturellement on imagine toujours procéder à la
recherche du motif $M$ à une position du textete $T$ en vérifiant les
recherche du motif $M$ à une position du texte $T$ en vérifiant les
lettres de gauche à droite. Mais on pourrait le faire de droite à
gauche~:
\begin{verbatim}
texte dadas....
texte cacha....
X||
motif haras
motif harha
\end{verbatim}
Cela ne change pas beaucoup de la règle du bon caractère vu avant.
......@@ -422,8 +422,8 @@ peut avoir un décalage maximal, c'est-à-dire de la longueur du motif.
\begin{verbatim}
texte harry
X
motif haras
haras
motif harha
harha
\end{verbatim}
\begin{todo}[Question]{}
......@@ -453,14 +453,14 @@ seulement la lettre lue dans le texte mais aussi le suffixe du motif
dont on sait qu'il correspond au texte.
% -----------------------------------------------------------
\subsection{Observation}
\subsection{Observations}
% -----------------------------------------------------------
Supposons être dans la sitution suivante, où on a un échec en position
$j$ du motif.
\begin{center}
\begin{tikzpicture}[xscale=0.5,yscale=0.5]
\draw (5,1) ++(0.5,0.5) node {$i$};
\draw (4,1) ++(0.5,0.5) node {$i$};
\draw (9,1) ++(0.5,0.5) node {$i+j$};
\draw (0,0) rectangle (20,1);
\draw (0,0) +(0,0.5) node[left] {$T$};
......@@ -518,12 +518,12 @@ $j$ du motif.
\draw (9,-2) ++(2.5,-0.5) node {$k_2$};
\end{tikzpicture}
\end{center}
faut-il décaler le motif pour avoir une chance d'avoir une
occurrence ?
peut-on décaler le motif pour avoir une chance d'avoir une
occurrence ? Y a-t-il un cas où on peut rater une occurrence ?
\end{todo}
\begin{todo}[Chercher]{}
Imaginons que le motif contienne lui-même une autre occurrence de
Imaginons que le motif contienne lui-même une unique autre occurrence de
$u$, cette fois précédée par la même lettre $a$ que celle qui a
produit l'échec~:
\begin{center}
......@@ -551,7 +551,7 @@ $j$ du motif.
Pour calculer des décalages utilisant ces observations, il va donc
falloir chercher, pour chaque position $j$ du motif, la longueur $S[k]$ du
plus long \emph{facteur} du motif qui est aussi suffixe et non précédé par
la lettre $b$. On en déduira $D[j]$, le décalage à réaliser lorsqu'on
la lettre $a$. On en déduira $D[j]$, le décalage à réaliser lorsqu'on
a un échec en position $j$ du motif.
\begin{center}
\begin{tikzpicture}[xscale=0.5,yscale=0.5]
......@@ -622,7 +622,8 @@ de \texttt{C}.
\end{center}
Par conséquent, si on a un échec en position $3$ alors on pourra
décaler le motif de 2 positions. Donc $D[3] = 2$. Plus généralement on
remarque la relation $j = m - 1 - S[k]$.
remarque la relation $j = m - 1 - S[k]$ ($m$ étant la longueur du
motif $M$).
\bigskip
......@@ -667,8 +668,12 @@ aussi son suffixe.
\bigsskip
MOT SUR LE CAS SPECIAL D[0]
On remarquera également que $D[0]$ ne peut être calculé ainsi puisque
l'échec intervient au plus tard sur $j=1$. $D[0]$ est défini comme la
\emph{période} du motif, c'est-à-dire la longueur du mot $u$ tel que
le motif s'écrit comme une répétition de $u$ ($M = uuuu \dots uv$ avec
$v$ un préfixe de $u$). Dans notre exemple, la période est $3$ cat
$harha = har \dot ha$.
%\begin{todo}[Chercher]{}
% Compléter la règle de décalage suivante :
......@@ -690,15 +695,17 @@ MOT SUR LE CAS SPECIAL D[0]
% suffixe} qui permet de connaître la position du décalage qui sera à
%appliquer.
\newpage
\begin{todo}{}
Remplir la table suivante~:
\begin{center}
\begin{tabular}{p{2cm}|p{1cm}p{1cm}p{1cm}p{1cm}p{1cm}}
$j$ & 0 & 1 & 2 & 3 & 4 \\
\hline
motif & h & a & r & a & s \\
$S[k]$ & & & & & \\
$D[k]$ & & & & &
motif & h & a & r & h & a \\
$S[k]$ & & & & & \\
$D[k]$ & & & & &
\end{tabular}
\end{center}
\end{todo}
......@@ -708,7 +715,8 @@ MOT SUR LE CAS SPECIAL D[0]
% -----------------------------------------------------------
L'avantage d'opérer des décalages basés sur des mots et non sur des
lettres c'est XXX.
lettres c'est qu'on s'assure à l'avance qu'il y aura souvent un nombre moindre
d'échecs à la prochaine tentative.
\newpage
......@@ -718,7 +726,7 @@ lettres c'est XXX.
On peut imaginer mettre en place un algorithme qui utilise des règles
de décalage différentes. Etant donné que les règles de décalage sont
correctes (i.e. elles ne rate pas d'occurrence), il suffit de choisir
correctes (i.e. elles ne ratent pas d'occurrence), il suffit de choisir
celle, parmi toutes les règles, qui fournit le décalage maximum.
Les règles exploitant des idées similaires, il n'est pas facile
......@@ -752,12 +760,12 @@ lettre dont la position d'occurrence la plus à droite est plus grande
que la position d'échec dans le motif.
\begin{todo}{}
Remplir la table suivante pour $M=\mathtt{haras}$~:
Remplir la table suivante pour $M=\mathtt{harha}$~:
\begin{center}
\begin{tabular}{p{2cm}|p{1cm}p{1cm}p{1cm}p{1cm}p{1cm}}
$x$ & h & a & r & s & autre \\
\begin{tabular}{p{2cm}|p{1cm}p{1cm}p{1cm}p{1cm}}
$x$ & h & a & r & autre \\
\hline
$C[x]$ & & & & & \\
$C[x]$ & & & & \\
\end{tabular}
\end{center}
......@@ -794,7 +802,7 @@ L'algorithme de Boyer-Moore est le suivant, il ne fait que mettre en
\EndFor
\end{algorithmic}
\begin{todo}
\begin{todo}{}
Exécuter l'algorithme de Boyer-Moore sur l'exemple.
\end{todo}
......@@ -882,23 +890,27 @@ L'algorithme de Boyer-Moore est un des plus efficace~:
\bigskip
Utiliser cette bande découpée pour faire glisser le motif le long du
texte et simulerl'algorithme naïf. Les cases nb. cmp permettent de
mémoriser le nombre de comparaisons de chaque caractères du texte.
texte et simuler l'algorithme naïf. Les cases nb. cmp permettent de
mémoriser le nombre de comparaisons de chaque caractère du texte.
\vspace*{1cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
\foreach \c [count=\x from 0] in {l,e,s, ,b,e,a,u,x, ,h,a,r,i,c,o,t,s, ,d,e, ,h,a,r,r,y, ,e,t,a,i,e,n,t, ,c,a,c,h,e,s, ,d,a,n,s, ,l,e, ,h,a,r,a,s, ,d,e,s, ,h,a,r,i,s,o,n} {
\foreach \c [count=\x from 0] in {l,e,s, ,h,a,r,i,c,o,t,s, ,d,e,s, ,h,a,r,h,a, ,c,a,c,h,e,s, ,d,a,n,s, ,l,e, ,h,a,r,a,s, ,d,e,s, ,h,a,r,i,s,o,n} {
\draw (\x,0) ++(0.5,4.5) node {\tiny \x};
\draw (\x,1) rectangle +(1,3);
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,2.3) node[rotate=90] {\small nb.cmp};
\draw (-1.7,2.3) node {\small nb.cmp};
\draw (-0.7,4.5) node {\tiny $i$};
\end{tikzpicture}
\vspace*{2cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -916,11 +928,12 @@ Utiliser la bande avec le texte pour positionner le motif pour simuler
des échecs à chacune de ses positions et pour différentes lettres (des
lettres du motif, et des lettres qui ne sont pas du motif).
\bgiskip
\vspace*{1cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
\foreach \c [count=\x from 0] in {l,e,s, ,b,e,a,u,x, ,h,a,r,i,c,o,t,s, ,d,e, ,h,a,r,r,y, ,e,t,a,i,e,n,t, ,c,a,c,h,e,s, ,d,a,n,s, ,l,e, ,h,a,r,a,s, ,d,e,s, ,h,a,r,i,s,o,n} {
\foreach \c [count=\x from 0] in {l,e,s, ,h,a,r,i,c,o,t,s, ,d,e,s, ,h,a,r,h,a, ,c,a,c,h,e,s, ,d,a,n,s, ,l,e, ,h,a,r,a,s, ,d,e,s, ,h,a,r,i,s,o,n} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -928,64 +941,66 @@ lettres du motif, et des lettres qui ne sont pas du motif).
\draw (-0.7,1.5) node {\tiny $i$};
\end{tikzpicture}
\vspace*{2cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% pas d'echec
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
%
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% echec en position 0
\draw[fill=black!50] (0,0) rectangle +(1,1);
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
%
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% echec en position 1
\draw[fill=black!50] (1,0) rectangle +(1,1);
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
%
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% echec en position 2
\draw[fill=black!50] (2,0) rectangle +(1,1);
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
%
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% echec en position 3
\draw[fill=black!50] (3,0) rectangle +(1,1);
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
%
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% echec en position 4
\draw[fill=black!50] (4,0) rectangle +(1,1);
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -993,19 +1008,19 @@ lettres du motif, et des lettres qui ne sont pas du motif).
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
\bigskip
\newpage
% -----------------------------------------------------------
\subtitlebar{Pour l'activité 4}
% -----------------------------------------------------------
\bigskip
\vspace*{1cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
% S[4]
\draw (-0.7,1.5) node {\tiny $j$};
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -1023,7 +1038,7 @@ lettres du motif, et des lettres qui ne sont pas du motif).
% S[3]
\draw (-0.7,1.5) node {\tiny $j$};
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -1040,7 +1055,7 @@ lettres du motif, et des lettres qui ne sont pas du motif).
% S[2]
\draw (-0.7,1.5) node {\tiny $j$};
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -1057,7 +1072,7 @@ lettres du motif, et des lettres qui ne sont pas du motif).
% S[1]
\draw (-0.7,1.5) node {\tiny $j$};
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -1074,7 +1089,7 @@ lettres du motif, et des lettres qui ne sont pas du motif).
% S[0]
\draw (-0.7,1.5) node {\tiny $j$};
\foreach \c [count=\x from 0] in {h,a,r,a,s} {
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,1.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
......@@ -1087,6 +1102,44 @@ lettres du motif, et des lettres qui ne sont pas du motif).
= \phantom{88} $, donc $D[\phantom{88}]=\phantom{88}$};
\end{tikzpicture}
% -----------------------------------------------------------
\subtitlebar{Pour l'activité 5}
% -----------------------------------------------------------
\bigskip
Utiliser cette bande découpée pour faire glisser le motif le long du
texte et simuler l'algorithme de Boyer-Moore. Les cases nb. cmp permettent de
mémoriser le nombre de comparaisons de chaque caractère du texte et la
case $D$ permet de noter le décalage à effectuer.
\vspace*{1cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
\foreach \c [count=\x from 0] in {l,e,s, ,h,a,r,i,c,o,t,s, ,d,e,s, ,h,a,r,h,a, ,c,a,c,h,e,s, ,d,a,n,s, ,l,e, ,h,a,r,a,s, ,d,e,s, ,h,a,r,i,s,o,n} {
\draw (\x,0) ++(0.5,6.5) node {\tiny \x};
\draw (\x,1) rectangle +(1,2);
\draw (\x,3) rectangle +(1,3);
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-1.7,4.3) node {\small nb.cmp};
\draw (-0.7,2.1) node {$D$};
\draw (-0.7,6.5) node {\tiny $i$};
\end{tikzpicture}
\vspace*{1cm}
\begin{tikzpicture}[xscale=0.4,yscale=0.4]
\foreach \c [count=\x from 0] in {h,a,r,h,a} {
\draw (\x,0) ++(0.5,-0.5) node {\tiny \x};
\draw[anchor=base] (\x,0) ++(0.5,0.25) node {\texttt{\c}};
\draw (\x,0) rectangle +(1,1);
}
\draw (-0.7,-0.5) node {\tiny $j$};
\end{tikzpicture}
\end{landscape}
......
This diff is collapsed.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment