【发布时间】:2016-10-20 20:03:37
【问题描述】:
我正在努力使我的程序更有效地运行,我相信修复这个线性搜索会在速度方面有很大帮助,但我很好奇我将如何将其更改为类似二进制搜索,因为我相信列表不一定是有序的。是否有某种方法可以根据第一个参数key 对列表进行排序?
我目前的工作:
int* key_sequences::data(int key){
for(it=myList.begin(); it!=myList.end(); ++it){
if(it->first==key){
return &(it->second[0]);
}
}
return nullptr;
};
【问题讨论】:
-
没有排序的序列是不可能进行二分搜索的。
-
显而易见的答案是退出使用列表,并将其替换为更合适的数据结构(可能是
map或unordered_map,从外观上看)。根据插入/删除发生的时间/频率,您还可以考虑使用“FlatMap”——在排序数组中进行二进制搜索。 -
经常重复搜索一个序列,寻找连续的键。缓存最后的搜索结果可以将总时间从 O(n²) 减少到 O(n)。但我会把数据结构改成更合适的,比如
map。 -
您考虑过使用
std::map吗? -
除了其他 cmets,请记住,即使您出于任何原因必须坚持使用线性搜索,在连续数组(如
vector)中的线性搜索也会更快而不是链表中的线性搜索。
标签: c++ algorithm list binary-search linear-search