2010-07-19 48 views
6

Tôi có hai mảng (hoặc arraylists nếu nó dễ dàng hơn) của chuỗi. Tôi cần phải so sánh chúng, tìm thấy chỉ tồn tại trong mảng đầu tiên, tồn tại trong cả hai, và chỉ tồn tại trong mảng thứ hai. Các mảng này có độ dài khác nhau và có thể theo các thứ tự khác nhau. Nếu cần thiết, tôi cho rằng tôi có thể sắp xếp chúng ...So sánh hai mảng hoặc mảng, tìm giá trị tương tự và khác nhau

Tôi biết tôi có thể cùng nhau hack, nhưng tôi nghĩ điều này có thể có giải pháp khá "tiêu chuẩn và hiệu quả" và tôi tò mò hơn bất cứ thứ gì.

Tôi đang sử dụng C# cho điều này, nhưng nếu bạn muốn viết giải pháp của mình bằng ngôn ngữ khác, mọi trợ giúp đều được chào đón.

Cảm ơn sự giúp đỡ!

+2

Bài tập về nhà bằng mọi cơ hội? –

+1

Hãy xem các mẫu LINQ 101 ở đây, chúng sẽ giúp (đặc biệt là các toán tử cài đặt): http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx – andyp

+0

Không có bài tập về nhà nào haha. Tôi chỉ biết rằng có một cách làm mát/hiệu quả hơn những gì tôi có thể nghĩ ra trong khoảng 20 phút. Tôi chưa từng sử dụng LINQ trước đây, nhưng đây có thể là thời điểm hoàn hảo để đi sâu vào nó. cám ơn vì sự gợi ý. – Wes

Trả lời

2
var onlyinfirst = from s in list1 where !list2.Contains(s) select s; 
var onlyinsecond = from s in list2 where !list1.Contains(s) select s; 
var onboth = from s in list1 where list2.Contains(s) select s; 
+0

Đây là những gì tôi đã đưa ra. Tôi chỉ nghĩ rằng có một số cách tốt đẹp C#/.net làm nó bằng cách sử dụng so sánh hoặc một cái gì đó. Tôi cũng sẽ cung cấp cho một số LINQ một thử, nhưng nếu tất cả những người khác thất bại này sẽ làm việc. – Wes

+2

Lưu ý rằng nếu các danh sách có kích thước n và m thì các giải pháp này là tất cả O (n * m). Có tồn tại các giải pháp hiệu quả hơn nếu m và n lớn. –

6

Nếu mảng lớn thì bạn sẽ muốn sử dụng cấu trúc dữ liệu hiệu quả cho các hoạt động này; mảng không.

Giải pháp ngây thơ là O (n^2) trong thời gian nếu các mảng có kích thước n.

Nếu bạn sắp xếp các mảng tại chỗ thì bạn có thể tìm kiếm nhị phân chúng cho các mục; phân loại có thể sẽ là O (n lg n) và tìm kiếm n lần với chi phí của lg n cho mỗi tìm kiếm cũng sẽ là O (n lg n) trong thời gian.

Nếu bạn biến từng mảng thành một số HashSet<T> trước tiên thì bạn có thể thực hiện nó trong khoảng thời gian O (n) và O (n).

+0

Tôi chưa bao giờ sử dụng một hashset nhưng rất tò mò, tôi sẽ xem xét nó, cảm ơn! – Wes

+0

@Wes: 'HashSet' được giới thiệu trong .NET Framework 3.5. – Brian

+1

@Wes: @Brian: Và nó được gọi là HashSet thay vì tên hợp lý hơn "Đặt" bởi vì ... chờ cho nó ... bởi vì "Set" là * một từ khóa của Visual Basic *. –

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