第一节课 NLP介绍
- NLP=NLU(understanding)+NLG(generation)
- Master Theorem
T ( n ) = a T ( n / b ) + f ( n ) i f O ( n l o g b a ) > f ( n ) ⇒ O ( n l o g b a ) i f O ( n l o g b a ) = f ( n ) l o g k n ⇒ O ( n l o g b a l o g k + 1 n ) i f O ( n l o g b a ) < f ( n ) ⇒ f ( n ) T(n)=aT(n/b)+f(n)\\ if\quad O(n^{log_ba})>f(n)\Rightarrow O(n^{log_ba})\\ if\quad O(n^{log_ba})=f(n)log^kn\Rightarrow O(n^{log_ba}log^{k+1}n)\\ if\quad O(n^{log_ba})<f(n)\Rightarrow f(n)\\ T(n)=aT(n/b)+f(n)ifO(nlogba)>f(n)⇒O(nlogba)ifO(nlogba)=f(n)logkn⇒O(nlogbalogk+1n)ifO(nlogba)<f(n)⇒f(n)
- 归并排序(merge sort)
T ( n ) = 2 T ( n / 2 ) + n a = 2 , b = 2 , f ( n ) = n k = 0 ⇒ O ( n l o g n ) T(n)=2T(n/2)+n\\ a =2,b=2,f(n)=n\\ k=0\Rightarrow O(nlogn) T(n)=2T(n/2)+na=2,b=2,f(n)=nk=0⇒O(nlogn)
代码实现:
import math
def mergeSort(arr):
if len(arr) < 2:
return arr
mid = math.floor(len(arr)/2)
left = arr[0:mid]
right = arr[mid:]
return merge(mergeSort(left), mergeSort(right))
def merge(left, right):
res = []
while left and right:
if left[0] <= right[0]:
res.append(left.pop(0))
else:
res.append(right.pop(0))
while left:
res.append(left.pop(0))
while right:
res.append(right.pop(0))
return res
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
arr = [3,1,2,9,4,7,5,6]
print(mergeSort(arr))
- 递归复杂度分析
斐波那契数列: f ( n ) = f ( n − 1 ) + f ( n − 2 ) , f ( 1 ) = 1 , f ( 2 ) = 1 f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=1 f(n)=f(n−1)+f(n−2),f(1)=1,f(2)=1
时间复杂度:(树) O ( 2 n ) O(2^n) O(2n)
空间复杂度:(入栈,出栈) O ( n ) O(n) O(n)
斐波那契数列动态规划代码:
def fib(n):
f1 = 1
f2 = 1
res = 1
for i in range(2,n):
res = f1 + f2
f2 = f1
f1 = res
return res
if __name__ == '__main__':
n = 10
print(fib(n))
原创通项公式求法(参考斐波那契数列通项的两种求法_斐波那契数列通项公式_cyzhou1221的博客-CSDN博客)
数学原理:
(
f
(
n
)
f
(
n
−
1
)
)
=
(
1
1
1
0
)
(
f
(
n
−
1
)
f
(
n
−
2
)
)
=
(
1
1
1
0
)
n
−
1
(
1
0
)
\left( \begin{matrix} f(n)\\ f(n-1)\end{matrix}\right)=\left( \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right)\left( \begin{matrix} f(n-1)\\ f(n-2)\end{matrix}\right)=\left( \begin{matrix} 1 & 1\\ 1 & 0\end{matrix}\right)^{n-1}\left( \begin{matrix} 1\\0\end{matrix}\right)
(f(n)f(n−1))=(1110)(f(n−1)f(n−2))=(1110)n−1(10)
f
(
n
)
f(n)
f(n)是
A
n
−
1
A^{n-1}
An−1首行首列的元素
第一种方法:
A
=
V
D
V
−
1
A=VDV^{-1}
A=VDV−1
第二种方法:直接求
A
n
−
1
A^{n-1}
An−1
先考虑
x
n
x^n
xn的快速算法,将n用二进制进行表示:
n
=
d
k
2
k
+
d
k
−
1
2
k
−
1
+
⋯
+
d
0
x
n
=
x
d
k
2
k
x
d
k
−
1
2
k
−
1
⋯
x
d
0
d
i
=
0
⇒
x
d
i
2
i
=
1
d
i
=
1
⇒
x
d
i
2
i
=
x
2
i
=
x
i
−
1
x
i
−
1
n=d_k2^k+d_{k-1}2^{k-1}+\cdots+d_0\\ x^n=x^{d_k2^k}x^{d_{k-1}2^{k-1}}\cdots x^{d_0}\\ d_i=0\Rightarrow x^{d_i2^i}=1\\ d_i=1\Rightarrow x^{d_i2^i}=x^{2^{i}}=x^{i-1}x^{i-1}
n=dk2k+dk−12k−1+⋯+d0xn=xdk2kxdk−12k−1⋯xd0di=0⇒xdi2i=1di=1⇒xdi2i=x2i=xi−1xi−1
代码实现:
def pow(x, n):
res = 1.0
x_t = x
n_t = int(n)
while n_t > 0:
if n_t % 2 == 1:
res = res * x_t
x_t = x_t * x_t
n_t = n_t // 2
return res
if __name__ == '__main__':
print(pow(3.1, 10))
求 A n − 1 A^{n-1} An−1:
def fibs(n):
res = np.eye(2)
x = np.array([[1,1],[1,0]])
n_t = int(n-1)
while n_t > 0:
if n_t % 2 == 1:
res = np.dot(res, x)
x = np.dot(x, x)
n_t = n_t // 2
return res[0][0]
if __name__ == '__main__':
print(fibs(10))