删除数组中的重复条目(C ++)

时间:2012-04-20 22:42:42

标签: c++ arrays random duplicates duplicate-removal

我遇到的问题是理论上应该从数组中删除所有重复值的函数不起作用。以下是它的工作原理:

  1. 我有两个数组,然后用随机数填充它们 介于0和50之间。
  2. 我使用排序函数
  3. 按顺序排序数组值
  4. 然后我运行我的重复数据删除功能
  5. 我按顺序对数组值进行排序
  6. 然后我输出两个数组中的值
  7. 问题是,重复数据删除函数中的循环运行了19次,无论它找到多少重复条目,这都非常奇怪。此外,它仍然提供重复。

    有什么想法吗?谢谢!

    int* dedupe(int array[ARRAY_SIZE])      //remove duplicate array values and replace with new values.
    {   bool dupe = false;
        while(dupe!=true)
        {   
            for(int j=0; j<ARRAY_SIZE; j++)
            {   if(array[j] == array[j+1])
                {   array[j] = rand(); 
                    array[j] = array[j] % 51;
                    dupe = false;
                }
                else { dupe = true; // the cout part is for debugging
                        cout << dupe << endl; }
            }
        } return array;
    }
    int main()
    {
        int a[9], b[9];
        srand(time(0));
        populate(b);
        populate(a);
        sort(a,ARRAY_SIZE);
        sort(b,ARRAY_SIZE);
        dedupe(a);
        dedupe(b);
        sort(a,ARRAY_SIZE);
        sort(b,ARRAY_SIZE);
        for(int i=0; i<10; i++)
        {   cout << "a[" << i << "] = " << a[i] << "\t\t" << "b[" << i << "] = " << b[i] << endl; }
        return 0;
    }
    

    到目前为止,没有任何建议解决了这个问题。有谁知道解决方案?

3 个答案:

答案 0 :(得分:0)

你没有从for循环内部返回...所以每次都应该运行ARRAY_SIZE次。

答案 1 :(得分:0)

您要解决的问题和您提供的算法并不匹配。你真的不想删除重复项,而是保证数组中的所有元素都不同,区别在于通过删除重复项,数组中元素的数量将小于数组的大小,但是你想要的一个完整的阵列。

我不知道完美的解决方案是什么(算法上),但一个简单的答案是创建一个有效范围内的所有值的数组(因为范围很小),将其洗牌然后拿起前N个元素。可以把它想象成使用卡来选择值。

 const int array_size = 9;
 void create_array( int (&array)[array_size] ) {
    const int max_value = 51;
    int range[max_value];
    for ( int i = 0; i < max_value; ++i ) {
       range[i] = i;
    }
    std::random_shuffle( range, range+max_value );
    std::copy_n( range, array_size, array );
 }

这不是最有效的方法,但它很简单,并且只需少量元素就不会出现任何性能问题。更复杂的方法是使用范围中的随机元素初始化数组,排序和删除重复项(实际上删除,这意味着数组最后不会满)然后继续生成数字并检查它们是否是新的反对先前生成的数字。

最简单的方法是与每个其他值(线性时间)进行比较,但在9个元素的数组上,线性时间足够小,无关紧要。

答案 2 :(得分:-1)

你在做错了      array [j] = rand();      array [j] = array [j]%51

它总是有1到ARRAY SIZE !!