Dans ce cas particulier, il ne s'agit pas de l'algorithme, mais de la structure de données: Multiset
est comme un Set
, sauf qu'il ne stocke pas seulement des éléments uniques, mais il stocke le nombre de fois que chaque élément est dans le Multiset
. Fondamentalement, un Set
vous indique si un élément particulier est dans le Set
du tout, un Multiset
en plus vous indique également la fréquence ce point particulier est dans le Multiset
. Donc, tout ce que vous avez à faire est de construire un Multiset
à partir de Array
. Voici un exemple dans Ruby:
require 'multiset'
print Multiset[1,1,3,0,5,1,5]
Oui, c'est tout ce qu'il y a à faire. Cette impression:
#3 1
#1 3
#1 0
#2 5
Si vous ne souhaitez que des doublons réels, il vous suffit delete
ces éléments avec un nombre inférieur à 2
:
print Multiset[1,1,3,0,5,1,5].delete_with {|item, count| count < 2 }
Cette impression juste
#1 3
#2 5
Comme @suihock mentionne , vous pouvez également utiliser un Map
, ce qui signifie simplement qu'au lieu de Multiset
prendre soin de l'élément comptant pour vous, vous devez le faire vous-même:
m = [1,1,3,0,5,1,5].reduce(Hash.new(0)) {|map, item| map.tap { map[item] += 1 }}
print m
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
Encore une fois, si vous voulez seulement les doublons:
print m.select {|item, count| count > 1 }
# { 1 => 3, 5 => 2 }
Mais vous pouvez avoir ce plus facile si au lieu de vous compter, vous utilisez Enumerable#group_by
pour regrouper les éléments par eux-mêmes et ensuite cartographier les groupements à leurs tailles.Enfin, reconvertir une Hash
:
print Hash[[1,1,3,0,5,1,5].group_by(&->x{x}).map {|n, ns| [n, ns.size] }]
# { 1 => 3, 3 => 1, 0 => 1, 5 => 2 }
Tous ces éléments ont une complexité étape du pire amorti Θ (n).
merci Donc votre algorithme sera O (n)? – user472221
oui c'est juste une boucle. – Emil
merci d'avance – user472221