【发布时间】:2017-07-26 19:25:14
【问题描述】:
我有一个包含数百万个项目的类,每个项目都有一个 int 类型的 label。我需要根据它们相似的标签对项目进行分区,所以最后我返回一个vector<MyClass>。首先,我根据标签对所有项目进行排序。然后,在 for 循环中,我将每个标签值与前一个值进行比较,如果相同,我将其存储在 myclass_temp 中,直到 label != previous_label。如果label != previous_label 我将这个myclass_temp 添加到vector<MyClass>,然后我删除myclass_temp。我认为代码是不言自明的。
该程序运行良好,但速度很慢,有没有更好的方法来加速它?我相信因为我一开始就对项目进行排序,所以应该有一种更快的方法来简单地对具有相似标签的项目进行分区。
第二个问题是如何计算此算法的 O 分数以及任何建议的更快解决方案? 请随时更正我的代码。
vector <MyClass> PartitionByLabels(MyClass &myclass){
/// sort MyClass items based on label number
printf ("Sorting items by label number... \n");
std::sort(myclass.begin(), myclass.end(), compare_labels);
vector <MyClass> myClasses_vec;
MyClass myclass_temp;
int previous_label=0, label=0;
int total_items;
/// partition myclass items based on similar labels
for (int i=0; i < myclass.size(); i++){
label = myclass[i].label;
if (label == previous_label){
myclass_temp.push_back(myclass[i]);
previous_label = label;
/// add the last similar items
if (i == myclass.size()-1){
myClasses_vec.push_back(myclass_temp);
total_items +=myclass_temp.size();
}
} else{
myClasses_vec.push_back(myclass_temp);
total_items +=myclass_temp.size();
myclass_temp.EraseItems();
myclass_temp.push_back(myclass[i]);
previous_label = label;
}
}
printf("Total number of items: %d \n", total_items);
return myClasses_vec;
}
【问题讨论】:
-
你试过
std::partition吗?
标签: c++ sorting optimization big-o partitioning