[Data Structures and Algorithms - 1] Introduction & Mathematics
2018-01-26 15:00
375 查看
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
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$
...
(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} $ }
$x\equiv 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
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.
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
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}) $
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
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times New Roman"; min-height: 11.0px }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times New Roman" }
span.s1 { }
span.s2 { font: 10.5px Times }
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} $ }
$x\equiv 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
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times New Roman"; min-height: 11.0px }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times New Roman" }
span.s1 { }
span.s2 { font: 10.5px Times }
相关文章推荐
- 计算机科学类优秀书籍推荐 Mathematics (数学)& Data Structures & Algorithms (数据结构、算法) &Database (数据库)
- 计算机科学类优秀书籍推荐 Mathematics (数学)& Data Structures & Algorithms (数据结构、算法) &Database (数据库)
- 计算机科学类优秀书籍推荐 Mathematics (数学)& Data Structures & Algorithms (数据结构、算法) &Database (数据库)
- Python数据结构与算法分析学习记录(1)——基于Problem Solving with Algorithms and Data Structures using Python的学习
- Basic Data Structures and Algorithms in the Linux Kernel--reference
- Introduction to graphs and their data structures Section III[翻译]
- Data Structures and Algorithms in Java
- Pythonic Data Structures and Algorithms(Array 1)
- Pythonic Data Structures and Algorithms(Array 3)
- Data Structures and algorithm analysis—1.2.1&1.2.2&1.2.3 exponents&logarithms&series(数据结构—指数,对数,级数)
- Data Structures and Algorithms with Object-Oriented Design Patterns (3)
- Data.Structures.and.Algorithms数据结构电子书最新
- The Tomes of Delphi: Algorithms and Data Structures
- Pythonic Data Structures and Algorithms(Array 4)
- Data Structures and algorithm analysis—1.3. A Brief Introduction to Recursion(数据结构—1.3 递归的简介)(之一)
- Pythonic Data Structures and Algorithms(Array 2)
- 数据结构复习笔记(Data Structures & Algorithms in Java, 4th)-Trees
- Data Structures and Algorithms with Object-Oriented Design Patterns (1)
- Problem Solving with algorithms and data structures using Python 翻译计划
- Data Structures and Algorithms with Object-Oriented Design Patterns (2 -- under construction)