zoukankan      html  css  js  c++  java
  • [Data Structures and Algorithms

    References:

    1. Stanford University CS97SI by Jaehyun Park

    2. Introduction to Algorithms

    3. Kuangbin's ACM Template

    4. Data Structures by Dayou Liu

    5. Euler's Totient Function


    Getting Started: 

    1) What is a good algorithm?

    The answer could be about correctness, time complexity, space complexity, readability, robustness, reusability, flexibility, etc.

    However, in competitive programming, we care more about 

    • Correctness - It will result in Wrong Answer(WA)
    • Time complexity - It will result in Time Limit Exceeded(TLE)
    • Space complexity - It will result in Memory Limit Exceeded(MLE)

    In algorithms contest, we need to pay attention to the time limit, memory limit, the range of input and output.

    Example: A+B problem 

    int x;
    int y;
    cin >> x >> y;
    cout << x+y;

    1+2 is ok

    1+999999999999999 will result in overflow

    2) How to prove correctness? 

    • Prove by contradiction
    • Prove by induction(Base case, inductive step)

    Example: T(n) = T(n-1) + 1, T(1) = 0. Prove that T(n) = n - 1 for all n > 1 and n is an integer.

    Proof:

    (Base case) When n=1, T(1) = 1-1 = 0. It is correct.

    (Inductive Step) Suppoer n = k, it is correct. T(k) = k - 1.

    For n = k + 1, T(k+1) = T(k) + 1 = k - 1 + 1 = k. It is correct for n = k + 1. 

    Therefore, the algorithm is correct for all n > 0 and n is an integer.

    3) Big O Noatation

    O(1) < O(log n) < O(n) < O(nlog n) < O($n^2$) < O($n^3$) < O($2^n$) 


    1. Algebra 

    1.1 Simple Algebra Formulas:

    $$sum_{k=1}^n k^2 = frac{n(n+1)(2n+1)}{6}$$

    $$sum_{k=1}^n k^3 = (sum k)^2= (frac{n(n+1)}{2})^2$$

     

    1.2 Fast Exponentiation

    How to calculate $x^k$?

    $x^k = x*x*x...x$

    Notice that:

    $x*x = x^2$

    $x^2 * x^2 = x^4$

    ...

    double pow (double x, int k) {
           if(k==0) return 1;
           if(k==1) return x;
           return k%2==0?pow(x,k/2)*pow(x,k/2):pow(x,k-1)*x;
    }

    (Important to consider special cases when you design an algorithm)

     1) k is 0 

     2) k is 1

     3) k is even and k is not 0

     4) k is odd and k is not 1

    2. Number Theory

     2.1 Greatest Common Divisor(GCD)

    gcd(x,y) - greatest integer divides both x and y. 

    - gcd(a,b) = gcd(a, b-a)

    - gcd(a, 0) = a

    - gcd(a,b) is the smallest positive number in{$ax+by | x, y in mathbb{Z} $ } 

    $xequiv y (mod m) Rightarrow a\%m=b\%m$ 

    Properties: 
    If $a_1 equiv b_1(mod m), a_2 equiv b_2(mod m)$, then:
    $a_1 +a_2 equiv b_1+ b_2(mod m)$
    $a_1 -a_2 equiv b_1- b_2(mod m)$
    $a_1 *a_2 equiv b_1* b_2(mod m)$

    • Euclidean algorithm
    int gcd(int a, int b) {
        while(b) {int r = a%b; a = b; b = r;}
        return a;
    }
    • Extended Euclidean algorithm

    Problem: Given a,b,c. Find integer solution x,y for ax+by=c.

    If c % gcd(a,b) = 0, there are infinite many solutions. Otherwise, there is no solution.

    long long extended_gcd(long long a, long long b, long long &x, long long &y) {
        if(a==0 && b==0) return -1;
        if(b==0) {x=1,y=0; return a;}
        long long d=extended_gcd(b, a%b, y, x);
        y -= a/b*x;
        return d;
    }

     

     

    2.2 Prime Numbers

    • For any N$in mathbb{Z} $,there is $N=p_1^{e1}p^{e2}_2...p^{er}_r$. And $p_1,p_2, ..., p_r$ are prime numbers. The number of factors for N is $(e1+1)(e2+1)...(er+1)$.
    • Sieve's code
    void getPrime(int n) { 
        int i, j;
        bool flag[n + 1];
        int prime[n + 1];
        memset(flag, true, sizeof(flag)); // suppose they are all prime numbers
        int count = 0; // the number of prime numbers
        for(i = 2; i <= n; ++i) {
            if(flag[i]) prime[++count] = i;
            for(j = 1; j <= count && i*prime[j] <= n; j++) {
                flag[i*prime[j]] = false;
                if(i%prime[j] == 0) break;
            }
        }
    }

     

     

    2.3 Bionomial Coefficients

    ${n}choose{k} $= $frac{n(n-1)...(n-k+1)}{k!}$

    Use when both n and k are small. Overflow risk.

     

    2.4 Euler's Function

    $n=p_1^{n_1} * p_2^{n_2} * ... p_k^{n_k}$
    $varphi(x) = x(1-frac{1}{p_1})(1-frac{1}{p_2})...(1-frac{1}{p_k}) $

    int getPhi(int x)
    {
        float ans = x;   
        for (int p=2; p*p<=n; ++p){
            if (x % p == 0){
                while (x % p == 0)
                    x /= p;
                ans*=(1.0-(1.0/p));
            }
        }
        if (x > 1)
            ans*=(1.0-(1.0/x));
        return (int)ans;
    }

    Practice Problems: (HDU, POJ, UVa - https://vjudge.net/ ; LeetCode - leetcode.com)

    POJ 1061, 1142, 2262, 2407, 1811, 2447

    HDU 1060, 1124, 1299, 1452, 2608, 1014, 1019, 1108, 4651

    LeetCode 204

    UVa 294

     

  • 相关阅读:
    机器学习技法笔记:16 Finale
    机器学习技法笔记:15 Matrix Factorization
    机器学习技法笔记:14 Radial Basis Function Network
    机器学习技法笔记:13 Deep Learning
    机器学习技法笔记:Homework #7 Decision Tree&Random Forest相关习题
    [HTML] 条件注释判断浏览器
    [ligerUI] grid行编辑示例
    [ligerUI] grid封装调用方法
    [MVC.NET] Asp.Net MVC3 简单入门第一季
    [HTML5] 飞龙天惊-HTML5学习系列
  • 原文地址:https://www.cnblogs.com/rgvb178/p/8359525.html
Copyright © 2011-2022 走看看