trouver plus occurence de l'élément dans le tableau
Ici est simple programme pour trouver l'élément qui revient le plus souvent dans un tableau:
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[]) {
int a[] = {1,2,3,4,4,4,5};
int n = sizeof(a) / sizeof(int);
int max = 0;
int result = 0;
int *b = new int[n];
for (int i = 0; i < n; i++) {
b[a[i]] = (b[a[i]] || 0) + 1;
if (b[a[i]] > max) {
max = b[a[i]];
result = a[i];
}
}
cout << result << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Mais il ne fonctionne pas; il imprime 1
. Pourquoi?
Pouvez-vous garantir que le tableau est toujours triée selon votre exemple? Ou pouvez-vous garantir que toutes les occurrences d'un élément donné sera consécutives? Si oui, plus simple, plus rapide des algorithmes en O(1) de stockage supplémentaire existent.
OriginalL'auteur user457463 | 2010-09-26
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes vecteur anway, pourquoi ne pas remplacer
int *b=new int [n];
avecstd::vector<int> b(n)
? Cela prend également soin de libération de la mémoire, vous avez oublié dedelete[] b
.Mais comme d'autres l'ont mentionné, votre solution sera de se briser si le tableau contient des éléments plus grands que n. Une meilleure approche serait de compter les éléments d'une cartographie de type int. De cette façon, vous pouvez également compte des éléments qui ne peuvent pas être utilisé comme un index de tableau, par exemple des chaînes de caractères.
Il n'y a également aucune raison de se limiter à des tableaux. Voici une solution générique qui fonctionne avec n'importe quel conteneur de moins comparable type d'élément:
Uhm, votre montage est probablement techniquement très bien, mais compte tenu de la question, je pense que ton code est trop compliqué. L'interlocuteur est encore à apprendre les bases, nous laissons pas submerger avec des modèles et des itérateur de détails pour l'instant...
Oui,
typename
est nécessaire.le
typename
s'applique àvalue_type
, de ne pasmap_t
. Si vous omettez letypename
, puismap_t::value_type
est considéré comme un non-type et puis le compilateur est accordée à rejeterby_second<map_t::value_type>
au moment de l'analyse du modèle parce queby_second
nécessite un type d'argument.Une tâche comme ça (bon, c'était de comptage de mot occurrences dans un texte) a été parmi les premiers à mes élèves jamais eu à faire. Bien sûr, à cette époque, ils ne pouvaient que utilisation modèles, mais qui était très bien. Manuellement de jongler avec la mémoire est bien pire que cela.
OriginalL'auteur fredoverflow
Vous n'avez pas initialisé votre tableau
b
. Vous pouvez le faire comme ceci:Une fois que c'est fait, vous pouvez incrémenter votre fréquence tableau:
en place de
Votre façon de faire
(b[a[i]]||0)+1
œuvres dans les langues, comme Javascript, Perl où non initialisé élément de tableau aura une valeur spéciale appeléeundef
ounull
. C++ n'a pas quelque chose comme ça et un tableau non initialisé aura ordures.OriginalL'auteur codaddict
Vous devez initialiser votre tableau b à zéro.
ne fonctionnera pas, vous ne savez pas ce qui est en b à l'origine.
Plus court code :
ATTENTION :
votre code (le mien aussi) ne peut fonctionner que si la valeur maximale est plus faible que le nombre de valeurs dans le tableau un.
Si ce n'est pas le cas et la valeur maximale est beaucoup plus grande que le nombre d'éléments, vous pouvez trier le tableau et ensuite, la recherche en temps linéaire (et de la constante de l'espace) pour la valeur maximale.
OriginalL'auteur Loïc Février
Ici, O(n), O(1) dans l'espace général de la solution qui fonctionne sur triés plages.
OriginalL'auteur jfs
application qui tire profit du fait que la carte est triée.
OriginalL'auteur user167698