2012-05-03 4 views
1

Bar 개체가 포함 된 2 개의 시계열이 있고 각 Bar 개체에는 long 유형의 멤버 변수가 들어 있으며 각 시계열은 자체 BlockingCollection 내에 저장됩니다. 시계열은 long 값의 오름차순으로 정렬됩니다.병합 2 계열화 된 시계열 알고리즘

다른 BlockingCollection의 동일한 비교 요소를 기준으로 가장 낮은 값의 long 멤버 변수를 포함하는 Bar를 제거 할 수있는 병합 알고리즘을 고안하고 싶습니다.

예를 들어 BlockingCollection1의 첫 번째 Bar (bar1)에 포함 된 long 값이 BlockingCollection2의 첫 번째 Bar (bar2)에 포함 된 long 값보다 작은 경우 BlockingCollection1의 Take() 및 BlockingCollection1의 Add()를 MasterBlockingCollection 기본적으로 각 Bar의 long 멤버 변수의 값에 따라 정렬 된 Bar 객체의 병합 된 스트림으로 끝납니다.

나중에 BlockingCollections를 2로 확장하는 것이 좋습니다. 매핑을 쉽게하기 위해 long 값을 보유하고있는 배열을 가지고 놀았지만이 특정 대상 알고리즘에 관련된 포인터로 작업 할 때 배열이 더 편리하다고 생각합니다.

누군가 Linq 구현을 지적하고 계산적으로 비싼 그런 접근법에 대해 의견을 말할 수 있는지 궁금합니다. 컬렉션을 통해 흐르는 수억 개의 Bar 개체가 있기 때문에 처리량이 중요하기 때문에 묻습니다. 누군가 Linq를 사용하는 것보다 더 영리한 아이디어가 있다면 그것은 매우 환영받을 것입니다. DrDobbs에서 알고리즘을 몇 시간 전에 병합하는 아이디어가 있지만 기사를 더 이상 찾을 수 없습니다. 경우는 지금 분명하지 않다, 전 C# (.Net4.0)

고마워요을 대상으로

편집 : 나는 병합 프로세스가 근로자보다 같은 시간에 발생하도록되어 있음을 언급하는 것을 잊었다 사람 blockingcollections에 새 항목 추가 (다른 작업에서 실행)

+0

좋아하는 방식으로 정렬 된 SortedList에 하나 넣고 다른 목록의'AddRange'가 완벽해야합니다. – SimpleVar

+0

@ YoryeNathan, O (n log n)이됩니다. 이 작업은 O (n)에서 수행 할 수 있습니다. – svick

+0

@svick 초기 정렬 만 O (n log n)이 될 것이지만 SortedList의 AddRange는 O (n)에 멋지게 처리하지 않습니까? – SimpleVar

답변

1

다음은 Merge의 구현입니다. O (cN) 시간에 실행해야합니다. 여기서 c는 콜렉션 수입니다. 이게 니가 찾고있는거야?

+0

mergesort는 완전히 다른 것이기 때문에'MergeSort'는이 함수의 나쁜 이름이라고 생각합니다. O (N)에서는 더 빨리 수행 할 수 있습니다. – svick

+1

MergeSort는 정렬을위한 2 단계 알고리즘입니다. 위의 방법은 실제로 두 번째 단계입니다. 병합이 더 나은 이름이 될 것입니다. – Shlomo

+1

더 빨리 수행 할 수 있다고 생각되면 더 나은 솔루션을 게시하십시오. 당신은 O (cN)보다 빠르지 않을 것입니다. – Shlomo