如何在一次传递中计算数组的不同元素?

时间:2013-09-20 12:38:02

标签: data-structures

有人可以给我一个算法来计算一次通过的整数数组的不同元素。

例如,我可以尝试使用for循环遍历数组

我将第一个元素存储在另一个数组中。后续元素将与第二个数组中的元素进行比较,如果它是不同的,那么我将把它存储在该数组中并递增计数器。

有人可以给我一个比这更好的算法。

使用c和c ++

4 个答案:

答案 0 :(得分:1)

假设您的元素是整数且其值介于0MAXVAL-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 link

区分元素:6

答案 1 :(得分:0)

维护一系列结构。 结构应该有一个值和该值的计数器。 在测试的数组中传递一个新元素后,立即创建一个带有值的结构,并将计数器递增1.如果您传递了数组中的现有元素,则只需访问相关结构并将其计数器递增1。 最后,在完成数组的一次完整传递后,您将在结构数组中获得所需的结果。

答案 2 :(得分:0)

编辑:我不知道您只想计算元素。更新了以下代码。

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

这只是为了让你看到逻辑

答案 3 :(得分:0)

如何使用哈希表(在Java HashMap或C#Dictionary意义上)来计算元素?基本上,您创建一个空哈希表,其中数组元素类型为键类型,计数为值。然后你迭代你的列表。如果元素尚未在哈希表中,则使用count 1添加它,否则增加该元素的计数。