У меня есть коллекция примерно из сотни отсортированных векторов
Хотя большинство векторов содержат небольшое количество целых чисел, некоторые из векторов содержат их большое количество (> 10 КБ) (таким образом, векторы не обязательно имеют одинаковый размер).
То, что я хотел бы сделать по существу перебирать от наименьшего к наибольшему целому числу, которое содержится во всех этих отсортированных векторах.
Один из способов сделать это - объединить все эти отсортированные векторы в отсортированный вектор и просто выполнить итерацию. Таким образом,
Вопрос 1: Каков самый быстрый способ объединить отсортированные векторы в отсортированный вектор?
Я уверен, с другой стороны, есть более быстрые / умные способы сделать это без слияния и повторных операций упорядочивание всего этого - возможно, итеративное извлечение наименьшего целого числа из этого набора отсортированных векторов; без их предварительного слияния ... итак:
Вопрос 2: Каков самый быстрый / лучший способ извлечь наименьший элемент из группы отсортированных vector
?
На основании ответов ниже и комментариев к вопросу я реализовал подход, в котором я создаю очередь приоритетов итераторов для отсортированных векторов. Я не уверен, что это эффективно с точки зрения производительности, но похоже, что это очень эффективно с точки зрения памяти.Я считаю, что вопрос все еще открыт, так как я не уверен, что мы еще определили самый быстрый способ.
// compare vector pointers by integers pointed
struct cmp_seeds {
bool operator () (const pair< vector<int>::iterator, vector<int>::iterator> p1, const pair< vector<int>::iterator, vector<int>::iterator> p2) const {
return *(p1.first) > *(p2.first);
}
};
int pq_heapsort_trial() {
/* Set up the Sorted Vectors */
int a1[] = { 2, 10, 100};
int a2[] = { 5, 15, 90, 200};
int a3[] = { 12 };
vector<int> v1 (a1, a1 + sizeof(a1) / sizeof(int));
vector<int> v2 (a2, a2 + sizeof(a2) / sizeof(int));
vector<int> v3 (a3, a3 + sizeof(a3) / sizeof(int));
vector< vector <int> * > sorted_vectors;
sorted_vectors.push_back(&v1);
sorted_vectors.push_back(&v2);
sorted_vectors.push_back(&v3);
/* the above simulates the "for" i have in my own code that gives me sorted vectors */
pair< vector<int>::iterator, vector<int>::iterator> c_lead;
cmp_seeds mycompare;
priority_queue< pair< vector<int>::iterator, vector<int>::iterator>, vector<pair< vector<int>::iterator, vector<int>::iterator> >, cmp_seeds> cluster_feeder(mycompare);
for (vector<vector <int> *>::iterator k = sorted_vectors.begin(); k != sorted_vectors.end(); ++k) {
cluster_feeder.push( make_pair( (*k)->begin(), (*k)->end() ));
}
while ( cluster_feeder.empty() != true) {
c_lead = cluster_feeder.top();
cluster_feeder.pop();
// sorted output
cout << *(c_lead.first) << endl;
c_lead.first++;
if (c_lead.first != c_lead.second) {
cluster_feeder.push(c_lead);
}
}
return 0;
}