zoukankan      html  css  js  c++  java
  • 对数复杂度算法

      二分搜索(binary search):给定一个整数X和整数A1,A1,...,AN-1,后者已经预先排序并在内存中,求下标 i 使得 Ai = X,如果X不在数据中,则返回-1。

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 const int NOT_FOUND = -1;
     6 template <typename Comparable>
     7 int binarySearch(const vector<Comparable> &a, const Comparable &x) {
     8     int low = 0, high = a.size() - 1;
     9     while(low <= high) {
    10         int mid = (low + high) / 2;
    11         if(a[mid] < x) {
    12             low = mid + 1;
    13         } else if(a[mid] > x) {
    14             high = mid - 1;
    15         } else {
    16             return mid;
    17         }
    18     }
    19     return NOT_FOUND;
    20 }    //时间复杂度为O(logN)
    21 
    22 int main() {
    23     vector<int> a;
    24     for(int i = 0; i < 20; ++i) {
    25         a.push_back(i * 2);
    26     }
    27     int mid;
    28     mid = binarySearch(a, 16);
    29     cout << mid << endl;
    30     return 0;
    31 }

    欧几里得算法

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 long gcd(long m, long n) {
     6     //欧几里得算法
     7     //m大于等于n
     8     while(n != 0) {
     9         long rem = m % n;
    10         m = n;
    11         n = rem;
    12     }
    13     return m;
    14 }    //时间复杂度为O(logN)
    15 
    16 int main() {
    17     cout << gcd(50, 15) << endl;
    18     cout << gcd(1989, 1590) << endl;
    19     return 0;
    20 }

    幂运算:如果N是偶数,XN = XN/2 * XN/2,如果N是奇数,则XN = X(N-1)/2 * X(N-1)/2 * X。

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 long pow(long x, int n) {
     6     if(n == 0)
     7         return 1;
     8     if(n == 1) 
     9         return x;
    10     if(n%2 == 0)
    11         return pow(x * x, n/2);
    12     else 
    13         return pow(x * x, n/2) * x;
    14 }
    15 
    16 int main() {
    17     cout << pow(2, 10) << endl;
    18     cout << pow(2, 7) << endl;
    19     return 0;
    20 }

    第11行若替换为 return pow(pow(x * x, 2), n/2); 或 return pow(pow(x, n/2), 2); ,当n是2时,程序会产生一个无限循环。

    当第11行替换为 return pow(x, n/2) * pow(x, n/2); 时,会影响程序的效率。

  • 相关阅读:
    socket学习笔记——获取域名与IP(linux)
    socket学习笔记——实现收发文件(Windows)
    socket学习笔记——IO口的基本操作(读、写)
    Microsoft Visual C++ 2010(86) Redistributable不能安装完美解决
    AD转换精度的计算
    cuda编程基础
    CUDA中并行规约(Parallel Reduction)的优化
    Warp divergence
    提取图片中文字
    GPU基本概念详解
  • 原文地址:https://www.cnblogs.com/wjq-Law/p/4901592.html
Copyright © 2011-2022 走看看