Algorithme pour trouver le double des nombres dans un tableau ---la Façon la plus Rapide
J'ai besoin de la manière la plus rapide et simple de l'algorithme qui trouve le double des nombres dans un tableau, devraient également être en mesure de connaître le nombre de doublons.
Par exemple: si le tableau est {2,3,4,5,2,4,6,2,4,7,3,8,2}
Je devrais être en mesure de savoir qu'il y a quatre 2, deux de 3 et de trois 4.
Le plus souvent, le plus rapide de l'algorithme ne sera pas simple et la plus simple de ne pas être rapide 🙁
L'algorithme le plus rapide est de l'écrire vous-même 🙂
Quelle est la spécification d'entrée? De petits nombres naturels? Tout non signé de 32 bits des nombres? Des centaines de personnes? Des centaines de millions?
L'algorithme le plus rapide est de l'écrire vous-même 🙂
Quelle est la spécification d'entrée? De petits nombres naturels? Tout non signé de 32 bits des nombres? Des centaines de personnes? Des centaines de millions?
OriginalL'auteur Raviteja | 2009-12-05
Vous devez vous connecter pour publier un commentaire.
Faire une table de hachage dont la clé est la matrice de l'élément et la valeur est contre combien de fois le tableau correspondant de l'élément a eu lieu dans la gamme. C'est efficace pour le faire, mais probablement pas le moyen le plus rapide.
Quelque chose comme ceci (en pseudo-code). Vous trouver beaucoup de hachage carte des implémentations de C par googler.
OriginalL'auteur Juha Syrjälä
Cela peut être résolu avec élégance à l'aide de Linq:
En interne, il utilise probablement le hachage de la partition de la liste, mais le code se cache à l'intérieur les détails ici, nous sommes seulement dire ce à calculer. Le compilateur /runtime est libre de choisir comment calculer et optimiser comme il l'entend. Grâce à Linq ce même code sera exécuté de manière efficace si l'exécution d'une liste en mémoire, ou si la liste est dans une base de données. Dans le code réel, vous devez utiliser, mais je suppose que vous voulez savoir comment faire en interne, il travaille.
Plus impératif approche qui démontre le réel de l'algorithme est le suivant:
Ici, vous pouvez voir que nous itérer sur la liste qu'une seule fois, en gardant le nombre de chaque élément nous voir sur le chemin. Ce serait une mauvaise idée si les éléments ont été dans une base de données, donc pour de vrai code, préfèrent utiliser la méthode Linq.
La question, maintenant, dit le C comme langage.
OK merci. C n'a pas de Linq, vous devez utiliser la deuxième méthode.
Je vais laisser le traduire en C comme un exercice pour le lecteur. 🙂
OriginalL'auteur Mark Byers
voici une version en C qui le fait, avec l'entrée standard; il est aussi rapide que la longueur de l'entrée (attention, le nombre de paramètres sur la ligne de commande est limitée...), mais devrait vous donner une idée sur comment procéder:
exemple d'utilisation:
mises en garde:
si vous prévoyez de compter aussi le nombre de 10s, 11s, et ainsi de suite -> dup tableau[] doit être plus grand
laissé comme exercice est de mettre en œuvre la lecture à partir d'un tableau d'entiers et de déterminer leur position
#define MAX_VALUE 10
) et vérifier que l'entrée est>= 0
et< MAX_VALUE
pour éviter les dépassements de la mémoire tampon; par exemple, le code, un simpleassert()
serait suffisant; à l'aide destrtoul()
bien valider la saisie de l'utilisateur serait un bonusmon intention était de lui faire effectuer les vérifications tant que réfléchir à la manière de compter au-delà de 10 éléments différents. L'exercice des odeurs trop de devoirs à la maison pour donner une solution complète.
OriginalL'auteur lorenzog
Si vous connaissez les limites inférieure et supérieure, et ils ne sont pas trop éloignés, ce serait un bon endroit pour utiliser un Tri Radix. Depuis cette odeur de devoirs, je pars à l'OP pour lire l'article et de mettre en œuvre l'algorithme.
OriginalL'auteur Stephen C
Plus vous nous dire à propos de l'entrée des tableaux les plus rapides, nous pouvons faire de l'algorithme. Par exemple, pour votre exemple de nombres à un chiffre, puis la création d'un tableau de 10 éléments (indexée 0:9) et l'accumulation d'un certain nombre d'occurrences de nombre dans le droit de l'élément du tableau à (mal formulé explication, mais vous avez probablement vous attrapez ma dérive) est susceptible d'être plus rapide que le hachage. (Je dis probablement à être plus rapide car je n'ai pas fait de mesures et ne veut pas).
Je suis d'accord avec la plupart des répondants que le hachage est probablement la bonne approche pour le cas le plus général, mais il est toujours utile de réfléchir à savoir si le vôtre est un cas spécial.
OriginalL'auteur High Performance Mark
Si vous ne souhaitez pas utiliser la table de hachage ou smtg comme ça, juste trier le tableau puis de compter le nombre d'occurrences, quelque chose comme ci-dessous devrait fonctionner
OriginalL'auteur erdemoo
Si la plage de numéros est connu et les petits, vous pouvez utiliser un tableau pour garder une trace de combien de fois vous avez vu (c'est un seau de tri dans l'essence). SI elle est grande, vous pouvez les trier puis de compter les doublons comme ils le seront suivant les uns des autres.
OriginalL'auteur rmn
Vous pouvez utiliser les tables de hachage pour stocker chaque valeur d'élément de clé. Puis ajouter un +1 à chaque fois qu'une clé existe déjà.
OriginalL'auteur Y_Y
À l'aide de tables de hachage /tableaux associatifs /dictionnaires (tous la même chose, mais les modifications de terminologie entre les environnements de programmation) est le chemin à parcourir.
Comme un exemple en python:
Constructions similaires existent dans la plupart des langages de programmation.
OriginalL'auteur Gabriel Reid
> I need the fastest and simple algorithm which finds the duplicate numbers in an array, also should be able to know the number of duplicates.
Je pense que l'algorithme le plus rapide est à compter les doublons dans un tableau:
Remarque: Vous ne pouvez pas utiliser l'algorithme le plus rapide sur tous les tableaux.
OriginalL'auteur sambowry
Le premier code trie le tableau, puis déplace des éléments uniques à l'avant, en gardant une trace du nombre d'éléments. Il est plus lent que d'utiliser seau de tri, mais aussi plus pratique.
OriginalL'auteur Christoph
option 1: hash.
option 2: trier et compter ensuite des séries consécutives.
OriginalL'auteur Southern Hospitality
Il y a un "algorithme" que j'utilise tout le temps pour trouver des doublons de lignes dans un fichier sous Unix:
Si vous mettez en œuvre la même stratégie dans C, alors il est très difficile de le battre avec un amateur de stratégie, tels que les tables de hachage. Appel d'un algorithme de tri, puis composez votre propre fonction pour détecter les doublons dans la liste triée. L'algorithme de tri prend O(n*log(n)) du temps et de l'uniq fonction prend un temps linéaire. (De l'Hospitalité du sud fait une remarque similaire, mais je tiens à souligner que ce qu'il appelle "option 2" semble à la fois plus simple et plus rapide que le plus populaire des tables de hachage suggestion.)
OriginalL'auteur Greg Kuperberg
De comptage, le tri est la réponse à la question ci-dessus.Si vous voyez l'algorithme de comptage, de tri, vous trouverez qu'il y a un tableau qui est conservé pour garder le comte d'un élément que je présente dans le tableau d'origine.
OriginalL'auteur Soumajyoti
Ici est une autre solution mais il faut O(nlogn).
L'utilisation de Diviser et Conquérir approche pour trier le tableau à l'aide de fusion de tri.
Au cours de combiner l'étape de fusion de trier, rechercher les doublons en comparant les éléments dans les deux triés sous-tableaux.
OriginalL'auteur sundar