75 lines
2.3 KiB
TeX
75 lines
2.3 KiB
TeX
\chapter{Motif}
|
|
|
|
\begin{algorithm}
|
|
\caption{Brute-force search of a motif in a sequence}
|
|
\begin{algorithmic}[1]
|
|
\Function{FindMotif}{$S$: Array($n$), $M$: Array($m$)}
|
|
\Returns{a list of position}
|
|
\State $pos \gets \{\}$
|
|
\State $i \gets 0$
|
|
\While {$i < n - m + 1$}
|
|
\State $j \gets 0$
|
|
\While {$j < m$ and $S[i+j] = M[j]$}
|
|
\State $j++$
|
|
\EndWhile
|
|
\If {$j = m$}
|
|
\State $pos \gets pos \cup \{i\}$
|
|
\EndIf
|
|
\State $i++$
|
|
\EndWhile
|
|
\State \Return $pos$
|
|
\EndFunction
|
|
\end{algorithmic}
|
|
\label{alg:naive-motif-matching}
|
|
\end{algorithm}
|
|
|
|
\begin{algorithm}
|
|
\caption{Knuth-Morris-Pratt algorithm}
|
|
\begin{algorithmic}[1]
|
|
\Function{KMP\_Search}{$S$: Array($n$), $M$: Array($m$)}
|
|
\Returns{Integer}
|
|
\State $table \gets$ \Call{KMP\_Table}{$M$}
|
|
\State $c \gets 0$ \Comment{Count the number of matches}
|
|
\State $i \gets 0$
|
|
\State $j \gets 0$
|
|
\While {$i < n$}
|
|
\If{$S[i] = M[i]$}
|
|
\State $i \gets i + 1$
|
|
\State $j \gets j + 1$
|
|
\EndIf
|
|
\If {$j = m$}
|
|
\State $c \gets c + 1$
|
|
\State $j \gets table[j-1]$
|
|
\ElsIf {$j < n$ and $M[j] \neq S[i]$}
|
|
\If {$j \neq 0$}
|
|
\State $j \gets table[j-1]$
|
|
\Else
|
|
\State $i \gets i + 1$
|
|
\EndIf
|
|
\EndIf`
|
|
\EndWhile
|
|
\State \Return $c$
|
|
\EndFunction
|
|
|
|
\Function{KMP\_Table}{M: Array(m)}
|
|
\State \textbf{Returns} Array(m)
|
|
\State $previous \gets 0$
|
|
\State $table \gets $ array of zeros of size m
|
|
\For {$i = 0$; $i < m$; $i++$}
|
|
\If {$M[i] = M[previous]$}
|
|
\State $previous \gets previous + 1$
|
|
\State $table[i] \gets previous$
|
|
\State $i \gets i + 1$
|
|
\Else
|
|
\If {$previous = 0$}
|
|
\State $previous \gets table[previous - 1]$
|
|
\Else
|
|
\State $table[i] \gets 0$
|
|
\State $i \gets 1$
|
|
\EndIf
|
|
\EndIf
|
|
\EndFor
|
|
\EndFunction
|
|
\end{algorithmic}
|
|
\end{algorithm}
|