Basic
主方法¶
a \ge 1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式
- 若对某个常数\epsilon >0,有f(n)=O(n^{log_ba-\epsilon}),则T(n)=\Theta(n^{log_ba}),即如果n^{log_ba}大于f(n),复杂度由n^{log_ba}主导
- 若f(n)=\Theta(n^{log_ba}),则T(n)=\Theta(n^{log_ba}lgn),即两者相等,复杂度是这个项后加lgn
- 若对某个常数\epsilon>0,有f(n)=\Omega(n^{log_ba+\epsilon}),且对某个常数c<1和所有足够大的n有af(n/b)\le cf(n),则T(n)=\Theta(f(n)),即f(n)大于n^{log_ba},由f(n)主导
有的递归式不适用于主方法,如T(n)=4T(n/2)+n^2lgn,log_ba=2,若g(n)=2\Omega ()
树¶
遍历
- 前序遍历 (pre-order traversal) - 根->左->右
- 中序遍历 (in-order traversal) - 左->根->右
- 后序遍历 (post-order traversal) - 左->右->根
二分搜索树
左节点小于根节点,右节点大于根节点,没有值相等的节点
二分查找¶
LowerBound
返回大于等于target的最小秩 -> l
int binarySearchLowerBound(vector<int> v, int target) {
int l = 0, r = v.size() - 1;
while (l <= r) {
int m = (l + r) / 2;
if(target <= v[m]) r = m - 1;
else l = m + 1;
}
return l;
}
UpperBound
返回小于等于target的最大秩 -> r
int binarySearchUpperBound(vector<int> v, int target) {
int l = 0, r = v.size() - 1;
while (l <= r) {
int m = (l + r) / 2;
if(target >= v[m]) l = m + 1;
else r = m - 1;
}
return r;
}
对于{1, 3, 3, 4, 5, 5, 5, 6, 6},从0-7搜索结果如下
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
LowerBound | 0 | 0 | 1 | 1 | 3 | 4 | 7 | 9 |
UpperBound | -1 | 0 | 0 | 2 | 3 | 6 | 8 | 8 |
理解
对于LowerBound,将r限制到比target更小的区域,然后只会进入l的条件,逐渐增加到刚好超过r,就是大于等于target的最小秩元素
对于UpperBound,相反理解即可,将l限制在比target大的区域,然后让r小于l
题目
33. Search in Rotated Sorted Array
34. Find First and Last Position of Element in Sorted Array
格雷码¶
格雷码是贝尔实验室发明的一种对数字进行编码的方式,使得相邻数字只有一位不同
数字 | 二进制 | 格雷码 |
---|---|---|
1 | 001 | 001 |
2 | 010 | 011 |
3 | 011 | 010 |
4 | 100 | 110 |
5 | 101 | 111 |
6 | 110 | 101 |
7 | 111 | 100 |
格雷码可以以这种方式来产生
Take the Gray code 0, 1. Write it forwards, then backwards: 0, 1, 1, 0. Then prepend 0s to the first half and 1s to the second half: 00, 01, 11, 10. Continuing, write 00, 01, 11, 10, 10, 11, 01, 00 to obtain: 000, 001, 011, 010, 110, 111, 101, 100, ... (OEIS A014550). Each iteration therefore doubles the number of codes.
更方便的计算方法如下
整数i的格雷码 Gray(i)=i xor (i >> 1)
从格雷码到二进制可以这样计算,二进制第i
位是二进制第i+1
位和格雷码第i
位的异或结果,刚开始假设最左边数字是0,如下例
number 7
gray code 1 0 0
binary code 1 1 1
2 bit: 0^1=1
1 bit: 1^0=1
0 bit: 1^0=1