У меня есть 2 временных ряда, содержащих объекты Bar, каждый объект Bar содержит переменную-член типа long и каждый временной ряд хранится в пределах своего собственного BlockingCollection. Временной ряд сортируется в порядке возрастания длинных значений.Слияние 2 алгоритм отсортированных временных рядов
Мне нравится разрабатывать алгоритм слияния, который позволяет мне отбирать панель, содержащую длинную переменную-член наименьшего значения относительно того же элемента сравнения в другом BlockingCollection.
Пример, если длинное значение, содержащееся в первом столбце (bar1) в BlockingCollection1, меньше, чем длинное значение, содержащееся в первой строке (bar2) в BlockingCollection2, затем Take() из BlockingCollection1 и Add() в MasterBlockingCollection , по сути, заканчивается объединенным потоком объектов Bar, отсортированным по значению переменной длинной переменной каждого бара.
Мне нравится позже расширять до n BlockingCollections, а не только 2. Я играл с массивами, которые содержат длинные значения, чтобы упростить отображение, но я думаю, что массивы более удобны при работе с указателями, относящимися к этому конкретному целевому алгоритму.
Интересно, может ли кто-нибудь указать мне на реализацию Linq и прокомментировать, насколько это дорого стоит такой подход. Я спрашиваю, потому что пропускная способность имеет важное значение, поскольку в коллекции собраны сотни миллионов объектов Bar. Если у кого-то есть более умная идея, чем использование Linq, это будет очень приветствоваться. Некоторое время назад я наткнулся на некоторые алгоритмы слияния идей в DrDobbs, но больше не могу найти статью. В случае, если это не очевидно теперь, таргетировать C# (.Net4.0)
Большое спасибо
Edit: Я забыл упомянуть о том, что процесс объединения должен произойти в то же время, чем рабочих, добавьте новые элементы в blockingcollections (работает на разных задачах)
Попробуйте поместить его в SortedList, который сортирует, как вам нравится, а затем 'AddRange' другого списка должен быть идеальным. – SimpleVar
@YoryeNathan, это будет O (n log n). Это можно сделать в O (n). – svick
@svick Только начальный сорт будет O (n log n), но не AddRange of SortedList отлично справляется с этим в O (n)? – SimpleVar