Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Algo trop lent :( [ Archives / Au secours ] (MoDDiB)

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é 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())) { pb avec fonctions sqrt de math.h [ par fox88 ] voici mon code : void histod::calcul_moyenne_ecartype(){ //CALCUL MOYENNE DU NB D'APPELS MOYEN JOURNALIER unsigned long accu=0; int moyenne=0;<br convertir des chaine en type int [ par super ienien ] comment convertit on des chaine de type char en type entier ou inversementmeci d'avance STL : fonction size [ par UbuRoi ] coutwarning C4267: 'argument' : conversion from 'size_t' to 'unsigned int', possible loss of dataPourquoi diable cette fonction ne retourne pas un int Pb de strcpy et de char tab[i][j] [ par fred23 ] Bonjour,J'ai ecrit les code suivant mais le strcpy ne me donne rien.Qui pourrais me dire pourquoi.?J'ai repéré la ligne avec une fleche.Merci pour vot int => chaine de caractères ? [ par kjus ] vala, il me faudrait transformer une variable int en chaine de caractère.Y a-t-il une fonction toute faite ?en fait, mon but est de l'inscrire dans un lire dans un fichier [ par skeul ] Bonjour,je rencontre qqs difficultés a faire une fonction qui lit un fichier et qui rentre la chaine de caractere dans un tableauy a comme un probleme Convertion d'une string en char [ par redpooka ] Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iostre Pb Tableaux et initialisation. [ par AstraDeon ] Bonjour,Voila je tentais une simple initinitialisation d'un tableau bidimensionnel, mais j'ai pas le resultat escomptsS, voici le code :#include int m problème de pointeur sur char (SUPER HYPER IMPORTANT -> juste pour moi...je supose) [ par levraipig ] bonjour à tous, voila moi j'ai un p'ti problème plutot embêtant.... je dois créer un class qui gère les chaines de caractères (ne me demander pas pou


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.