begin process at 2012 02 11 22:11:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Algo trop lent :(


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Algo trop lent :(

samedi 27 décembre 2003 à 12:49:46 | Algo trop lent :(

MoDDiB

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));

}
mardi 30 décembre 2003 à 03:35:39 | Re : Algo trop lent :(

cosmobob


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é
mardi 30 décembre 2003 à 03:53:39 | Re : Algo trop lent :(

cosmobob


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)
mardi 30 décembre 2003 à 11:04:56 | Re : Algo trop lent :(

jpeg

Pour accélére ton algo, utilise des pointeurs. Ce sera moins compréhensible mais bien plus rapide (surtout si size est élévé)
Par exemple :

char tab[size];
char tab2[size];
char* ptab=tab;
char* ptab2=tab2;
char* pfintab2=&tab2[size-1];

int valeur = 0;
do
{
if (*ptab++ == 'b') valeur++;
*ptab2 = (char)valeur; // attention à la valeur (sur 1 octet)
}
while (ptab2++!=pfintab2);

int nbsouschaine = 0;
ptab=tab;
ptab2=tab2;

do
{
if (*ptab++ == 'a') nbsouchaine += (*pfintab2-*ptab2);
}
while (ptab2++!=pfintab2);


jpeg
mardi 30 décembre 2003 à 11:11:09 | Re : Algo trop lent :(

MoDDiB


Ok meric desolé de pas avoir vu avant vos reponses mais la notification auto a dy foirer ^^
Merci encore jvé rebosser ca !!
mardi 30 décembre 2003 à 12:26:12 | Re : Algo trop lent :(

MoDDiB

Ton algo semble bon cosmobob mais il ne passe que 3 tests sur 5 niveau calculs.. doit y avoir une erreur a partir d'un certain nombre v voir ca ^^


Cette discussion est classée dans : int, chaine, tab, algo, size


Répondre à ce message

Sujets en rapport avec ce message

Renvoie de type int& [ par saturne_1606 ] Bonjour a tous!Voila g la fonction suivante:int& tableau::operator ()(int l, int c){ if ((l>=tab.size())||(c>=(tab[l]).size())) { Programme en c++ [ par noussa44 ] Bonjour tout le monde, j'ai besoin svp de vore aide sur un programme que j'ai fait qui permet de trier des réels dans un tableau.Mais j'ai un problèm anagrammes récursifs [ par sumakotra ] /* Bonjour a tous ... voila j'voulais faire un programme sortant tout les anagrammes d'un mot en permutant les différentes lettres et en affichant a c jeux mode console en c [ par fifiprog ] Bonsoir a tous je dois creer un jeux sur un damier 10x10 ou tout d'abord deux joueurs pourrons s'affronter c'est le jeux des loups et agneau le but es Comment peut on utiliser? [ par djibidl ] Bonsoir, Je suis un débutant en C et disons que c'est un langage qui me passionne et j'aimerai savoir certaines choses le concernant: 1_) Est ce qu'on besoin d'aide pour corrigé mon exercice [ par darktn ] Salut Tout le monde , j'ai quelque bug dans ce programme besoin d'aide , Le But De faire une deuxième matrice contient les Caractère qui ce trouve dan projet d'un debutant (classement) [ par emilienheude ] bonjour à tous, je suis debutant dans la programmation en c et mes enseignents on eu la bonne idée de nous faire travailler sur un projet de sondage. aide pour ce mini compresseur [ par sizixe ] bonjour, voila mon problème : je veux faire un petit programme qui permet de compressé les chaine de caractères ex: la chaine aaaabbb il vas l'écrire problème lecture fichier de grande taille [ par africanwinners ] j'ai concu ce code pour lire le contenu d'un fichier et le mettre dans un tableau à 2 dimensions: ca marche pour un fichier de petite taille:et dès qu ajout d'un element à la fin d'une liste chainée [ par beatkof ] bonsoir je voudrai faire une fonction qui ajout un element à la fion d'une liste chainée et je n'y arrive pas voila ma fonction: #include #include s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales