zoukankan      html  css  js  c++  java
  • Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    有些个算法对有序的和无序的数据都能应用,但多数情况下,他们在输入数据有序时才最有用。

    下列算法要求输入数据必须有序:

    • binary_search, upper_bound, lower_bound, equal_range

      这些算法均使用了二分查找 (binary_search) 以期达到 logarithmic-time lookups,要求数据必须有序。

    • set_union, set_intersection, set_difference, set_symmeteric_difference

      这些算法要求保证时间复杂度为线性,所以输入数据必须有序。

    • merge, inplace_merge

      这两个算法内部使用 merge sort 来完成运算且要求线性时间,也要求输入必须有序。

    • includes

      也要求线性时间,输入须有序。

    下列算法要求对数据顺序无强制要求,但最好有序:

    • unique
    • unique_copy

    STL 允许我们自己定义排序算法,为了让程序正确的运行,我们必须保证排序时候所用的比较算法和上述的算法中使用的比较算法相同,例如下面的例子中:

    vector<int> v;
    //...  putting values to this vector.
    
    sort(v.begin(), v.end(), greater<int>); // Sorted in descending order.
    
    bool a4Exists =
            binary_search(v.begin(), v.end(), 5); // Assumes vector sorted in ascending range
    

    试图从降序排列的数据中按照升序算法去找一个数据,很有可能会出问题,而下面的表达式中,在 binary_search 中指定比较算法为排序算法中所使用的比较算法,则没有问题:

    bool ret = binary_search(v.begin(), v.end(), 5, greater<int>());
    

    下面是完成的测试代码:

    #include <vector>
    #include <algorithm>
    #include <iostream>
    
    using namespace std;
    
    #define N       100
    
    #define show(s,m) cout<< m ;if (s) { cout << " 5 exists!" << endl; } else { cout << " 5  not existed!" << endl; }
    
    
    int main(int argc, char *argv[])
    {
        srand(time(NULL));
        vector<int> v(N);
        for (int i = 0; i < N; ++i)
        {
            v[i] = i;
        }
    
        random_shuffle(v.begin(), v.end());
    
        sort(v.begin(), v.end(), greater<int>());
    
        bool ret = binary_search(v.begin(), v.end(), 5);
        show(ret, "Searching in different compare function:");
    
        ret=binary_search(v.begin(), v.end(), 5, greater<int>());
        show(ret, "Searching in same compare function:");
        return 0;
    }
    

    下面是输出:

    Welcome to the Emacs shell
    
    ~/Documents/MetaWebBlog/org $ ~/tmp $ ./test
    Searching in different compare function:5  not existed!
    Searching in same compare function:5 exists!
    
  • 相关阅读:
    前端 JS,localStorage/sessionStorage、cookie 及 url 等实现前台数据共享、传输
    webpack 利用Code Splitting 分批打包、按需下载
    React项目之BrowserRouter路由方式之-------生产环境404问题
    React生产环境打包&&后台环境运行(有跨域+无跨域)
    React前台改用HashRouter并解决两个问题
    React路由基础
    React前台404组件页面+路由控制重定向
    react调用方法
    JavaScript 数组遍历方法的对比
    数据可视化相关库说明
  • 原文地址:https://www.cnblogs.com/yangyingchao/p/3426151.html
Copyright © 2011-2022 走看看