2010-07-19 6 views
6

두 개의 배열 (또는 더 쉬운 경우 arraylists)이 있습니다. 나는 이것들을 비교할 필요가 있는데, 첫 번째 배열에 존재하는 것을 발견해야한다. 두 번째 배열에 존재하며 두 번째 배열에만 존재한다. 이러한 배열은 길이가 다르며 순서가 다를 수 있습니다. 필요하다면, 나는 그들을 정렬 할 수 있다고 생각합니다 ...두 배열 또는 arraylists를 비교하여 유사하고 다른 값을 찾습니다.

나는 이것을 함께 해킹 할 수 있다는 것을 알고 있습니다.하지만 이것은 상당히 표준적이고 효율적인/"최상의"해결책을 가지고 있다고 생각합니다. 무엇보다 나는 호기심이 많습니다.

나는 이것을 위해 C#을 사용하고 있지만 다른 언어로 솔루션을 작성하고 싶다면 도움을받을 수 있습니다.

도움 주셔서 감사합니다.

+2

우연히 숙제가 있습니까? –

+1

여기에 Linq 101 샘플을 보시면 도움이 될 것입니다 (특히 세트 연산자) : http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx – andyp

+0

아니요, 숙제가 아닙니다. 나는 단지 약 20 분 만에 나올 수있는 것보다 더 시원하고 효율적인 방법을 알고 있습니다. 저는 전에 Linq를 사용하지 않았지만, 지금은 Linq를 사용하기에 완벽한시기입니다. 제안에 감사드립니다. – Wes

답변

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

이것이 내가 생각해내는 것입니다. 난 그냥 비교하거나 뭔가를 사용하여 그것을 할 몇 가지 좋은 C#/.net 방법이 있다고 생각했습니다. 또한 linq 시도해 보겠지만, 다른 모든 실패하면이 작동합니다. – Wes

+2

목록의 크기가 n 및 m 인 경우 이러한 솔루션은 모두 O (n * m)입니다. m과 n이 클 경우 훨씬 효율적인 솔루션이 존재합니다. –

6

배열은 다음 큰 경우 이러한 작업을위한 효율적인 데이터 구조를 사용하는 것이 좋습니다; 배열은 그렇지 않습니다.

배열이 크기가 n 인 경우 순진한 해는 O (n^2) 시간입니다.

배열을 정렬하면 해당 항목을 이진 검색 할 수 있습니다. 정렬은 O (ng n) 일 가능성이 높고 검색 당 lg n의 비용으로 n 번 검색하는 것은 시간에 O (ng n)이 될 것입니다.

각 배열을 HashSet<T>으로 바꾸면 O (n) 시간 및 O (n) 여분의 공간에서 수행 할 수 있습니다.

+0

해시 셋을 사용한 적이 없지만 매우 궁금 해서요. 감사합니다. – Wes

+0

@Wes : .NET Framework 3.5에 'HashSet'이 도입되었습니다. – Brian

+1

@Wes : @Brian : "Set"은 * Visual Basic * 키워드이기 때문에 더 현명한 이름 인 "Set"대신 HashSet이라고합니다. –

관련 문제