[Data Structures and Algorithms - 1] Introduction & Mathematics
References:
1. Stanford University CS97SI by Jaehyun Park
3. Kuangbin's ACM Template
4. Data Structures by Dayou Liu
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.
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
[Data Structures and Algorithms - 1] Introduction & Mathematics的更多相关文章
- CSIS 1119B/C Introduction to Data Structures and Algorithms
CSIS 1119B/C Introduction to Data Structures and Algorithms Programming Assignment TwoDue Date: 18 A ...
- CSC 172 (Data Structures and Algorithms)
Project #3 (STREET MAPPING)CSC 172 (Data Structures and Algorithms), Spring 2019,University of Roche ...
- Basic Data Structures and Algorithms in the Linux Kernel--reference
http://luisbg.blogalia.com/historias/74062 Thanks to Vijay D'Silva's brilliant answer in cstheory.st ...
- 剪短的python数据结构和算法的书《Data Structures and Algorithms Using Python》
按书上练习完,就可以知道日常的用处啦 #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving wit ...
- 6-1 Deque(25 分)Data Structures and Algorithms (English)
A "deque" is a data structure consisting of a list of items, on which the following operat ...
- 学习笔记之Problem Solving with Algorithms and Data Structures using Python
Problem Solving with Algorithms and Data Structures using Python — Problem Solving with Algorithms a ...
- Algorithms & Data structures in C++& GO ( Lock Free Queue)
https://github.com/xtaci/algorithms //已实现 ( Implemented ): Array shuffle https://github.com/xtaci/al ...
- Persistent Data Structures
原文链接:http://www.codeproject.com/Articles/9680/Persistent-Data-Structures Introduction When you hear ...
- The Swiss Army Knife of Data Structures … in C#
"I worked up a full implementation as well but I decided that it was too complicated to post in ...
随机推荐
- injection for Xcode10使用方法
对于一个使用Xcode的使用者来说,麻烦的地方在于使用代码布置界面时候的调试,5s改一下代码,用10s查看修改效果,如果电脑配置稍低,时间更长,这是病,得治,哈哈.下面就来说一下injection的使 ...
- webpack之理解loader
我们在写webpack配置文件的时候,应该有注意到经常用到loader这个配置项,那么loader是用来做什么的呢? loader其实是用来将源文件经过转化处理之后再输出新文件. 如果是数组形式的话, ...
- 洛谷P4525 【模板】自适应辛普森法1(simpson积分)
题目描述 计算积分 结果保留至小数点后6位. 数据保证计算过程中分母不为0且积分能够收敛. 输入输出格式 输入格式: 一行,包含6个实数a,b,c,d,L,R 输出格式: 一行,积分值,保留至小数点后 ...
- python中的extend和append
list.append(object) 向列表中添加一个对象object list.extend(sequence) 把一个序列seq的内容添加到列表中 old = ['a', 'b'] new = ...
- 常用模块 - datetime模块
一.简介 datetime是Python处理日期和时间的标准库. 1.datetime模块中常用的类: 类名 功能说明 date 日期对象,常用的属性有year, month, day time 时间 ...
- Sass变量及嵌套
1. 变量:SASS允许使用变量,所有变量以$开头. 变量声明:$highlight-color: #000; 注意:变量可以在css规则块定义之外存在.如下例子: $nav-color: #F90; ...
- 使用ansible安装lnmp
主机互信 生成密钥对,并将公钥发送给其他需要操作的主机 ssh-keygen -t rsa cd /root/.ssh ssh-copy-id -i id_rsa.pub root@192.168.1 ...
- Python学习手册之字符类和元字符深入
在上一篇文章中,我们介绍了 Python 的正则表达式和元字符,现在我们介绍 Python 的字符类和对元字符进行深入讲解.查看上一篇文章请点击:https://www.cnblogs.com/dus ...
- 实验6 shell程序设计一(2)
编写一段bash shell程序, 根据键盘输入的学生成绩,显示相应的成绩登等级, 其中 60分以下为"Failed!", 60-69分为"Passed!", ...
- 安装使用supervisor来启动服务
supervisor 使用方法 supervisor(官网)是一个unix的系统进程管理软件,可以用它来管理apache.nginx等服务, 若服务挂了可以让它们自动重启.当然也可以用来实现golan ...