C ++ Как объединить отсортированные векторы в отсортированный вектор / выделить наименьший элемент из всех?

У меня есть коллекция примерно из сотни отсортированных векторов Хотя большинство векторов содержат небольшое количество целых чисел, некоторые из векторов содержат их большое количество (> 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;
}
9
задан chema989 23 November 2016 в 10:38
поделиться