2010-03-21 71 views
6

Tôi có một số số được lưu trữ trong vectơ. Tôi muốn tìm số nào xuất hiện nhiều nhất trong vectơ.Tìm số nào xuất hiện nhiều nhất trong một vector

Có bất kỳ thuật toán dễ dàng/nhanh nào (STL hoặc bất kỳ thuật toán nào) thực hiện điều này không?

+0

Xem câu hỏi như: http://stackoverflow.com/questions/1204313/counting-occurences-in-a-vector, http://stackoverflow.com/questions/2184336/how-to-get-the-most -represented-object-from-an-array – outis

Trả lời

6

Sắp xếp, sau đó lặp lại thông qua nó và giữ một bộ đếm mà bạn tăng khi số hiện tại giống với số trước đó và đặt lại về 0 nếu không. Ngoài ra, hãy theo dõi giá trị cao nhất của bộ đếm cho đến nay và số lượng hiện tại là khi giá trị đó đạt được. Giải pháp này là O(n log n) (vì sắp xếp). Ngoài ra, bạn có thể sử dụng hashmap từ int đến int (hoặc nếu bạn biết các số nằm trong phạm vi giới hạn, bạn chỉ có thể sử dụng mảng) và lặp lại trên vectơ, tăng the_hashmap[current_number] cho 1 cho mỗi số. Sau đó lặp lại thông qua hashmap để tìm giá trị lớn nhất của nó (và khóa thuộc về nó). Điều này đòi hỏi một cơ sở dữ liệu hashmap mặc dù (trừ khi bạn có thể sử dụng mảng cũng sẽ nhanh hơn), mà không phải là một phần của STL.

+0

Chỉ cần thêm rõ ràng, để phân loại bằng cách sử dụng sắp xếp của STL: http://www.cplusplus.com/reference/algorithm/sort/ –

+3

@ Steve314: unordered_map sẽ có trong sắp tới Tiêu chuẩn. Nó không nằm trong tiêu chuẩn năm 2003 (tức là hiện hành). – sepp2k

+0

Wierd - Tôi bằng cách nào đó có ý tưởng rằng TR1 là bản sửa đổi văn bản đầu tiên năm 2003 ". – Steve314

0

Đây là cách tôi đã làm nó:

int max=0,mostvalue=a[0]; 
    for(i=0;i<a.size();i++) 
    { 
     co = (int)count(a.begin(), a.end(), a[i]); 
     if(co > max) 
     {  max = co; 
       mostvalue = a[i]; 
     } 
    } 

Tôi chỉ không biết nhanh như thế nào nó là, ví dụ: O()? Nếu ai đó có thể tính toán nó và đăng nó ở đây thì sẽ ổn thôi.

+3

Đó là O (n * n), vì vậy không phải là phương pháp hiệu quả nhất nhưng nó là chỉ đọc và không yêu cầu lưu trữ bổ sung nếu đó là quan trọng. –

+2

Đây là O (n^2), bởi vì mỗi khi bạn gọi số, nó nhìn vào mọi phần tử trong vectơ. Nó có thể được thực hiện trong O (n) (http://stackoverflow.com/questions/512590/computing-the-statistical-mode/512601#512601) –

3

Nếu bạn muốn tránh phân loại vector của bạn v, sử dụng bản đồ:

int max = 0; 
int most_common = -1; 
map<int,int> m; 
for (vi = v.begin(); vi != v.end(); vi++) { 
    m[*vi]++; 
    if (m[*vi] > max) { 
    max = m[*vi]; 
    most_common = *vi; 
    } 
} 

Điều này đòi hỏi nhiều bộ nhớ hơn và có một thời gian chạy dự kiến ​​rất giống nhau. Bộ nhớ được yêu cầu phải theo thứ tự của bản sao vector đầy đủ, ít hơn nếu có nhiều mục trùng lặp.

Các vấn đề liên quan