软件算法设计与分析 期中复习

  • 第四章 蛮力法
    • 蛮力法/多项式求值
    • 最近点对问题
    • 蛮力法的优缺点
    • 旅行推销商问题
    • 背包问题
    • 分配问题
    • 穷举法特点
  • 第五章 分治法
    • 5.1 分治法的基本思想
    • 5.2 寻找最大值、最小值问题
    • 5.3 合并排序
    • 5.4 快速排序
    • 5.5 分治法的范式
      • 大整数乘法
      • 矩阵乘法
      • Strassen矩阵乘法
      • 最近点对问题
    • 5.6 选择问题
    • 作业
      • 坏球问题
      • 循环赛日程表问题

第四章 蛮力法

  1. 定义:基于问题描述或者概念定义解决问题

蛮力法/多项式求值

最近点对问题

  • 问题:给出平面上n个点,找出距离最近的两个点的距离
  • 蛮力算法:求出所有点对的距离然后找出最小距离
  • 时间效率: O(n2)

蛮力法的优缺点

  • 优点

    • 简单直观
    • 应用广泛
    • 算法正确性显然
  • 缺点
    • 算法效率低
    • 对某些问题蛮力法只能解决较小规模的问题(穷举搜索)

旅行推销商问题

  • 问题:给定n个城市,每对城市间都有路径相连,且知道每对城市的距离。一个推销商从一个城市出发,到达其他所有城市一次且仅一次,最后回到出发城市,问怎样规划路径使得其总路程最短?

背包问题

  • 问题:有一个容量为W的背包和n件物品,每件物品:

    • 大小: w1 w2 … wn
    • 价值: v1 v2 … vn
  • 在不超过背包容量的情况下,找出背包所装物品的最大价值


分配问题

  • 问题:有n项工作需要分配给n个人完成,每人分配一项工作。为第i人分配第j项工作的成本是C[i,j]。需要找到一个分配方案,使得总成本最低
  • 穷举法: 生成所有可能的分配方案,计算每种方案的成本,找出最低成本的方案.
  • 共有多少种分配方案?

穷举法特点

  • 穷举法在一些情形下只能解决较小规模的问题
  • 一些问题具有比穷举法高得多的时间效率
    • 最短路问题
    • 最小生成树问题
    • 分配问题
  • 在很多情形下,一些问题的精确解只能通过穷举法或者其变种得到

第五章 分治法

5.1 分治法的基本思想

  • 分而治之(divide-and-conquer)的设计思想是把一个难以下手的大问题,分割成一些较小的子问题,通过解决小问题最终解决大问题。具体是把一个输入规模为n的问题分割成k个子问题,1<k<=n,递归解决子问题,合并子问题的解求出原问题的解
  • 许多问题可分为两个子问题( k等于2 ),并尽量让子问题的规模相同。子问题规模相同的做法是出自一种衡(balancing)子问题的思想。平衡子问题一般可提高算法平均情况下的时间效率也可简化算法的时间复杂性的分析

5.2 寻找最大值、最小值问题

  • 问题:考虑从有n个元素的集合S中找出最大元和最小元问题

  • 思想:

    • 简单方法:先用(n-1)次比较,找出S中的最大元,然后在剩下的元素中用(n-2)次比较找出最小元。当n≥2时,共需要(2n-3)次比较
    • 分治法:假定n是2的整次幂,把集合S分成两个不相交的集合S1和S2。分别找出两个子集中的最大元和最小元,再做比较即可求得S中的最大元和最小元
  • 算法:minmax(A, low , high )
    输入:数组A,下标low,上标high
    输出: A[low… high]中的最小值和最大值(min , max)

    minmax(A, low , high):if high – low =1if A[low] < A[high] then return (A [low], A[high]);else return (A[high], A[low]);else mid ← low+high)/2 ; //向下取整(x1, y1 ) ← minmax(A, low, mid);(x2, y2 ) ← minmax(A, mid+1, high);x ← min(x1, x2);y ← max(y1, y2);return (x,y)
    
  • 分析算法:

5.3 合并排序

  • 算法:
    输入:数组A,下标low,上标high
    输出:数组A[low…high]升序排列

    MergeSORT(A, low, high):if high-low=1 thenif A[low]>A[high] 交换A[low]和A[high];Elsemid= low+high)/2MergeSORT (A, low, mid);MergeSORT (A, mid+1, high);MERGE (A, low, mid, high);
    
  • 分析算法:

当n是2的次幂时,算法BottomUpSort和MergeSort所执行的元素比较次数是相同的,当n不是2的次幂时,两种算法需要的元素比较次数是接近的。它们的时间复杂性都是Θ(nlog n)

5.4 快速排序

  • 思想:将集合S={a1,a2,……,an}分成小于a,等于a,大于a的三个子集合S1,S2,S3。分别将S1与S3递归排序,最后将S1,S2和S3连接起来

  • 划分算法:Split(A,low,high)
    输入:数组A,下标low,上标high, A[low]为划分元素
    输出: A[low]已经在其正确位置的数组A及其新下标w

    Split(A,low,high):i← low;x←A[low];for j ← low+1 to highif A[j] <=x then i ← i+1;if i<>j then 交换A[i]和A[j];互换A[low]和A[i]w ← i;return A和w
    // 时间效率: Θ(n)
    
  • 快速排序算法:QuickSort(A, low, high)
    输入:数组A,下标low,上标high, A[low]为划分元素
    输出:排好序的数值A[low…high]

    QuickSort(A, low, high):if high – low <= 1 then将A中的元素直接排序;return(A);elseif low < high(A , w) ← Split(A,low, high);quickSort(A, low, w-1);quickSort(A, w+1, high);
    
  • 算法分析:

  • 随机化快速排序: RandomQuicksort(A, low, high)
    输入:数组A,下标low,上标high
    输出:排好序的数值A[low…high]

    RandomQuicksort(A, low, high):if high – low <=1 then将A中的元素直接排序;return(A);elseif low< highv ← random(low, high); //从low…high中随机选择一个数互换A[low]和A[v]; // A[v]为划分元素(A,w) ← Split(A , low , high);RandomQuicksort(A, low, w-1);RandomQuicksort(A, w+1, high);
    

5.5 分治法的范式

  1. 对于简单实例直接求解(边界条件)
  2. 划分:分解原问题为多个子问题(子问题尽可能平衡)
  3. 治理:递归调用算法求解子问题
  4. 组合:合并各子问题的解得到原问题的解

大整数乘法

  • 问题:对两个n(n>100)位十进制整数进行乘法运

  • 思想:

    • [解法一]直接求解,需要做n2次位乘

    • [解法二]利用分治法求

  • 算法分析:

矩阵乘法

  • 问题:对两个n阶矩阵进行相乘

  • 思想:

    • [解法一]直接求解,需要做n3次乘法

    • [解法二]利用分治法求解

Strassen矩阵乘法

最近点对问题

  • 问题:给出平面上n个点 (x1,y1), (x2,y2)…(xn,yn),求这n个点中距离最近的两个点和其距离

  • 思想:

    • [解法一]蛮力法,计算出任意两点间距离,求最小值。时间复杂度为O(n2)
    • [解法二]分治法,将n个点平分到2个集合A,B中,每个集合中
      含有n/2个点,距离最近的点对有三种可能分布:

      1. 集合A中
      2. 集合B中
      3. 点对一点在集合A,另外一点在集合B
    • 可通过递归求得1和2两种情形结果,情形3可计算A中每点和
      B中每点的最短距离得到,最后取三种情形的最小值
  • 算法分析:


  • 算法:

5.6 选择问题

  • 问题描述:从n个元素中选择第k小的元素

  • 思想:

    • [方法一]将n个元素排序后,再寻找第k小元素
    • [方法二]分治法:线性时间内找到第k小元素
      1. 找出n个元素的近似中位数mm
      2. 将n 个元素划分成三组A1,A2,A3: 所有小于mm的元素放入A1,等于mm的元素放入A2 ,大于mm的元素放入A3
      3. 通过计算每组的元素个数可判断第k小元素在哪一组中,通过递
        归在该组中找出目标元素
  • 算法:select(A, low, high , k)
    输入:数组A,low<=k<=high
    输出:第k小元素

    select(A, low, high , k):p ←high-low+1;if p<44 then 将A排序 return(A[k]);令q= , 将A分成q组,每组5个元素,如果5不能整除A,则排除剩余元素将q组中的每一组单独排序,找出中项,所有中项的集合为Mmm ←select(M, 1, q, ) mm作为划分元素,将A分成3组,A1, A2,A3Case |A1|>=k: return select(A1,1,|A1|,k)|A1|+|A2|>=k: return mm|A1|+|A2|<k: return select(A3,1,|A3|,k-|A1|-|A2|)
    
  • 算法分析:

作业

坏球问题

  • 原文链接:https://blog.csdn.net/wwlcsdn000/article/details/79456771

循环赛日程表问题

  • 原文链接:https://blog.csdn.net/lhd1110/article/details/120725660

    ROUND-ROBIN-CALENDAR-REC(A,n):if n == 1:then A[1][1] = 1returnROUND-ROBIN-CALENDAR-REC(A,n/2)m=n/2for i = 1 to mfor j = 1 to mdoA[i][j+m]=A[i][j]+mA[i+m][j]=A[i][j+m]A[i+m][j+m]=A[i][j]
    

软件算法设计与分析 期中复习相关推荐

  1. 算法设计与分析课程复习笔记11——单源最短路径

    算法设计与分析课程复习笔记11--单源最短路径 单源最短路径 最短路径问题 输入:有权有向图G=(V,E) 路径p={ v 0 , v 1 , . . . , v k v_0, v_1, . . . ...

  2. 算法设计与分析考前复习

    算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...

  3. 算法设计与分析--期末复习重点总结

    目录 一.算法概述 1.算法的定义与特性 2.数学证明法 3.算法复杂性分析方法 4.渐进分析 二.递归与分治策略 1.递归概念 2.递归算法设计示例 3.递归算法分析 4.分治基本思想 5.分治算法 ...

  4. 哈工大2019年春算法设计与分析期末复习

    本文原载于我的博客,地址:https://blog.guoziyang.top/archives/22/ 第二章 算法分析的数学基础 2.1 复杂性函数的阶 阶为复杂性函数的主导项. 如函数 T ( ...

  5. 算法设计与分析期末复习不挂科

    算法的基本概念 算法概念 通俗讲:算法是解决问题的一种方法或一个过程 严格讲:算法是解某一特定问题的一组有穷规则的集合 且满足以下性质: 有限性:算法在执行有限步之后必须终止 确定性:算法的每一个步骤 ...

  6. 算法设计与分析复习--回溯法

    算法设计与分析期末复习 主要参考: ​ 算法设计与分析(北京航空航天大学MOOC) ​ 算法设计与分析(北京大学MOOC) ​ 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...

  7. 算法设计与分析复习笔记(上)

    简介:本文是博主在复习算法设计与分析的笔记,参考了北大算法设计与分析以及王晓东编著的<计算机算法设计与分析>第四版相关内容,如有错误,欢迎指正. 文章目录 设计技术 分治 动态规划 设计技 ...

  8. 算法设计与分析(Algorithm Design )课后习题作业+期末复习+期末习题

    课后习题作业资源链接 期末复习+期末习题资源链接 对应的书(不是算法导论):算法设计与分析(Algorithm Design ) Jon KIeinberg 著 张立昂 屈婉玲 译 有这本书中英文版. ...

  9. 0x08算法设计与分析复习(二):算法设计策略-回溯法2

    参考书籍:算法设计与分析--C++语言描述(第二版) 算法设计策略-回溯法 子集和数 问题描述 已知n个不同的正数wi(0≤i≤n−1)的集合,求该集合的所有满足条件的子集,使得每个子集中的正数之和等 ...

最新文章

  1. Docker学习笔记之在开发环境中使用服务发现
  2. ITK:基于零交叉的边缘检测器
  3. 容器中Java RAM的使用:不会丢失内存的5大技巧
  4. IOC容器(底层原理解读)
  5. gcc参数 -i, -L, -l, -include
  6. android OEM unlocking分析
  7. 华为留了一手!将继续发布P50、Mate50:搭载麒麟9000...
  8. 《精通Wireshark》—第1章1.5节抓取信息的方式
  9. linux sendemail,在linux下使用sendEmail发送邮件
  10. WinCE偶尔不能正常启动(内存清理)
  11. 《通信原理》复习笔记3----第三章随机过程相关例题(重点与难点)
  12. 腾讯Tendis 号称能干掉 Redis ?你继续吹牛吧 !
  13. 运行metamascara时出现的一些错误
  14. java设计模式5,接口隔离原则
  15. DW_axi_dmac控制器(概述)
  16. 从产业互联网的角度,解读360智慧商业发布“春雨计划”
  17. JAVA获取上一年的日期_java获取日期,前一年,前一月,前一周
  18. Hadoop流程---从tpch到hive
  19. Willy Woo:BTC作为新兴“完全数字化”资产类别正在吞噬资本
  20. c语言家庭生活计划管理系统,[参赛作品]家庭智能鱼缸

热门文章

  1. 密度峰值聚类算法DPC(Density Peak Clustering)理论基础与python实现
  2. 证书注册策略web服务报错 拒绝访问0x80070005
  3. android app功耗测试方法,APP功耗测试方法
  4. Windows学习总结
  5. 爬虫、无线网络、缓存、IPv6、即时通信、流媒体
  6. python 高斯过程_高斯过程 Gaussian Processes 原理、可视化及代码实现
  7. python爬取网易云音乐薛之谦歌词数据,生成词云
  8. 危化企业双重预防机制数字化建设进入全面实施阶段
  9. ROS1云课→25机器人控制配置
  10. 解决IDEA不识别Java文件:文件变橙色显示后缀名.java