搜索列表的更快方法?
Posted
技术标签:
【中文标题】搜索列表的更快方法?【英文标题】:Faster way to search list? 【发布时间】: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
)中的线性搜索也会更快而不是链表中的线性搜索。
【参考方案1】:
在简单链表中搜索是 O(n),其中n
是列表的大小。
但是,在某些实现中,人们使用三个列表指针,一个在开头,一个在中间,一个在末尾,这样当搜索出现时 - 他们可以加快过程,所以你可以在网上搜索这个.
但是,如果我是你并且对加快搜索非常感兴趣,我会尝试另一种数据结构(哈希?比如std::unordered_map
)或对列表进行排序。
【讨论】:
以上是关于搜索列表的更快方法?的主要内容,如果未能解决你的问题,请参考以下文章