-2

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

  1. 我有两个数组,然后我用 0 到 50 之间的随机数填充它们。
  2. 我使用排序函数对数组值进行排序
  3. 然后我运行我的重复数据删除功能
  4. 我再次按顺序对数组值进行排序
  5. 然后我输出两个数组中的值

问题是,重复数据删除函数中的循环运行了 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;
}

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

4

3 回答 3

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 个元素的数组上,线性时间足够小,无关紧要。

于 2012-04-21T00:54:58.447 回答
0

你不是从 for 循环内部返回的......所以它应该每次都运行 ARRAY_SIZE 次。

于 2012-04-20T22:45:30.933 回答
-1

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

它总是有 1 到 ARRAY SIZE!

于 2012-04-20T22:51:59.390 回答