이 내가 생각 특정 목적을위한 가장 빠른 데이터 구조 & 알고리즘 될 수 없습니다, 그러나 충분히 빠르게 할 수있다. 직접 테스트 해보십시오.
std::forward_list
또는 심지어 std::vector
은 실제 시나리오에 따라 더 빠를 수도 있습니다 (큰 -O 표기법의 상수 요소).
tmyklebu 언급 된 다른 접근 방식 in the comments : 시나리오에 따라 요청시 병합하는 것이 더 빠를 수도 있습니다. 모든 데이터 세트를 개별적으로 저장하고 vector
에 병합하여 이벤트 핸들러에 전달하거나 "증가"가 개별 데이터 세트의 다음 요소를 가져 오는 "병합"반복자를 사용합니다.
추가 성능 향상은 사용자 지정 메모리 풀 -> 사용자 지정 할당자를 사용하여 얻을 수 있습니다.
#include <set>
#include <iostream>
#include <iterator>
#include <algorithm>
// inserts a sorted range into the `to` container
template < typename To, typename InputIt >
void insert_new_sorted(To& to,
InputIt beg_old, InputIt end_old,
InputIt beg_new, InputIt end_new)
{
auto const& comp = to.value_comp();
typename To::iterator i = to.begin();
// might improve performance: don't remove elements which are in both
// ranges (old and new)
while(beg_old != end_old && beg_new != end_new)
{
if(comp(*beg_old, *beg_new))
{
// remove old element
i = to.find(*beg_old); // "slow", no hint :(
i = to.erase(i);
++beg_old;
}else if(comp(*beg_new, *beg_old))
{
// insert new element
// using the hint to achieve better performance
i = to.insert(i, *beg_new);
++beg_new;
}else
{
// both equal, do nothing
++beg_new;
++beg_old;
}
}
// remove remaining old elements
for(; beg_old != end_old; ++beg_old)
{
to.erase(to.find(*beg_old)); // "slow", no hint :(
}
// insert remaining new elements
for(; beg_new != end_new; ++beg_new)
{
i = to.insert(i, *beg_new);
}
std::copy(to.begin(), to.end(),
std::ostream_iterator<typename To::value_type>(std::cout, ", "));
std::cout << std::endl;
}
int main()
{
using set_t = std::multiset<double>;
set_t const A = {1, 3, 4, 6};
set_t const B = {1, 2, 3};
set_t const C = {2, 3, 5};
set_t const A2 = {2, 4, 7, 8};
set_t result;
insert_new_sorted(result, A.end(), A.end(), A.begin(), A.end());
insert_new_sorted(result, B.end(), B.end(), B.begin(), B.end());
insert_new_sorted(result, C.end(), C.end(), C.begin(), C.end());
insert_new_sorted(result, A.begin(), A.end(), A2.begin(), A2.end());
}
출력 :
1, 3, 4, 6,
1, 1, 2, 3, 3, 4, 6,
1, 1, 2, 2, 3, 3, 3, 4, 5, 6,
1, 2, 2, 2, 3, 3, 4, 5, 7, 8,
다른 접근 : 삽입 된 요소의 반복자를 저장하여 지우기 속도를 높입니다.
OP가 질문을 향상시킬 수 있도록 downvote 경우 적어도 코멘트를 남겨주세요. – dyp
가장 빠른 상상할 수있는 알고리즘은 [양자 bogosort] (http://en.wikipedia.org/wiki/Bogosort)입니다. – Hauleth
각 패킷의 번호는 항상 정렬됩니까? aka : 예제 A, B, C 및 A는 각각 낮은 순위에서 높은 순위로 정렬됩니다. (그렇다면, 당신은 그것을 당신의 종류로 활용할 수 있습니다). – collinjsimpson