24-2-29预备役之第七次总结

       首先先给我的学长学姐们道个歉,辜负了信任,寒假太懈怠懒散,导致任务没完成,学习总结更不到位甚至没有,此处惩罚自己停止呼吸一秒。逃不过假期定律,我在学校会鞭策自己,努力赶上进度。由于之前交的很草率,再写一下,所以此处先不发题解,简单讲一下自己对这些的理解。


     1.kmp

KMP(Knuth-Morris-Pratt)算法是一种用于字符串搜索的高效算法,由Donald Knuth, Vaughan Pratt和James H. Morris共同发明。KMP算法的核心思想是当一次字符比较失败时,就能使用这些信息避免从主串的下一个位置重新开始匹配,从而跳过前面已经匹配成功的部分。

KMP算法的主要步骤包括两个部分:计算部分匹配表(Partial Match Table,也称为前缀表或失败函数)和使用该表进行搜索。

    假设我们有一个主串 `S = "ABABDABACDABABCABAB"`,我们需要在这个主串中找到模式串 `P = "ABABC"` 的所有出现。

首先,我们计算模式串 `P` 的部分匹配表(next数组):

- `P = "ABABC"`,长度为5。

- `next[0] = -1`(模式串为空时,前缀和后缀都是空集,交集自然为空集)。

- `next[1] = 0`(模式串的第一个字符自身匹配,所以前缀和后缀相同,交集最长长度为0)。

- `next[2] = 0`("AB"的前缀和后缀都是自己,交集最长长度为0)。

- `next[3] = 1`("ABA"的前缀和后缀交集中最长元素为"A")。

- `next[4] = 2`("ABAB"的前缀和后缀交集中最长元素为"AB")。

现在我们使用KMP算法在主串 `S` 中搜索模式串 `P`:

1. 初始化 `i = 0`(主串指针),`j = 0`(模式串指针)。

2. 遍历主串 `S`:

   - 当 `j == -1` 或 `S[i] == P[j]` 时,`i++`,`j++`。

   - 当 `S[i] != P[j]` 时,`j = next[j]`。

3. 当 `j == len(P)` 时,我们找到了一个匹配,记录下 `i - j` 的位置,然后将 `j` 更新为 `next[j]` 以继续寻找下一个可能的匹配。

按照这个步骤,我们可以在主串中找到模式串的所有出现:

- 第一次匹配成功时,`i = 2 + 1 = 3`,`j = 4`,`S[2...3] == P`,记录下位置3。

- `j` 更新为 `next[4] = 2`,继续寻找。

- 第二次匹配成功时,`i = 3 + 2 = 5`,`j = 4`,`S[5...6] == P`,记录下位置5。

- `j` 更新为 `next[4] = 2`,继续寻找。

- 此时 `i` 已超出主串长度,搜索结束。

所以,模式串 `P = "ABABC"` 在主串 `S = "ABABDABACDABABCABAB"` 中出现在位置3和位置5。

     2.Hash

哈希表的工作原理:

  • 哈希函数:哈希表通过哈希函数将键转换为数组索引。理想的哈希函数应该易于计算,并且能够将不同的键均匀分布到哈希表的不同位置。
  • 数组:哈希表通常是一个数组,数组的每个槽位(slot)或称为桶(bucket)存储一个或多个键值对。
  • 冲突解决:当两个键被哈希到同一个位置时,就发生了冲突。冲突解决的策略有多种,如链表法(在同一个位置存储多个元素,形成一个链表)和开放地址法(寻找空闲的位置存储键值对)

     3.动态规划

       动态规划是将复杂问题分解成小问题来逐步解决,并且记住每个小问题的解,以避免重复计算。这种方法适用于有重叠子问题和最优子结构特点的问题,可以大大提高效率。

一个经典的动态规划例子是“斐波那契数列”。斐波那契数列是一个无穷数列,其中每个数字是前两个数字的和。数列的前几个数字是:0, 1, 1, 2, 3, 5, 8, 13, ...。
使用动态规划来计算斐波那契数列的第 n 项(F(n))的步骤如下:
1. 确定状态表示:设 dp[i] 表示斐波那契数列的第 i 项。
2. 确定状态转移方程:dp[i] = dp[i-1] + dp[i-2],其中 i > 1。
3. 初始化:dp[0] = 0,dp[1] = 1。
4. 填表顺序:从 i = 2 开始,依次计算 dp[i]。
5. 返回值:dp[n],即斐波那契数列的第 n 项。
下面是这个动态规划过程的伪代码:
```
function fibonacci(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    
    # 初始化dp数组
    dp = array of size n+1
    dp[0] = 0
    dp[1] = 1
    
    # 填表顺序
    for i from 2 to n:
        dp[i] = dp[i-1] + dp[i-2]
    
    # 返回值
    return dp[n]
```
通过这种方法,我们可以高效地计算出斐波那契数列的第 n 项,时间复杂度为 O(n),而使用递归方法的时间复杂度为 O(2^n),因为递归会有大量的重复计算。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023-11-21始写

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值