2009-03-05 36 views
7

Tôi gặp sự cố khi đếm các giá trị duy nhất trong một mảng và tôi cần làm như vậy mà không cần sắp xếp lại các phần tử mảng.Làm thế nào tôi có thể đếm số duy nhất trong một mảng mà không cần sắp xếp lại các phần tử mảng?

Tôi làm cách nào để thực hiện việc này?

+1

là bài tập về nhà này? –

+0

anh ấy kinda; P .... – jarus

+0

Không có gì sai với bài tập về nhà ... Cung cấp một không chỉ mất câu trả lời như họ đang có. (ví dụ, lấy câu trả lời và làm cho nó * tốt hơn *). – Arafangion

Trả lời

15

Nếu bạn có .NET 3.5 bạn có thể dễ dàng đạt được điều này với LINQ qua:

int numberOfElements = myArray.Distinct().Count(); 

Non LINQ:

List<int> uniqueValues = new List<int>(); 
for(int i = 0; i < myArray.Length; ++i) 
{ 
    if(!uniqueValues.Contains(myArray[i])) 
     uniqueValues.Add(myArray[i]); 
} 
int numberOfElements = uniqueValues.Count; 
+0

Nếu đây là một câu hỏi về bài tập về nhà, thì câu trả lời không phải là giống như để có được anh ta nhiều điểm nhưng vẫn là một câu trả lời tốt về mặt LINQ. – andleer

+0

@Andrew Đã thêm một ví dụ không phải là bài tập về nhà của LINQ. –

+0

Ví dụ không phải linq thực sự là xấu, nhưng hãy để Rich B đưa ra một giải pháp tốt hơn nếu nó thực sự là một câu hỏi về bài tập về nhà. :) (GỢI Ý: Làm cách nào bạn tránh phải lặp lại toàn bộ mảng cho mỗi mục?) – Arafangion

6

Đây là một tổ chức phi thực hiện LINQ xa hiệu quả hơn.

 var array = new int[] { 1, 2, 3, 3, 3, 4 }; 
     // .Net 3.0 - use Dictionary<int, bool> 
     // .Net 1.1 - use Hashtable 
     var set = new HashSet<int>(); 
     foreach (var item in array) { 
      if (!set.Contains(item)) set.Add(item); 
     } 
     Console.WriteLine("There are {0} distinct values. ", set.Count); 
+0

Tại sao thay vì ? – sharptooth

+0

Hiệu suất khôn ngoan nên cả hai đều giống hệt nhau, sẽ làm sạch nó lên để sử dụng HashSet để mã demo này trông ít xấu xí –

+0

Từ điển chứa phải nhanh hơn nhiều so với các mảng lớn hơn Danh sách chứa. –

0

Chỉ nên tính giá trị riêng biệt hoặc mỗi số trong mảng được tính (ví dụ: "số 5 được chứa 3 lần")?

Yêu cầu thứ hai có thể được thực hiện với các bước bắt đầu của thuật toán sắp xếp đếm.
Nó sẽ là một cái gì đó như thế này:

  • xây dựng một tập hợp chỉ số/Điều quan trọng là các yếu tố được tính
  • một phím được kết nối với một biến mà giữ số lần xuất hiện của khóa yếu tố
  • lặp mảng
    • giá trị thặng dư của chủ chốt (array [index])

Trân

1

sử dụng O (n) thời gian chạy bộ nhớ MAX_VALUE

boolean[] data = new boolean[maxValue]; 
for (int n : list) { 
    if (data[n]) counter++ 
    else data[n] = true; 
} 
Các vấn đề liên quan