Data structures 找出重复的数字

Data structures 找出重复的数字,data-structures,Data Structures,这是我的算法,我和我的朋友一起写的(他们在stackoverflow网站上) 此算法将只找到第一个重复的数字并返回它。这在O(n) 我想完成这个算法,它可以帮助我获得重复的数字。考虑到我有 [1,1,3,0,51,1,5] < /代码> 我希望此算法返回2重复的数字,它们分别是1和5,重复的数字分别是3和2。如何使用O(n) 1算法重复(arr[1:n],n) 2. 3 { 4集合s=新的HashSet();i:=0; 5当我 使用地图/字典数据结构 反复浏览列表 对于列表中的每个项目,执行

这是我的算法,我和我的朋友一起写的(他们在stackoverflow网站上) 此算法将只找到第一个重复的数字并返回它。这在
O(n)
我想完成这个算法,它可以帮助我获得重复的数字。考虑到我有<代码> [1,1,3,0,51,1,5] < /代码> 我希望此算法返回
2
重复的数字,它们分别是
1和5
,重复的数字分别是
3和2
。如何使用
O(n)

1算法重复(arr[1:n],n)
2.
3   {
4集合s=新的HashSet();i:=0;
5当我
  • 使用地图/字典数据结构
  • 反复浏览列表
  • 对于列表中的每个项目,执行映射查找。如果键(项目)存在,则增加其值。如果键不存在,则插入键和初始计数

  • 您可以在Java中执行此操作:

    List<Integer> num=Arrays.asList(1,1,1,2,3,3,4,5,5,5);
        Map<Integer,Integer> countNum=new HashMap<Integer, Integer>();
        for(int n:num)
        {
            Integer nu;
            if((nu=countNum.get(n))==null)
            {
                countNum.put(n,1);
                continue;
            }
            countNum.put(n,nu+1);
        }
    
    List num=Arrays.asList(1,1,1,2,3,3,4,5,5);
    Map countNum=新的HashMap();
    for(int n:num)
    {
    整数nu;
    if((nu=countNum.get(n))==null)
    {
    countNum.put(n,1);
    继续;
    }
    countNum.put(n,nu+1);
    }
    

    与其每次迭代以获得重复的计数,不如将计数存储在map中。

    在这个特定的例子中,与其说它与算法有关,不如说它与数据结构有关:一个
    Multiset
    就像一个
    集合
    ,只是它不存储唯一的项目,而是存储每个项目的频率计数在
    Multiset
    中。基本上,
    集合
    告诉您某个特定项目是否在
    集合
    中,此外,
    Multiset
    还告诉您该特定项目在
    Multiset
    中的频率

    因此,基本上您所要做的就是从
    数组
    构造一个
    多集

    require 'multiset'
    
    print Multiset[1,1,3,0,5,1,5]
    
    是的,就这些。这张照片:

    #3 1
    #1 3
    #1 0
    #2 5
    
    如果您只需要实际的副本,只需
    删除
    计数小于
    2的项目:

    print Multiset[1,1,3,0,5,1,5].delete_with {|item, count| count < 2 }
    
    正如@suihock提到的,您还可以使用
    映射
    ,这基本上只是意味着,您必须自己进行元素计数,而不是
    多集

    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 }
    
    同样,如果您只需要副本:

    print m.select {|item, count| count > 1 }
    # { 1 => 3, 5 => 2 }
    
    但是,如果您不用自己计算,而是使用
    Enumerable#groupby
    对元素进行分组,然后将分组映射到它们的大小,您就可以更轻松地完成这项工作。最后,将其转换回
    散列

    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 }
    

    所有这些都有一个摊销的最坏情况步骤复杂度Θ(n)。

    你能写你的算法吗?真的很难,我是算法的初学者,谢谢advance@user472221:可变
    Map
    Dictionary
    数据结构通常具有摊销的最坏情况步骤复杂性
    Θ(1)
    用于插入、删除和查找。因此,@suihock建议的总摊销最坏情况步骤复杂度将为
    Θ(n)
    print m.select {|item, count| count > 1 }
    # { 1 => 3, 5 => 2 }
    
    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 }