斯坦福 算法1 第一周笔记

本文是斯坦福大学算法课程第一周的学习笔记,涵盖整数乘法的Karatsuba算法、归并排序的分治应用、算法分析准则以及大O表示法等。通过分治策略,探讨了逆序对计数、Strassen矩阵乘法的次立方复杂度优化和二维点最近距离问题的O(nlogn)解法。
摘要由CSDN通过智能技术生成

来自斯坦福网站的Algorithms: Design and Analysis,与目前coursera上的版本内容没有变化,不过时间安排略有不同。

INTRODUCTION

1.1整数乘法

两个整数相乘的计算,即c=xy。假设x和y的位数是n,而以每个一位数的加法或乘法为基本操作,可得xy的计算中使用最原始的按位相乘然后相加的算法时需要的基本操作数量是 n 2 n^{2} n2级别。举例如下,两个4位数相乘,每一行都要至少进行4次基本操作,共有4行:
在这里插入图片描述
但我们却可以做到更好。改良的算法叫做Karatsuba Multiplication,这是一个递归算法,计算x*y的结果流程如下:

  • 令x= 1 0 n / 2 a + b 10^{n/2}a+b 10n/2a+b,y= 1 0 n / 2 c + d 10^{n/2}c+d 10n/2c+d
  • x*y = ( 1 0 n a c + 1 0 n / 2 ( a d + b c ) + b d 10^{n}ac+10^{n/2}(ad+bc)+bd 10nac+10n/2(ad+bc)+bd),于是只需要继续计算式子里的ac,ad,bc,bd四项的积即可。

针对每次递归需要计算的ac,ad,bc,bd还有个优化。分别计算需要做4次乘法,而实际上我们关心的是ac bc与(ad+bc)三项。可以通过计算ac bc与(a+b)(c+d)三次乘法得到结果。

1.2 Merge Sort

归并排序是一个简单的分治算法。上述的整数乘法的优化也是一种分治算法。

排序算法的输入是一个无序数组,输出是一个有序数组。而归并排序算法流程如下:

  1. 递归地将当前数组的前一半与后一半分别排序
  2. 将排序好的前一半与后一半合并为有序的整体

这里忽略了递归至最后只有一个数的时候的处理。其中第二步合并的伪代码如下:
在这里插入图片描述
所以如果合并后的数组长度为m,那么每个合并操作的基本操作数 ≤ 4 m + 2 ≤ 6 m \leq 4m+2 \leq 6m 4m+26m

将递归过程画成高为 l o g 2 n log_{2}n log2n的一颗树:
在这里插入图片描述
第j行有 2 j 2^{j} 2j个排序问题,每个问题里数组长度为 n / 2 j n/2^{j} n/2j

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值