我们有一个大小为n
的数组。我们如何才能找到n
有多少种不同类型的元素,每种元素的数量是多少?
例如:在{1,-5,2,-5,2,7,-5,-5}
,我们有4种不同的类型,金额的数组将是:{1,2,1,4}
。
所以我的问题是:
现在,我尝试在Omega(n)解决它,我尝试了很多,但我找不到方法。我尝试用哈希表来解决它。
答案 0 :(得分:1)
您正试图获取数组中元素的频率。
在JavaScript中:
hash = {};
a = [1,-5,2,-5,2,7,-5,-5];
for(var i = 0; i < a.length; ++i) {
if(hash[a[i]] === undefined)
hash[a[i]] = 0
hash[a[i]] = hash[a[i]] + 1;
}
console.log(hash.toSource());
答案 1 :(得分:0)
您使用的语法和特定数据结构因语言而异,但基本思想是在关联数据结构中存储每个值的实例数的运行计数(HashMap,Dictionary,无论您的语言是什么称呼它) )。
这是一个可以在Java中运行的示例(我猜测了您使用的语言)。 这可能是糟糕的Java,但它说明了这个想法。
int[] myArray = {1,-5,2,-5,2,7,-5,-5};
HashMap<Object,Integer> occurrences = new HashMap<Object,Integer>();
for (int i=0;i<myArray.length;i++)
{
if (occurrences.get(myArray[i]) == null)
{
occurrences.put(myArray[i],1);
}
else
{
occurrences.put(myArray[i],occurrences.get(myArray[i])+1);
}
}
然后,您可以使用HashMap像这样查找数组的不同元素 occurrences.keySet()
其他语言有自己的HashSet实现(.NET和Python中的字典,Ruby中的Hashes)。
答案 2 :(得分:0)
有不同的方法可以解决这个问题。这里提出的问题可能会以不同的方式提出。这是使用STL库中提供的std::map
的简单方法。但要记住它总是按键排序。
int arr[]={1,-5,2,-5,2,7,-5,-5};
int n=sizeof(arr)/sizeof(arr[0]);
map<int,int>v;
for(int i=0;i<n;i++)
{
if(v[arr[i]])
v[arr[i]]++;
else
v[arr[i]]=1;
}
map<int,int>::iterator it;
for(it=v.begin();it!=v.end();++it)
cout<<it->first<<" "<<it->second<<endl;
return 0;
它将显示输出
-5 4
1 1
2 2
7 1
答案 3 :(得分:0)
我建议你阅读一下&#39; Count Sort&#39;
虽然我不确定我是否理解你真正想要问的是什么。无论如何,我想你想:
1。)扫描数组并得出该数组中每个唯一元素的频率。
2.。)独特元素的总量
3.)所有线性计算时间
我想,你需要的是Counting Sort。 See algo on wiki。 你显然可以跳过排序部分。但是你必须看看它是如何进行排序的(这是你问题的有用部分)。首先,它计算每个键频率的直方图(标称大小等于原始数组中唯一元素数的数组)。这仅适用于整数(尽管您总是可以通过放置整数指针来对其他类型进行排序)。 因此,此直方图数组的每个索引都将对应于原始数组中的元素,此索引处的值将对应于原始数组中此元素的频率。
例如;
你的数组x = {3,4,3,3,1,0,1,3}
//计算后,你会得到
您的直方图数组h [0到4] = {1,2,0,4,1}
我希望这就是你所要求的