有人可以给我一个算法来一次计算整数数组的不同元素吗?
例如,我可以尝试使用 for 循环遍历数组
我会将第一个元素存储在另一个数组中。随后的元素将与第二个数组中的元素进行比较,如果它不同,那么我会将其存储在该数组中并递增计数器。
谁能给我一个比这更好的算法。
使用 c 和 c++
有人可以给我一个算法来一次计算整数数组的不同元素吗?
例如,我可以尝试使用 for 循环遍历数组
我会将第一个元素存储在另一个数组中。随后的元素将与第二个数组中的元素进行比较,如果它不同,那么我会将其存储在该数组中并递增计数器。
谁能给我一个比这更好的算法。
使用 c 和 c++
假设您的元素是整数,并且它们的值介于0
和之间MAXVAL-1
。
#include <stdio.h>
#include <string.h>
#define MAXVAL 50
unsigned int CountDistinctsElements(unsigned int* iArray, unsigned int iNbElem) {
unsigned int ret = 0;
//this array will contains the count of each value
//for example, c[3] will contain the count of the value 3 in your original array
unsigned int c[MAXVAL];
memset(c, 0, MAXVAL*sizeof(unsigned int));
for (unsigned int i=0; i<iNbElem; i++) {
unsigned int elem = iArray[i];
if (elem < MAXVAL && c[elem] == 0) {
ret++;
}
c[elem]++;
}
return ret;
}
int main() {
unsigned int myElements[10] = {0, 25, 42, 42, 1, 2, 42, 0, 24, 24};
printf("Distincts elements : %d\n", CountDistinctsElements(myElements, 10));
return 0;
}
输出:(Ideone链接)
区别元素:6
维护一系列结构。结构应该有一个值和该值的计数器。只要您在正在测试的数组中传递一个新元素,就创建一个具有值的结构并将计数器递增 1。如果您传递数组中的现有元素,则只需访问相关结构并将其计数器递增 1。最后在你对数组进行一次完整的传递,您将在结构数组中获得所需的结果。
编辑:我不知道你只想计算元素。更新了下面的代码。
int countUnique()
{
uniqueArray[numElements];
myArray[numElements];
int counter = 0;
int uniqueElements = 0;
for(int i = 0; i < numElements; i++)
{
element tempElem = myArray[i];
if(!doesUniqueContain(tempElem, counter, uniqueArray)//If it doesn't contain it
{
uniqueArray[counter] = tempElem;
uniqueElements++;
}
}
return uniqueElements;
}
bool doesUniqueContain(element oneElement, int counter, array *uniqueArray)
{
if(counter == 0)
{
return false; //No elements, so it doesn't contain this element.
}
for(int i = 0; i < counter; i++)
{
if(uniqueArray[i] == oneElement)
return true;
}
return false;
}
这只是为了让您可以看到逻辑
如何使用哈希表(在 Java HashMap 或 C# 字典意义上)来计算元素?基本上,您创建一个空哈希表,其中数组元素类型作为键类型,计数作为值。然后你遍历你的列表。如果该元素尚未在哈希表中,则将其添加为计数 1,否则将增加该元素的计数。