2013-07-23 70 views
-1

我想要一個算法,通過二維數組,並保證每列都有不同的數字。如果在數組中找到了一個重複的數字,它應該用一個隨機數字替換。隨機數還必須保持唯一性。檢測二維數組中列的重複

如果我們放一個隨機數,整列應該是唯一的。

是否有可能獲得O(N)解決方案?

+2

如果隨機值恰好是一個欺騙是什麼? – aaronman

+0

是你的colums命令或不? (如果有重複的號碼總是連續的或不) – nio

+0

@aaronman它應該被替換爲另一個號碼。 – Andre

回答

1

我能想到的最好方法是爲每列創建一個unordered_map<int,bool>,迭代遍歷列,並且如果您第一次看到一個數字,則將該映射設置爲true,如果該值已爲true,則它是一個僞造替換它帶有一個隨機數。然後檢查地圖中的隨機數,並做同樣的事情,如果這也是一個愚蠢的事情,你將不得不用一個隨機數再次替換它。這個算法會喜歡在線性時間運行,但是由於隨機數的可能性,它可以無限運行。

僞代碼

2d_array // assume M rows by N cols 
array_of_hashtables // N length 
for each col 
    for each row 
     if array_of_hashtables[2d_array[row][col]] == false 
      set it to true 
     else 
      do 
       set 2d_array[row][col] to random 
      while array_of_hashtables[2d_array[row][col]] == true 
    end 
end 

不寫僞代碼的一個巨大的風扇,但是這是對的

+0

你能證明你的想法與僞代碼? – Andre

+0

當然,但如果你自己做,它會更好 – aaronman

+0

@Mahmoud它已經完成 – aaronman

1

做一個std::set並插入一步每一列的一步元素,同時檢查的大小組。如果大小更改,插入的值不是重複的,如果它只是隨機化一個值並將其重新添加到集合中。如果大小改變,你可以繼續。

+0

'std :: set'沒有固定的時間訪問 – aaronman

+0

之後我需要將列複製到數組中? – Andre

+0

@Mahmoud不,爲什麼?你只需使用'std :: set'來挑選重複項。您將列複製到集合中。 –

0

只爲它赫克,這裏是Alexandru Barbarosie的解決方案的實現:

#include <iostream> 
#include <set> 
#include <cstdlib> 
#include <ctime> 

using namespace std; 

int main() 
{ 
    int L = 3; 
    int W = 3; 
    int R = 3;  
    int a[L][W];  
    srand(time(NULL));  
    for (int i = 0; i < L; i++) 
    { 
     for (int j = 0; j < W; j++) 
     { 
      a[i][j] = rand() % R + 1; 
      cout << a[i][j] << " "; 
     } 
     cout << endl; 
    }  
    cout << endl; 

    set<int> s;  
    int n = 0;  
    for (int j = 0; j < W; j++) 
    { 
     for (int i = 0; i < L; i++) 
     { 
      s.insert(a[i][j]); 
      if (s.size() != n) 
       n = s.size(); 
      else 
       a[i--][j] = rand() % R + 1; 
     } 
     s.clear(); 
     n = 0; 
    } 

    for (int i = 0; i < L; i++) 
    { 
     for (int j = 0; j < W; j++) 
      cout << a[i][j] << " "; 
     cout << endl; 
    } 
} 
+0

在C++ 11中,你應該使用C++的隨機引擎而不是舊c風格的做 – aaronman

+0

這是什麼意思? a [i - ] [j] = rand()%R + 1;爲什麼我 - ? – Andre

+0

@Mahmoud他用'i - '因爲他想把'i'保持在同一個數字,所以循環檢查隨機數是否是一個重複數,'rand()%R + 1'產生一個1和3我猜不是你想要的 – aaronman