2012-04-20 249 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個元素的數組,線性時間足夠小而不重要。