第一节课 NLP介绍

第一节课 NLP介绍

  1. NLP=NLU(understanding)+NLG(generation)
  2. 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)logknO(nlogbalogk+1n)ifO(nlogba)<f(n)f(n)

  1. 归并排序(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=0O(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))
  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 f(n)=f(n1)+f(n2),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(n1))=(1110)(f(n1)f(n2))=(1110)n1(10)
f ( n ) f(n) f(n) A n − 1 A^{n-1} An1首行首列的元素

第一种方法:
A = V D V − 1 A=VDV^{-1} A=VDV1
第二种方法:直接求 A n − 1 A^{n-1} An1

先考虑 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+dk12k1++d0xn=xdk2kxdk12k1xd0di=0xdi2i=1di=1xdi2i=x2i=xi1xi1
代码实现:

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} An1

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值