July_algorithm 3.2数组.pdf
《July_algorithm 3.2数组.pdf》由会员分享,可在线阅读,更多相关《July_algorithm 3.2数组.pdf(50页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数组七月算法邹博2015年10月24日10月算法在线班2/50天平与假币 有12枚硬币,其中有1枚是假币,但不知道是重还是轻。现给定一架没有砝码的天平,问至少需要多少次称量才能找到这枚假币?进一步:如何证明某个方案是最少次数?10月算法在线班3/50解析 随机将12枚硬币等分成3份,每份4枚;标记为A、B、C三份。将A放于左侧,B放于右侧,用天平称量A和B,分三种情况:1.天平平衡 2.A(左)比B(右)重 3.A(左)比B(右)轻 与2对称,只分析2即可10月算法在线班4/501.天平平衡 天平平衡,说明A、B中都没有假币,假币在C中,将C中的4枚编号为甲乙丙丁。取甲乙用天平称量,若平衡,说
2、明甲乙是真币,丙丁有一枚是假币。取甲丙用天平称量,若不平衡,说明丙是假币;若平衡,说明丙是真币,丁是假币。10月算法在线班5/502.A(左)比B(右)重 说明假币必然在A、B中,C中的4枚都是真币。将A中4枚硬币编号为1234,B中编号为5678,C中编号为甲乙丙丁。选125放于左侧,34甲放于右侧;天平有三种情况:天平平衡:说明678含假币,且假币轻125比34甲重 说明12含假币,且假币重125比34甲轻 说明34含假币,且假币重 或者5是假币,且假币轻 无论如何,最多再一次称量即可找到假币。10月算法在线班6/50理论下界 一次天平称量能得到左倾、右倾、平衡3种情况,则把一次称量当成一
3、位编码,该编码是3进制的。问题转换为:需要多少位编码,能够表示12呢?由于12的轻重未知,有两种可能,因此,需要用3进制表示24。答:假定需要n位,则:3n24 取对数后计算得到n2.89,这表示至少3次才能找到该轻质的假币。10月算法在线班7/50再次思考 题目变成13枚硬币呢?有13枚硬币,其中有1枚是假币,但不知道是重还是轻。现给定一架没有砝码的天平,问至少需要多少次称量才能找到这枚假币?答:3次。10月算法在线班8/50求局部最大值 给定一个无重复元素的数组A0N-1,求找到一个该数组的局部最大值。规定:在数组边界外的值无穷小。即:A0A-1,AN-1 AN。显然,遍历一遍可以找到全局
4、最大值,而全局最大值显然是局部最大值。可否有更快的办法?10月算法在线班9/50问题分析 定义:若子数组Arrayfrom,to满足 ArrayfromArrayfrom-1 ArraytoArrayto+1 称该子数组为“高原数组”。若高原数组长度为1,则该高原数组的元素为局部最大值。10月算法在线班10/50算法描述 使用索引left、right分别指向数组首尾,根据定义,该数组为高原数组。求中点mid=(left+right)/2 AmidAmid+1,子数组Aleftmid为高原数组丢弃后半段:right=mid Amid+1Amid,子数组Amidright高原数组丢弃前半段:lef
5、t=mid+1 递归直至left=right时间复杂度为O(logN)。10月算法在线班11/50Code10月算法在线班12/50第一个缺失的整数 给定一个数组A0N-1,找到从1开始,第一个不在数组中的正整数。如3,5,1,2,-3,7,14,8输出4。10月算法在线班13/50循环不变式 思路:将找到的元素放到正确的位置上,如果最终发现某个元素一直没有找到,则该元素即为所求。循环不变式:如果某命题初始为真,且每次更改后仍然保持该命题为真,则若干次更改后该命题仍然为真。为表述方便,下面的算法描述从1开始数。10月算法在线班14/50利用循环不变式设计算法 假定前i-1个数已经找到,并且依次
6、存放在A1,2,i-1中,继续考察Ai:若Aii且Ai1,则Ai在A1,2,i-1中已经出现过,可以直接丢弃。若Ai为负,则更应该丢弃它。若Aii且AiN,则Ai应该置于后面的位置,即将AAi和Ai交换。若AiN,由于缺失数据N,则Ai丢弃。若AAiAi,则显然不必交换,直接丢弃Ai即可。若Aii,则Ai位于正确的位置上,则i加1,循环不变式扩大,继续比较后面的元素。10月算法在线班15/50合并相同的分支 整理算法描述:若Aii,i加1,继续比较后面的元素。若Aii或AiN或AAiAi,丢弃Ai 若Aii,则将AAi和Ai交换。思考:如何快速丢弃Ai?将AN赋值给Ai,然后N减1。10月算法
7、在线班16/50Code10月算法在线班17/50查找旋转数组的最小值 假定一个排序数组以某个未知元素为支点做了旋转,如:原数组0 1 2 4 5 6 7旋转后得到4 5 6 7 0 1 2。请找出旋转后数组的最小值。假定数组中没有重复数字。10月算法在线班18/50分析 旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素;4 5 6 7 0 1 2 注意到实际上最小的元素就是两个子数组的分界线。10月算法在线班19/50寻找循环数组最小值:4 5 6 7 0 1 2 用索引left,right分别指向首尾元素,元素不重复。若子数组是普通升序数组,则Ale
8、ftAright 计算中间位置mid=(low+high)/2;显然,Alowmid与Amid+1high必有一个是循环升序数组,一个是普通升序数组。若:AmidAhigh,说明子数组Amid+1,mid+2,high循环升序;更新low=mid+1;若:AmidAhigh,说明子数组Amid+1,mid+2,high普通升序;更新:high=mid10月算法在线班20/50代码10月算法在线班21/50零子数组 求对于长度为N的数组A,求连续子数组的和最接近0的值。如:数组A、1,-2,3,10,-4,7,2,-5 它是所有子数组中,和最接近0的是哪个?10月算法在线班22/50算法流程 申
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- July_algorithm 3.2数组 3.2 数组
限制150内