《算法导论》Ch.4_学习笔记

<分治策略>

分治策略三步骤:

  1. 分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。
  2. 解决:递归地求解出子问题,如果子问题地规模足够小,则停止递归,直接求解。
  3. 合并:将子问题地解组合成原问题地解。

  • 递归情况:子问题足够大,需要递归求解。
  • 基本情况:子问题足够小,不再需要递归时。

求解递归式的三种方法

  • 代入法:猜测一个界,通过数学归纳法验证其正确性。
  • 递归树法:将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价,采用边界和技术来求解递归式。
  • 主方法(主推)
  •           T(n)=aT(n/b)+f(n),其中a\geqslant 1b\geqslant 1f(n)是一个给定的函数。
  •          该问题生成a个子问题,每个子问题的规模是原问题规模的1/b,分解和合并步骤总共花费时间为f(n)

技术细节,一般忽略

  • n值的奇偶
  • 边界条件,即n很小时

4.1最大子数组问题

最大子数组:最大的非空连续子数组,寻找子数组A[low..high],一般会出现以下三种情况:

  • 完全位于子数组A[low.. mid]中,因此low≤i≤j≤mid
  • 完全位于子数组A[mid+1..high]中,因此mid≤i≤j≤high
  • 跨越了中点,因此low≤i≤mid≤j≤high

原方案一个个计算\begin{pmatrix} 2\\ n \end{pmatrix} ,分治策略中对于重复运算的可直接调用,减少运算时间。

获得运行时间递推式T(n)为,得解为

4.2 矩阵乘法的Strassen算法

使用下标计算,简单的分治算法得到的递推关系式为

花费时间为

Strassen算法

减少一次矩阵乘法带来的代价可能是额外几次\frac{2}{n}×\frac{2}{n}矩阵的乘法。

  1. 将输入矩阵A、B和输出矩阵C分解为\frac{2}{n}×\frac{2}{n}的子矩阵。采用下标计算法,此步骤花费时间为\Theta(1)
  2. 创建10个n/2×n/2的矩阵S1,S2,……,S10,每个矩阵保存步骤1中创建的两个子矩阵的和或差。花费时间为\Theta(n^{2})
  3. 用步骤1中创建的子矩阵和步骤2中创建的10个矩阵,递归计算7个矩阵积P1,P2,…,P7。每个矩阵Pi都是\frac{2}{n}×\frac{2}{n}的。
  4. 通过矩阵Pi的不同组合进行加减运算,计算出结果矩阵C的子矩阵C_{11}C_{12}C_{21}C_{22}。花费时间为\Theta(n^{2})

          

4.3用代入法求解递归式

  • 猜测解的形式(类似的证明递归式较松的上界和下界,然后缩小不确定的范围)。
  • 用数学归纳法求出解中的常数,并证明解是正确的。

4.4用递归式方法求解递归式

每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。将树中每层中的代价求和,得到每层代价后将所有层的代价求和,得到所有层次的递归调用的总代价。

4.5用主方法求解递归式

T(n)=aT(n/b)+f(n),其中a\geqslant 1b> 1f(n)是渐进正函数。

主定理

a\geqslant 1b> 1是常数,是定义在非负整数上的递归式T(n)=aT(n/b)+f(n)

其中将n/b解释为⌈n/b⌉ ⌊n/b⌋。那么T(n)有如下渐近界:

  • 若对某个常数ε>0有f(n)=O(n^{log_{b}^{a- \varepsilon}}),则T(n)=\Theta(n^{log_{b}^{a}})
  • f(n)=\Theta(n^{log_{b}^{a}}),则T(n)=\Theta(n^{log_{b}^{a}}lgn)
  • 若对某个常数ε>0有f(n)=\Omega(n^{log_{b}^{a+\varepsilon}}),且对某个常数c<1和所有足够大的n有af(n/b)\leq cf(n),则T(n)=\Theta(f(n))

Monge阵列

对一个m×n的实数阵列A,若对所有满足1≤ikm和1≤jlnijkl有A[i, j]+ A[k, l] ≤A[i, l]+ A[k, j],则称A是Monge阵列。即,无论何时选出Monge阵列的两行两列,对于交叉点上的4个元素,左上和右下两个元素之和总是小于等于坐下和右上元素之和。

更一般的

其中

求得递归式的解为

<think>好的,我现在需要帮助用户找到数据结构课程的学习资料或笔记,特别是PDF或讲义下载。根据用户提供的引用内容,我需要先查看现有的引用材料,看看是否有直接相关的资源。 首先,引用[1]提到“进阶学习笔记pdf”,其中包括Java基础、并发编程、JVM、MySQL、Tomcat、网络、数据结构算法。这里的数据结构算法部分可能包含用户需要的内容。但用户可能需要更详细的数据结构课程笔记,而不仅仅是作为进阶学习的一部分。此外,引用[2]提到了《王道》数据结构笔记整理2024版,并提到串的链式存储等具体内容,这看起来是专门针对数据结构的资料,应该非常相关。引用[3]则涉及链表概述及LeetCode真题图解,这可能包含实际应用的例子,对学习数据结构有帮助。引用[4]关于Java的transient关键字,可能与用户需求关联不大,可以暂时忽略。 接下来,我需要确定用户可能需要的具体资料类型。用户明确提到了学习笔记和讲义,所以应优先推荐包含系统讲解和实例的资料。引用[2]中的《王道》数据结构笔记整理2024版PDF看起来非常适合,因为它直接提到了数据结构的高级知识点,并且是系统整理的笔记。引用[1]的进阶学习笔记虽然涵盖范围更广,但数据结构部分可能足够详细,特别是如果用户需要结合算法和其他计算机科学主题学习的话。引用[3]中的LeetCode真题图解可能对应用和练习有帮助,但可能不是系统性的讲义。 此外,用户可能需要更多资源,比如其他推荐的学习平台或书籍。例如,经典的《算法导论》或《数据结构算法分析》等书籍,但用户可能更倾向于PDF或在线资源。另外,像Coursera、edX等平台上的相关课程讲义也可能符合需求,但用户可能希望直接下载的资料,所以需要推荐可靠的下载来源或明确提到的资料。 在回答时,需要确保结构清晰,分点列出推荐的资料,并注明引用来源。同时,用户可能担心资料的权威性和更新性,所以需要提到2024版的资料以确保内容最新。另外,可能还需要提醒用户注意版权问题,确保下载的资源是合法授权的。 最后,生成的相关问题需要围绕数据结构学习资源,比如如何系统学习、经典教材推荐、在线课程选择等,帮助用户进一步解决可能的需求。</think>### 数据结构课程学习资料推荐 #### 1. **《王道》数据结构笔记整理2024版** 这份资料系统整理了数据结构核心知识点,包含线性表、树、图、排序等内容的详细解析和代码示例,适合入门和进阶学习。例如,其中详细讲解了**串的链式存储**实现: ```c typedef struct StringNode{ char ch; //每个结点存1个字符 struct StringNode *next; } StringNode, *String; ``` 该资料可通过“数据结构课程讲义 下载”关键词搜索获取电子版[^2]。 #### 2. **进阶学习笔记(含数据结构算法)** 包含Java基础、JVM、MySQL、网络、数据结构算法等综合内容,适合希望结合编程语言深入理解数据结构的读者。例如,其排序算法部分与快速排序实现类似,注重实践应用[^1]。 #### 3. **LeetCode真题图解与链表专题** 提供链表、栈、队列等数据结构的LeetCode题型解析,通过图解和代码(Java)帮助理解高频考点,例如链表反转、环形链表检测等[^3]。 #### 4. **其他推荐资源** - **经典教材**:《数据结构算法分析(C语言描述)》《算法导论》 - **在线课程**:Coursera的《数据结构算法专项课程》(University of California San Diego) - **开源项目**:GitHub上的“Hello-Algo”仓库,提供可视化算法演示和代码实现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值