华南理工大学无线电爱好者协会软件小组美妙的算法程序员

分治策略

2017-09-14  本文已影响84人  廖少少

分治策略

本文包括

  1. 分治的基本概念
  2. 二分查找
  3. 快速排序
  4. 归并排序
  5. 找出伪币
  6. 棋盘覆盖
  7. 最大子数组

源码链接:https://github.com/edisonleolhl/DataStructure-Algorithm/tree/master/Divede-and-conquer

分治的基本概念

二分查找

百度百科:如果线性表里只有一个元素,则只要比较这个元素和x就可以确定x是否在线性表中。因此这个问题满足分治法的第一个适用条件;同时我们注意到对于排好序的线性表L有以下性质:比较x和L中任意一个元素L[i],若x=L[i],则x在L中的位置就是i;如果x<L[i],由于L是递增排序的,因此假如x在L中的话,x必然排在L[i]的前面,所以我们只要在L[i]的前面查找x即可;如果x>L[i],同理我们只要在L[i]的后面查找x即可。无论是在L[i]的前面还是后面查找x,其方法都和在L中查找x一样,只不过是线性表的规模缩小了。这就说明了此问题满足分治法的第二个和第三个适用条件。很显然此问题分解出的子问题相互独立,即在L[i]的前面或后面查找x是独立的子问题,因此满足分治法的第四个适用条件。

快速排序

归并排序

x^n

找出伪币

棋盘覆盖

最大子数组

解法一:暴力求解

解法二:分治策略

解法三:联机算法

百度百科:联机算法是在任意时刻算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。

解法四:动态规划

感觉解法三、解法四很像,等到时候学习动态规划了,再来好好琢磨琢磨解法四的精髓。

找出数组中最大的两个数

参考视频:http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240184_p1+sp/courseware/b64e822fe8bf4fc18e86a560087efebc/e794869faa9844528206ba3e9ab6b640/

我感觉视频中前两种方法有点点问题,把 A[0] 作为 x1, x2 的初值,有些刁钻的测试用例会有错误的输出,所以我把初值都改为了负无穷大,相应的,比较的次数会多一次,但是分析的思想没变。

上一篇 下一篇

猜你喜欢

热点阅读