查找数组中不同元素的数量

时间:2015-01-03 18:54:57

标签: arrays algorithm hashtable big-o

我们有一个大小为n的数组。我们如何才能找到n有多少种不同类型的元素,每种元素的数量是多少?

例如:在{1,-5,2,-5,2,7,-5,-5},我们有4种不同的类型,金额的数组将是:{1,2,1,4}

所以我的问题是:

  1. 我们如何才能找到阵列中有多少不同的元素?
  2. 我们如何计算每个人的金额?
  3. 现在,我尝试在Omega(n)解决它,我尝试了很多,但我找不到方法。我尝试用哈希表来解决它。

4 个答案:

答案 0 :(得分:1)

您正试图获取数组中元素的频率。

  • 初始化一个哈希,其中每个新键都以值0初始化。
  • 循环遍历数组并将此键添加到哈希并递增值。

在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}

我希望这就是你所要求的