基础知识
- 常见排序算法
算法 | W ( n ) W(n) W(n) | A ( n ) A(n) A(n) |
---|---|---|
插入 | n 2 n^2 n2 | n 2 n^2 n2 |
冒泡 | n 2 n^2 n2 | n 2 n^2 n2 |
快速 | n 2 n^2 n2 | O ( n log n ) O(n\log n) O(nlogn) |
堆 | O ( n log n ) O(n\log n) O(nlogn) | O ( n log n ) O(n\log n) O(nlogn) |
二分归并 | O ( n log n ) O(n\log n) O(nlogn) | O ( n log n ) O(n\log n) O(nlogn) |
函数渐进的界
渐进上界: f ( n ) = O ( g ( n ) ) ⇔ ∃ c , n 0 ∈ N + , ∀ n > n 0 , 0 ≤ f ( n ) ≤ c g ( n ) f(n)=O(g(n))\Leftrightarrow \exist c,n_0\in \mathbb{N}^{+},\forall n>n_0,0\le f(n)\le c\, g(n) f(n)=O(g(n))⇔∃c,n0∈N+,∀n>n0,0≤f(n)≤cg(n)
渐进下界: f ( n ) = Ω ( g ( n ) ) ⇔ ∃ c , n 0 ∈ N + , ∀ n > n 0 , 0 ≤ c g ( n ) ≤ f ( n ) f(n)=Ω(g(n))⇔∃c,n_0 ∈N + ,∀n>n_0 ,0≤cg(n)≤f(n) f(n)=Ω(g(n))⇔∃c,n0∈N+,∀n>n0,0≤cg(n)≤f(n)
渐进紧确界: f ( n ) = Θ ( g ( n ) ) ⇔ f ( n ) = O ( g ( n ) ) 当且仅当 f ( n ) = Ω ( g ( n ) ) f(n)=\Theta(g(n))\Leftrightarrow f(n)=O(g(n))\text{当且仅当} f(n)=\Omega(g(n)) f(n)=Θ(g(n))⇔f(n)=O(g(n))当且仅当f(n)=Ω(g(n))
非渐进紧确上界: f ( n ) = o ( g ( n ) ) ⇔ ∀ c , ∃ n 0 ∈ N + , ∀ n > n 0 , 0 ≤ f ( n ) < c g ( n ) f(n)=o(g(n))\Leftrightarrow \forall c,\exist n_0\in \mathbb{N}^{+},\forall n>n_0,0\le f(n)< c\, g(n) f(n)=o(g(n))⇔∀c,∃n0∈N+,∀n>n0,0≤f(n)<cg(n)
非渐进紧确下界: f ( n ) = ω ( g ( n ) ) ⇔ ∀ c , ∃ n 0 ∈ N + , ∀ n > n 0 , 0 ≤ c g ( n ) < f ( n ) f(n)=\omega (g(n))\Leftrightarrow\forall c,\exist n_0\in \mathbb{N}^{+},\forall n>n_0,0\le c\; g(n)<f(n) f(n)=ω(g(n))⇔∀c,∃n0∈N+,∀n>n0,0≤cg(n)<f(n)
log ( n ! ) = Θ ( n log n ) n 1 log n = O ( 1 ) \log(n!)=\Theta(n\log n) \quad n^{\frac{1}{\log n}}=O(1) log(n!)=Θ(nlogn)nlogn1=O(1)
C n + m − 1 m = ( n + m − 1 ) ! m ! ( n − 1 ) ! = Θ ( ( 1 + ε ) n + m − 1 ) C_{n+m-1}^m=\dfrac{(n+m-1)!}{m!(n-1)!}=\Theta((1+\varepsilon)^{n+m-1}) Cn+m−1m=m!(n−1)!(n+m−1)!=Θ((1+ε)n+m−1)
Stirling公式
n
!
=
2
π
n
(
n
e
)
n
(
1
+
Θ
(
1
n
)
)
\text{Stirling公式}\quad n!=\sqrt{2\pi n}(\dfrac{n}{e})^n(1+\Theta(\dfrac{1}{n}))
Stirling公式n!=2πn(en)n(1+Θ(n1))
∑
k
=
1
n
1
/
k
=
ln
n
+
O
(
1
)
∑
t
=
1
k
t
2
t
−
1
=
(
k
−
1
)
2
k
+
1
\sum_{k=1}^n 1/k=\ln n+O(1)\quad \sum^{k}_{t=1}t2^{t-1}=(k-1)2^k+1
k=1∑n1/k=lnn+O(1)t=1∑kt2t−1=(k−1)2k+1
主定理
T ( n ) = a T ( n / b ) + f ( n ) a ≥ 1 , b > 1 , T ( n ) ∈ N T(n)=aT(n/b)+f(n) \quad a\ge 1,b> 1,T(n)\in \mathbb{N} T(n)=aT(n/b)+f(n)a≥1,b>1,T(n)∈N
- 若 f ( n ) = O ( n log b a − ε ) , ε > 0 , f(n)=O(n^{\log_ba-\varepsilon}),\varepsilon>0, f(n)=O(nlogba−ε),ε>0,那么 T ( n ) = Θ ( n log b a ) T(n)=\Theta(n^{\log_ba}) T(n)=Θ(nlogba)
- 若 f ( n ) = Θ ( n log b a ) , f(n)=\Theta(n^{\log_ba}), f(n)=Θ(nlogba),那么 T ( n ) = Θ ( n log b a log n ) T(n)=\Theta(n^{\log_ba} \log n) T(n)=Θ(nlogbalogn)
- 若 f ( n ) = Ω ( n log b a + ε ) , ε > 0 , ∃ c ∈ ( 0 , 1 ) , ∀ n > n 0 , a f ( n / b ) ≤ c f ( n ) , f(n)=\Omega(n^{\log_ba+\varepsilon}),\varepsilon>0,\exist c\in(0,1),\forall n>n_0,af(n/b)\le cf(n), f(n)=Ω(nlogba+ε),ε>0,∃c∈(0,1),∀n>n0,af(n/b)≤cf(n),那么 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))
多米诺性质
¬ P ( x 1 , x 2 , ⋅ ⋅ ⋅ , x k ) → ¬ P ( x 1 , x 2 , ⋅ ⋅ ⋅ , x k + 1 ) , 0 < k < n \neg P(x_1,x_2,···,x_{k})\rightarrow\neg P(x_1,x_2,···,x_{k+1}),0<k<n ¬P(x1,x2,⋅⋅⋅,xk)→¬P(x1,x2,⋅⋅⋅,xk+1),0<k<n
一般选择问题
- 问题:选第 k k k小
- 输入:数组 S , S . l e n g t h = n S,S.length=n S,S.length=n
- 输出:第 k k k小的数
n = m ( 2 r + 1 ) , ∣ A ∣ = ∣ D ∣ = ⌊ m 2 ⌋ , ∣ B ∣ = ∣ C ∣ = ⌈ m 2 ⌉ r + ⌊ m 2 ⌋ n=m(2r+1),|A|=|D|=\lfloor \frac{m}{2}\rfloor\;,|B|=|C|=\lceil \frac{m}{2}\rceil r+\lfloor \frac{m}{2}\rfloor n=m(2r+1),∣A∣=∣D∣=⌊2m⌋,∣B∣=∣C∣=⌈2m⌉r+⌊2m⌋
r = n 2 m − 1 2 r=\frac{n}{2m}-\frac{1}{2} r=2mn−21
剩余子问题规模至多为:
∣
A
∣
+
∣
B
∣
+
∣
D
∣
=
m
+
⌊
m
2
⌋
2
m
n
−
1
2
⌈
m
2
⌉
|A|+|B|+|D|=\frac{m+\lfloor \frac{m}{2}\rfloor}{2m}n-\frac{1}{2}\lceil \frac{m}{2}\rceil
∣A∣+∣B∣+∣D∣=2mm+⌊2m⌋n−21⌈2m⌉
T ( n ) ≤ T ( n / m ) + T ( m + ⌊ m 2 ⌋ 2 m n ) + f ( n ) T(n)\le T(n/m)+T(\frac{m+\lfloor \frac{m}{2}\rfloor}{2m}n)+f(n) T(n)≤T(n/m)+T(2mm+⌊2m⌋n)+f(n)
反证法
设
n
n
n 为文件的总数,
f
i
f_i
fi 为文件
i
i
i 的被检索概率,
s
i
s_i
si 为文件
i
i
i 的存储空间大小。
贪心策略:按照比值
f
s
\dfrac{f}{s}
sf从大到小排序
平均检索时间
T
π
=
∑
i
=
1
n
(
f
i
×
∑
j
=
1
i
s
π
(
i
)
)
.
T_\pi=\sum^n_{i=1}(f_i\times \sum_{j=1}^{i}s_{\pi (i)}).
Tπ=i=1∑n(fi×j=1∑isπ(i)).
π
(
i
)
表示排序
π
中第
i
个位置的文件
π(i) 表示排序 π 中第 i 个位置的文件
π(i)表示排序π中第i个位置的文件
假设存在最佳排序
π
∗
,
\pi ^*,
π∗,该排序中至少存在一对文件
π
∗
(
i
)
和
π
∗
(
j
)
(
i
≠
j
)
,
\pi^*(i)\text{和}\pi^*(j)(i\neq j),
π∗(i)和π∗(j)(i=j),满足
f
π
∗
(
i
)
/
s
π
∗
(
i
)
<
f
π
∗
(
j
)
/
s
π
∗
(
j
)
f_{\pi^*(i)}/s_{\pi^*(i)}<f_{\pi^*(j)}/s_{\pi^*(j)}
fπ∗(i)/sπ∗(i)<fπ∗(j)/sπ∗(j)且
π
∗
(
i
)
>
π
∗
(
j
)
\pi^*(i)>\pi^*(j)
π∗(i)>π∗(j)
另构造
π
′
,
π
′
(
k
)
=
π
∗
(
k
)
,
k
∉
{
i
,
j
}
,
π
′
(
i
)
=
π
∗
(
j
)
,
π
′
(
j
)
=
π
∗
(
i
)
\pi',π'(k)=π^*(k),k\notin \{i,j\},π'(i)=π^∗(j),π'(j)=π^∗(i)
π′,π′(k)=π∗(k),k∈/{i,j},π′(i)=π∗(j),π′(j)=π∗(i)
两种排序的平均检索时间只差
Δ
=
T
π
′
−
T
π
∗
=
∑
k
=
1
n
(
f
π
′
(
k
)
×
∑
w
=
1
k
s
π
′
(
w
)
)
−
∑
k
=
1
n
(
f
π
∗
(
k
)
×
∑
w
=
1
k
s
π
∗
(
w
)
)
=
f
π
′
(
i
)
×
∑
w
=
1
i
s
π
′
(
w
)
+
f
π
′
(
j
)
×
∑
w
=
1
j
s
π
′
(
w
)
−
f
π
∗
(
i
)
×
∑
w
=
1
i
s
π
∗
(
w
)
−
f
π
∗
(
j
)
×
∑
w
=
1
j
s
π
∗
(
w
)
=
f
π
′
(
j
)
×
s
π
′
(
i
)
−
f
π
∗
(
j
)
×
s
π
∗
(
j
)
=
f
π
∗
(
i
)
×
s
π
∗
(
j
)
−
f
π
∗
(
j
)
×
s
π
∗
(
j
)
<
0
\begin{aligned} \Delta &= T_{\pi'}-T_{\pi^*}\\ &=\sum^n_{k=1}(f_{\pi'(k)}\times\sum_{w=1}^{k}s_{\pi' (w)}) -\sum^n_{k=1}(f_{\pi^*(k)}\times\sum_{w=1}^{k}s_{\pi^* (w)}) \\ &=f_{\pi'(i)}\times\sum_{w=1}^{i}s_{\pi'(w)} +f_{\pi'(j)}\times\sum_{w=1}^{j}s_{\pi' (w)} -f_{\pi^*(i)}\times\sum_{w=1}^{i}s_{\pi^* (w)} -f_{\pi^*(j)}\times\sum_{w=1}^{j}s_{\pi^* (w)} \\ &=f_{\pi'(j)}\times s_{\pi'(i)} -f_{\pi^*(j)}\times s_{\pi^*(j)} \\ &=f_{\pi^*(i)}\times s_{\pi^*(j)} -f_{\pi^*(j)}\times s_{\pi^*(j)} \\ &< 0 \end{aligned}
Δ=Tπ′−Tπ∗=k=1∑n(fπ′(k)×w=1∑ksπ′(w))−k=1∑n(fπ∗(k)×w=1∑ksπ∗(w))=fπ′(i)×w=1∑isπ′(w)+fπ′(j)×w=1∑jsπ′(w)−fπ∗(i)×w=1∑isπ∗(w)−fπ∗(j)×w=1∑jsπ∗(w)=fπ′(j)×sπ′(i)−fπ∗(j)×sπ∗(j)=fπ∗(i)×sπ∗(j)−fπ∗(j)×sπ∗(j)<0
由于
Δ
<
0
\Delta<0
Δ<0,这说明:按照排序
π
′
π'
π′的平均检索时间小于按照排序
π
∗
\pi^∗
π∗的平均检索时间,这与
π
∗
π^∗
π∗ 是最优排序的假设矛盾。
即假设不成立,不存在一个最优排序不是按照
f
/
s
f/s
f/s 从大到小排序的。
所以,最优的贪心策略是按照
f
/
s
f/s
f/s 从大到小排序。