【问题标题】: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;
};

【问题讨论】:

  • 没有排序的序列是不可能进行二分搜索的。
  • 显而易见的答案是退出使用列表,并将其替换为更合适的数据结构(可能是mapunordered_map,从外观上看)。根据插入/删除发生的时间/频率,您还可以考虑使用“FlatMap”——在排序数组中进行二进制搜索。
  • 经常重复搜索一个序列,寻找连续的键。缓存最后的搜索结果可以将总时间从 O(n²) 减少到 O(n)。但我会把数据结构改成更合适的,比如map
  • 您考虑过使用std::map 吗?
  • 除了其他 cmets,请记住,即使您出于任何原因必须坚持使用线性搜索,在连续数组(如 vector)中的线性搜索也会更快而不是链表中的线性搜索。

标签: c++ algorithm list binary-search linear-search


【解决方案1】:

在简单链表中搜索是 O(n),其中n 是列表的大小。

但是,在某些实现中,人们使用三个列表指针,一个在开头,一个在中间,一个在末尾,这样当搜索出现时 - 他们可以加快过程,所以你可以在网上搜索这个.

但是,如果我是你并且对加快搜索非常感兴趣,我会尝试另一种数据结构(哈希?比如std::unordered_map)或对列表进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 2016-12-29
    • 2012-05-23
    • 1970-01-01
    • 2019-10-09
    • 2012-08-05
    • 2016-03-08
    • 2014-10-18
    相关资源
    最近更新 更多