Markov C ++ lu à partir des performances de fichiers
Question
J'ai ma 2ème mission pour la classe C ++ qui comprend les chaînes de Markov. La mission est simple mais je ne suis pas en mesure de déterminer quelle est la meilleure mise en œuvre lors de la lecture des fichiers caractères.
J'ai un fichier autour de 300k. L'une des règles pour l'attribution est d'utiliser Map et les classes Vector. Dans la carte (clé est uniquement string) et les valeurs seront les vecteurs. Quand je lis à partir du fichier, je dois commencer à recueillir des paires de clés.
Exemple:
File1.txt
1234567890
1234567890
Si le produit de Markov k = 3, j'avoir dans ma carte:
key vector
123 -> 4
456 -> 7
789 -> 0
0/n1 -> 2
234 -> 5
567 -> 8
890 -> /n
/n -> NULL
La suggestion du professeur est de lire omble chevalier par char, donc mon algorithme est le suivant
while (readchar != EOF){
tempstring += readchar
increment index
if index == Markovlevel {
get nextchar if =!EOF
insert nextchar value in vector
insert tempstring to Map and assign vector
unget char
}
}
Je laisse d'autres détails. Ma question principale est que si j'ai 318.000 caractères, je vais faire le conditionnel à chaque fois que ce qui ralentit mon ordinateur beaucoup (tout nouveau MAC Pro). Un exemple de programme du professeur exécute ce fichier dans environ 5 secondes.
Je ne suis pas en mesure de comprendre ce qui est la meilleure méthode pour lire les mots de longueur fixe à partir d'un fichier texte en C ++.
Merci!
La solution
Avez-vous chronométré en fait le programme? 318.000 conditionals devrait être un morceau de gâteau pour votre nouvelle marque MAC Pro. Cela ne devrait prendre que microsecondes.
L'optimisation prématurée est la racine de tous les maux. Faites votre programme de travail en premier lieu, l'optimisation vient en deuxième position.
Autres conseils
Lecture de fichiers répétée va ralentir le programme.
Lire le fichier en blocs, de dire la taille 1024, placée dans un tampon. Ensuite, traiter ce tampon comme vous avez besoin pour l'affectation. Répétez l'opération pour le bloc suivant jusqu'à ce que vous avez terminé avec le fichier.