MoDDiB
Messages postés546Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention 4 mai 2007
-
27 déc. 2003 à 12:49
MoDDiB
Messages postés546Date d'inscriptionmardi 26 novembre 2002StatutMembreDernière intervention 4 mai 2007
-
30 déc. 2003 à 12:26
Bon tout d'abord je tient à préciser qu'il s'agit du concours prologin auquel je compte participer donc si certaines personnes ne veulent pas m'aider je comprendrais..
Mais je ne demande aucune réponse je veux simplmenet une explication histoire de comprendre ce qui ne vas pas..
Voila mon algo ne passe pas les test de vitesse il faut en fait trouver le nombre de chaine faisable qui commence par a et qui finit par b (par ex abab renvoie 3 : le 1er ab puis abab pui le second ab)
Voila mon prog svp expliker moi en quoi c'est trop lent ; meme une aide anodine serait précieuse !! merci ^^
#include <stdio.h>
int sousChaineAB(char* tab, int size)
{
int chaine = 0;
for (int i=0;i<size;i++)
{
if (tab[i] == 'a')
{
for(int j=i+1;j<size;j++)
{
if (tab[j]== 'b')
chaine++;
}
}
}
return chaine;
}
int main()
{
int size, i;
char tab[1000000];
scanf("%d", &size);
for (i = 0; i < size; i++)
{
do
scanf("%c", &(tab[i]));
while ((tab[i] == '\n') || (tab[i] == '\r'));
}
printf("%d\n", sousChaineAB(tab, size));
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 30 déc. 2003 à 03:35
ton algo est trop lent car dans le cas pire ou ya ke des a dans la chaine, tu va faire size(size+1)/2 = O(size²) itérations dans les 'for'. tu dois trouver un algo qui est en O(size), cad te débrouiller pour faire un algo sans 'for' imbriqué
cosmobob
Messages postés700Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention27 janvier 20094 30 déc. 2003 à 03:53
bon j'ai trouvé une réponse en fait seulement 2 passages, mais ca utilise un tableau intérmédiaire.
char tab[size];
char tab2[size];
on remplit tab avec les a et les b.
pour tab2 :
int valeur = 0;
for (i = 0; i < size; i++)
{
if (tab[i] == 'b')
valeur++;
tab2[i] = valeur;
}
on constate qu'a la sortie, tab2[size-1] représente le nombre de 'b' dans la chaine; et que tab2[i] représente le nombre de 'b' jusqu'au i'eme caractere.
or maintenant pour chaque 'a', on peut savoir combien il y a de b qui suivent (donc de sous chaines qui commencent par ce 'a' la et qui finissent par un 'b') en calculant tab2[size-1]-tab2[i]
int nbsouschaine = 0;
for (i = 0; i > size; i++)
{
if (tab[i] == 'a')
nbsouchaine = nbsouschaine + tab2[size-1]-tab2[i];
}
ici on a le bon nbsouschaine :)
cet algo fait 2*size opérations, c'est a dire qu'il est en O(size), donc immensément plus rapide que le tiens !! (2n c'est bcp plus petit que n² quand n est grand). par contre, il a besoin d'une mémoire en O(size) (car on a besoin d'un tableau intermédiaire de taille size)