2012-04-20 224 views
-2

我有一个问题,理论上应该从数组中删除所有重复值的函数不起作用。这是它是如何工作的:删除阵列中的重复项(C++)

  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

你可能想看看'std :: unique':http://www.cplusplus.com/reference/algorithm/unique/ – chris 2012-04-20 22:43:54

+3

如何用一个随机数字替换一个重复的应该删除重复? [你需要什么](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)的数字? – outis 2012-04-20 22:50:06

+0

这是一个很好的观点。我不确定用什么来替换它,而不是一个随机数,因为数组本身在最后和重复数据删除之后仍然应该用随机数填充...... 此外,while循环运行,直到没有更多的重复值被发现,因此它删除重复的数字 - 理论上至少。 – 2012-04-20 22:53:44

回答

0

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

+0

因此,如果我从for循环内部返回它会一遍又一遍地运行,直到它找不到更多重复的相邻值? – 2012-04-20 22:49:18

+0

从for循环内部返回不做任何事情,仍然得到重复的值。 – 2012-04-20 22:51:59

+0

哦,我明白了。即使迟到会被设置为假,一旦它被设置为真。无论是真是假,都会重写直到最后一个循环,顺便说一句,这是访问数组越界,所以可能是一个随机的垃圾整数,因此将显示为不等。 – djechlin 2012-04-20 22:54:11

-1

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

它总是会有1到ARRAY SIZE!

+0

ARRAY_SIZE被声明为10作为全局常量。 – 2012-04-20 23:01:45

+1

@ Pirate43:在这种情况下,你调用了未定义的行为,因为'a'和'b'的大小是9,而不是10.你在尝试打印'a [i]'和' b [I]'。 – Cornstalks 2012-04-20 23:45:01

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个元素的数组,线性时间足够小而不重要。