【发布时间】:2012-02-19 06:33:01
【问题描述】:
我有大约一百个左右排序的vector<int> 的集合虽然大多数向量中都有少量整数,但其中一些向量包含大量 (>10K) 个整数(因此向量没有' t 必须具有相同的大小)。
我想做的基本上是遍历所有这些排序向量中包含的从最小到最大的整数。
一种方法是将所有这些排序的向量合并为一个排序的向量并简单地迭代。因此,
问题 1: 将已排序的向量合并为已排序的向量的最快方法是什么?
另一方面,我确信有更快/更聪明的方法来完成此任务,而无需合并和重新排序整个事情——也许从这个排序向量集合中迭代地弹出最小整数;没有先合并它们..所以:
问题 2:从一堆已排序的vector<int>'s 中弹出最少元素的禁食/最佳方法是什么?
根据下面的回复,以及对问题的 cmet,我已经实现了一种方法,我为排序的向量创建了迭代器的优先级队列。我不确定这是否具有性能效率,但它似乎非常节省内存。我认为这个问题仍然悬而未决,因为我不确定我们是否已经建立了最快的方式。
// 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;
}
【问题讨论】:
-
1) 如果空间不是问题,则将 CS101 中的排序范围标准合并到一个新向量中(或者只是想一想,然后做显而易见的事情)。 2)在你到处乱扔东西之前,确保你了解标准容器的复杂性保证;修改
std::vector通常相当昂贵。 3) 停止使用 t'he apo'strophes! -
@Kerrek-SB 谢谢,稍微修正了格式——我很高兴简单地将向量合并成一个更大的向量和排序;但我想知道是否有更快的方法来做到这一点。
-
不不,您执行排序合并。想一想,有一种明显的方法可以利用输入范围的顺序来创建已经排序的输出范围。
-
@Kerrek-SB 我想我明白你的意思了,我知道如何对两个排序向量使用常规合并函数;这可以递归/迭代地工作吗?如何对超过 2 个排序向量进行“多重合并”?
-
使用优先级队列(堆)来存储向量的第一个元素。
标签: c++ sorting vector mergesort processing-efficiency