c++ - 如何进一步优化这个简单的算法?

标签 c++ algorithm performance c++11 optimization

注意:这是一个编程挑战


此挑战需要使用 std::set

输入

  • 一个数字n
  • n 行,每个 jk

示例输入:

5
1 4
2 1
1 6
3 4
1 2

j 用于操作:1插入k2删除k(如果有k),3找到k

对于 j == 3,如果 kstd 中,则输出 YesNo::设置


我制作了不同版本的算法,但都太慢了。我尝试了不同的 std 函数,但 std::find 似乎是最快的,但仍然太慢。实现我自己的会更糟,所以也许我错过了库中的一个函数。我真的不知道如何进一步优化它。目前我有这个:

int main()
{
    std::set<int> set{};
    int Q = 0;
    std::cin >> Q;

    int type = 0;
    int x = 0;
    for (int i = 0; i < Q; ++i)
    {
        std::cin >> type;
        std::cin >> x;

        if (type == 1)
            set.insert(x);
        else if (type == 2)
            set.erase(x);
        else if (type == 3)
            std::cout << (std::find(std::begin(set), std::end(set), x) != std::end(set) ? "Yes" : "No") << '\n';
            //Condition may be std::find, std::count or std::binary_search
    }

    return 0;
}


挑战要求它在 2 秒内运行。以下是我的结果:

Function              Time           % over
std::find          -> 7.410s         370.50%
std::count         -> 7.881s         394.05%
std::binary_search -> 14.050s        702.50%

如您所见,我的算法比要求的算法慢 3 倍。瓶颈显然是那些功能:

Function               % of total time 
std::find          ->  77.61%
std::count         ->  80.80%
std::binary_search ->  87.59%

但目前我没有比使用 std::find 或类似函数更好的主意了。有人有办法/想法进一步优化我的代码吗?还是我遗漏了一些明显的瓶颈?

最佳答案

您想使用 set.find() 而不是 std::find(set.begin(),set.end())

set.find() 将使用集合的内部结构在 O(log(n)) 时间内定位键。而 std::find 是线性搜索,无论使用何种容器类型,都需要 O(n) 时间。

关于c++ - 如何进一步优化这个简单的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36231492/

相关文章:

sql - 编写高效的查询

c++ - 用于快速 std::wstring 分配的自定义分配器

c++ - 如果我的 Visual C++ 自定义内存分配器返回未正确对齐的 block ,会发生什么情况?

c++ - QT - 未知的调试器类型 "No engine"

c++ - C++中位运算符的定义是什么?

c++ - 如何根据目标文件中缺少的符号来实例化模板?

algorithm - TCP 慢启动与丢包时的拥塞避免

algorithm - 如何将一组唯一的数值转换为一组较短长度的唯一字母数值?

c++ - 以迭代方式复制二叉树

C# Entity Framework 4 导航属性导致提交时性能下降