July_algorithm 6.1排序查找.pdf
《July_algorithm 6.1排序查找.pdf》由会员分享,可在线阅读,更多相关《July_algorithm 6.1排序查找.pdf(85页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、排序查找七月算法邹博2015年11月1日10月算法在线班2/85八皇后问题 在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种解法。10月算法在线班3/85八皇后问题算法分析 分析:显然任意一行有且仅有1个皇后,使用数组queen07表示第i行的皇后位于哪一列。对于“12345678”这个字符串,调用全排列问题的代码,并且加入分支限界的条件判断是否相互攻击即可;10月算法在线班4/85八皇后问题算法分析 深度优先搜索:将第i个皇后放置在第j列上,如果当前位置与其他皇后相互攻击,则剪枝掉该结点。分析对角线:主对角线上(i-j)为定值
2、,取值范围是-(N-1)(i-j)N-1,从而:0(i-j+N-1)2*N-2;次对角线上(i+j)为定值,取值范围是0(i+j)2*N-2;使用m102N-2、m202N-2记录皇后占据的对角线 上述数据结构与剪枝过程适用于N皇后问题。10月算法在线班5/85Code10月算法在线班6/85Code10月算法在线班7/85数独Sudoku 解数独问题,初始化时的空位用.表示。每行、每列、每个九宫内,都是1-9这9个数字。10月算法在线班8/85数独Sudoku分析 若当前位置是空格,则尝试从1到9的所有数;如果对于1到9的某些数字,当前是合法的,则继续尝试下一个位置调用自身即可。10月算法在
3、线班9/85Code10月算法在线班10/85Code10月算法在线班11/85非递归数独Sudoku10月算法在线班12/85马踏棋盘 给定mn的棋盘,将棋子“马”放在任意位置上,按照走棋规则将“马”移动,要求每个方格只能进入一次,最终使得“马”走遍棋盘的所有位置。如给定88的国际象棋棋盘(右)如给定89的中国象棋棋盘(左)10月算法在线班13/85问题分析 显然,如果从A点能够跳到B点,则从B点也能够跳到A点。所以,马的起始位置可以从任意一点开始,不妨从左上角开始。若当前位置为(i,j),则遍历(i,j)的八邻域,如果邻域尚未经过,则跳转。深度优先搜索10月算法在线班14/85Code10
4、月算法在线班15/85启发式搜索 若棋盘规模较大,则在较深的棋位才能发现“无路可走”而不得不回溯。贪心的启发式策略:最多情况下,每个棋位有8个后继。由于棋盘边界和已经遍历的原因,往往是少于8个的。当前棋位可以跳转的后继棋位记为x个,这x个棋位的后继棋位数目记做h1h2hx,优先选择最小的hi。策略:优先选择孙结点数目最少的那个子结点原因:孙结点最少的子结点,如果当前不跳转则最容易在后期无法跳转。10月算法在线班16/85Code10月算法在线班17/85Code10月算法在线班18/85Code10月算法在线班19/85主要内容与目标 排序 找到一个O(NlogN)的排序算法 插入排序、选择排
5、序、希尔排序、冒泡排序 堆排序及其思考 快速排序及其思考 非比较方案的排序:记数排序、桶排序、基数排序 总结与思考 排序的目的是什么?10月算法在线班20/85排序问题的提法 给定n个元素的集合A,按照某种方法将A中的元素按非降或非增次序排列。分类:内排序,外排序 常见内排序方法 插入排序/希尔排序 选择排序/锦标赛排序/堆排序 冒泡排序/快速排序 归并排序 基数排序10月算法在线班21/85插入排序/将A(1:n)中的元素按非降次序分类,n1 procedure INSERTIONSORT(A,n)A(0)-/设置初始边界值for j2 to n do/A(1:j-1)已分类itemA(j)
6、;ij-1while itemA(i)do/0ijA(i+1)A(i);ii-1repeatA(i+1)item;repeat end INSERTIONSORT 10月算法在线班22/85锦标赛排序10月算法在线班23/85锦标赛排序10月算法在线班24/85归并排序 基本思想:将数组A0n-1中的元素分成两个子数组:A10n/2和A2n/2+1n-1。分别对这两个子数组单独排序,然后将已排序的两个子数组归并成一个含有n个元素的有序数组。10月算法在线班25/85Code10月算法在线班26/85归并排序的时间复杂度性能分析算法的递推关系:,c为常数若,则有:若2kn2k+1,则T(2k)T
7、(n)4-3-2-5-2和x=3,返回1-2-2-4-3-5。10月算法在线班55/85问题分析 分别申请两个指针p1和p2,小于x的添加到p1中,大于等于x的添加到p2中;最后,将p2链接到p1的末端即可。时间复杂度是O(N),空间复杂度为O(1);该问题其实说明:快速排序对于单链表存储结构仍然适用。注:不是所有排序都方便使用链表存储,如堆排序,将不断的查找数组的n/2和n的位置,用链表做存储结构会不太方便。10月算法在线班56/85Code10月算法在线班57/85快速排序Code10月算法在线班58/85快速排序与归并排序的联系 都是分治的思想;经过一次划分后,实现了对A的调整:其中一个
8、子集合的所有元素均小于等于另外一个子集合的所有元素;按同样的策略对两个子集合进行分类处理。当子集合分类完毕后,整个集合的分类也完成了。这一过程避免了子集合的归并操作。10月算法在线班59/85快速排序的性能分析 在最好的情况,每次运行一次分区,我们会把一个数列分为两个几近相等的片段。然后,递归调用两个一半大小的数列。一次分区中,i、j一共遍历了n个数,即O(n)记:快速排序的时间复杂度为T(n),有,T(n)=2*T(n/2)+cnc是某常数 T(n)=O(n*logn)10月算法在线班60/85快速排序的性能分析 在最坏的情况下,两个子数组的长度为 1 和n-1 T(n)=T(1)+T(n-
9、1)+cn 演示:计算得到T(n)=O(n2)思考:如果每次分区,都把数组分成1%和99%的两个子数组,时间复杂度是多少?10月算法在线班61/85附:根据前序中序,计算后序 前序遍历:GDAFEMHZ 中序遍历:ADEFGHMZ 根据前序遍历的特点得知,根结点为G;根结点将中序遍历结果ADEFGHMZ分成ADEF和HMZ两个左子树、右子树。递归确定中序遍历序列ADEF和前序遍历序列DAEF的子树结构;递归确定中序遍历序列HMZ和前序遍历序列MHZ的子树结构;10月算法在线班62/85Code问:时间复杂度是多少?10月算法在线班63/85Heap VS Quick 快速排序的最直接竞争者是堆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- July_algorithm 6.1排序查找 6.1 排序 查找
限制150内