Data structures 找出重复的数字
这是我的算法,我和我的朋友一起写的(他们在stackoverflow网站上) 此算法将只找到第一个重复的数字并返回它。这在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当我 使用地图/字典数据结构 反复浏览列表 对于列表中的每个项目,执行
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 }