Commit a5c7189a authored by Julien David's avatar Julien David
Browse files

Cours 2: Algorithmes linéaires

parent 09d8ae6a
CAGATTTTTAAATGAGGGAAGACACCAAGTAAAACACCACCTTATTTTGTAGCCAGGAAACAGATTTTTAAATGAGGGAAGACACCAAGTAAAACACCACCTTATTTTGTAGCCAGGAAACAGATTTTTAAATGAGGGAAGACACCAAGTAAAACACCACCTTATTTTGTAGCCAGGAAAC
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX(x,y) (x<y)?y:x
int * KMPbord(char * mot,int m){
int i,j;
int * table_bord=(int *)malloc(sizeof(int)*(m+1));
table_bord[0]=-1;
table_bord[1]=0;
j=0;
for(i=2;i<=m;i++){
while(j>=0&&mot[j]!=mot[i-1])
j=table_bord[j];
j++;
if(mot[i]!=mot[j])
table_bord[i]=j;
else
table_bord[i]=MAX(0,table_bord[j]);
}
return table_bord;
}
int main(int argc,char ** argv){
int m,i;
int * table_bord;
if(argc==2){
m=strlen(argv[1]);
table_bord=KMPbord(argv[1],m);
for(i=0;i<=m;i++)
printf("%d ",table_bord[i]);
printf("\n");
free(table_bord);
}
return EXIT_SUCCESS;
}
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int * bord(char * mot,int m){
int i,j;
int * table_bord=(int *)malloc(sizeof(int)*(m+1));
table_bord[0]=-1;
table_bord[1]=0;
j=0;
for(i=2;i<=m;i++){
while(j>=0&&mot[j]!=mot[i-1])
j=table_bord[j];
j++;
table_bord[i]=j;
}
return table_bord;
}
int main(int argc,char ** argv){
int m,i;
int * table_bord;
if(argc==2){
m=strlen(argv[1]);
table_bord=bord(argv[1],m);
for(i=0;i<=m;i++)
printf("%d ",table_bord[i]);
printf("\n");
free(table_bord);
}
return EXIT_SUCCESS;
}
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include "recherche.h"
#define MAX(x,y) (x<y)?y:x
int * kmp_bord(char * mot,int m){
int i,j;
int * table_bord=(int *)malloc(sizeof(int)*(m+1));
table_bord[0]=-1;
table_bord[1]=0;
j=0;
for(i=2;i<=m;i++){
while(j>=0&&mot[j]!=mot[i-1])
j=table_bord[j];
j++;
if(j==0||mot[i]!=mot[j])
table_bord[i]=j;
else
table_bord[i]=table_bord[j];
}
return table_bord;
}
int knuth_morris_pratt(char * texte,char * motif,int n,int m){
int i=0,j=0;
int * table_bord;
int occ=0;
table_bord=kmp_bord(motif,m);
while(i<=(n-m+j)){
while(j<m&&comparer_lettre(texte[i],motif[j])){
i++;
j++;
}
if(j==m)
occ++;
if(j==0)
i++;
else
j=table_bord[j];
}
free(table_bord);
return occ;
}
int recherche(char * texte,char * motif,int n,int m,int k){
return knuth_morris_pratt(texte,motif,n,m);
}
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include"recherche.h"
#define MAX(x,y) (x<y)?y:x
int * bord(char * mot,int m){
int i,j;
int * table_bord=(int *)malloc(sizeof(int)*(m+1));
table_bord[0]=-1;
table_bord[1]=0;
j=0;
for(i=2;i<=m;i++){
while(j>=0&&mot[j]!=mot[i-1])
j=table_bord[j];
j++;
table_bord[i]=j;
}
return table_bord;
}
int morris_pratt(char * texte,char * motif,int n,int m){
int i=0,j=0,space;
int * table_bord;
int occ=0;
table_bord=bord(motif,m);
/* Décommentez pour voir l'exécution détaillée de l'algorithme
printf("%s\n",texte); */
while(i<=(n-m+j)){
/*
Remplacez la boucle while par ces deux lignes pour voir l'exécution détaillée de l'algorithme
for(space=0;space<i;space++)printf(" ");
while(j<m && printf("%c",motif[j]) && comparer_lettre(texte[i],motif[j])){
*/
while(j<m && comparer_lettre(texte[i],motif[j])){
i++;
j++;
}
/* Décommentez pour voir l'exécution détaillée de l'algorithme
printf("\n"); */
if(j==m)
occ++;
if(j==0)
i++;
else
j=table_bord[j];
}
free(table_bord);
return occ;
}
int recherche(char * texte,char * motif,int n,int m,int k){
return morris_pratt(texte,motif,n,m);
}
#ifndef MP_H
#define MP_H
int morris_pratt(char * texte,char * motif,int n,int m);
#define MP_H
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