吉林公务员考试《行测》甲级真题及参考解析.doc
《吉林公务员考试《行测》甲级真题及参考解析.doc》由会员分享,可在线阅读,更多相关《吉林公务员考试《行测》甲级真题及参考解析.doc(34页珍藏版)》请在文库网上搜索。
1、04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 上一节,我们讲了复杂度的大O表示法和几个分析技巧,还举了一些常见复杂度分析的例子,比如O(1)、O(logn)、O(n)、O(nlogn)复杂度分析。掌握了这些内容, 对于复杂度分析这个知识点,你已经可以到及格线了。但是,我想你肯定不会满足于此。 今天我会继续给你讲四个复杂度分析方面的知识点,最好情况时间
2、复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均 情况时间复杂度(average case time complexity)、均摊时间复杂度(amortized time complexity)。如果这几个概念你都能掌握,那对你来说,复杂度分析这部分内 容就没什么大问题了。 最好、最坏情况时间复杂度 上一节我举的分析复杂度的例子都很简单,今天我们来看一个稍微复杂的。你可以用我上节教你的分析技巧,自己先试着分析一下这段代码的时间复杂度。 / n表示数组array的长度 int find(int arra
3、y, int n, int x) int i = 0; int pos = -1; for (; i n; +i) if (arrayi = x) pos = i; return pos; 你应该可以看出来,这段代码要实现的功能是,在一个无序的数组(array)中,查找变量x出现的位置。如果没有找到,就返回-1。按照上节课讲的分析方法,这 段代码的复杂度是O(n),其中,n代表数组的长度。 我们在数组中查找一个数据,并不需要每次都把整个数组都遍历一遍,因为有可能中途找到就可以提前结束循环了。但是,这段代码写得不够高效。我们可以这 样优化一下这段查找代码。 / n表示数组array的长度 int
4、 find(int array, int n, int x) int i = 0; int pos = -1; for (; i n; +i) if (arrayi = x) pos = i; break; return pos; 这个时候,问题就来了。我们优化完之后,这段代码的时间复杂度还是O(n)吗?很显然,咱们上一节讲的分析方法,解决不了这个问题。 因为,要查找的变量x可能出现在数组的任意位置。如果数组中第一个元素正好是要查找的变量x,那就不需要继续遍历剩下的n-1个数据了,那时间复杂度就 是O(1)。但如果数组中不存在变量x,那我们就需要把整个数组都遍历一遍,时间复杂度就成了O(n)。
5、所以,不同的情况下,这段代码的时间复杂度是不一样的。 为了表示代码在不同情况下的不同时间复杂度,我们需要引入三个概念:最好情况时间复杂度、最坏情况时间复杂度和平均情况时间复杂度。 顾名思义,最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂度。就像我们刚刚讲到的,在最理想的情况下,要查找的变量x正好是数组的 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 第一个元素,这个时候对应的时间复杂度就是最好
6、情况时间复杂度。 同理,最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。就像刚举的那个例子,如果数组中没有要查找的变量x,我们需要把整个数组 都遍历一遍才行,所以这种最糟糕情况下对应的时间复杂度就是最坏情况时间复杂度。 平均情况时间复杂度 我们都知道,最好情况时间复杂度和最坏情况时间复杂度对应的都是极端情况下的代码复杂度,发生的概率其实并不大。为了更好地表示平均情况下的复杂度, 我们需要引入另一个概念:平均情况时间复杂度,后面我简称为平均时间复杂度。 平均时间复杂度又该怎么分析呢?我还是借助刚才查找变量x的例子来给你解释。 要查找的变量x在数组中的位置,有n+1种情况:在数
7、组的0n-1位置中和不在数组中。我们把每种情况下,查找需要遍历的元素个数累加起来,然后再除以n+1, 就可以得到需要遍历的元素个数的平均值,即: 我们知道,时间复杂度的大O标记法中,可以省略掉系数、低阶、常量,所以,咱们把刚刚这个公式简化之后,得到的平均时间复杂度就是O(n)。 这个结论虽然是正确的,但是计算过程稍微有点儿问题。究竟是什么问题呢?我们刚讲的这n+1种情况,出现的概率并不是一样的。我带你具体分析一下。(这里 要稍微用到一点儿概率论的知识,不过非常简单,你不用担心。) 我们知道,要查找的变量x,要么在数组里,要么就不在数组里。这两种情况对应的概率统计起来很麻烦,为了方便你理解,我们
8、假设在数组中与不在数组中的概 率都为1/2。另外,要查找的数据出现在0n-1这n个位置的概率也是一样的,为1/n。所以,根据概率乘法法则,要查找的数据出现在0n-1中任意位置的概率就 是1/(2n)。 因此,前面的推导过程中存在的最大问题就是,没有将各种情况发生的概率考虑进去。如果我们把每种情况发生的概率也考虑进去,那平均时间复杂度的计算过 程就变成了这样: 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 这个值
9、就是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度。 引入概率之后,前面那段代码的加权平均值为(3n+1)/4。用大O表示法来表示,去掉系数和常量,这段代码的加权平均时间复杂度仍然是O(n)。 你可能会说,平均时间复杂度分析好复杂啊,还要涉及概率论的知识。实际上,在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情 况。像我们上一节课举的那些例子那样,很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们 才会使用这三种复杂度表示法来区分。 均摊时间复杂度 到此为止,你应该
10、已经掌握了算法复杂度分析的大部分内容了。下面我要给你讲一个更加高级的概念,均摊时间复杂度,以及它对应的分析方法,摊还分析(或 者叫平摊分析)。 均摊时间复杂度,听起来跟平均时间复杂度有点儿像。对于初学者来说,这两个概念确实非常容易弄混。我前面说了,大部分情况下,我们并不需要区分最好、 最坏、平均三种复杂度。平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。 老规矩,我还是借助一个具体的例子来帮助你理解。(当然,这个例子只是我为了方便讲解想出来的,实际上没人会这么写。) / array表示一个长度为n的数组 / 代码中的array.length就等于n in
11、t array = new intn; int count = 0; void insert(int val) if (count = array.length) int sum = 0; for (int i = 0; i = len) / 数组空间不够了 / 重新申请一个2倍大小的数组空间 int new_array = new intlen*2; / 把原来array数组中的数据依次copy到new_array for (int j = 0; j len; +j) new_arrayj = arrayj; / new_array复制给array,array现在大小就是2倍len了 arr
12、ay = new_array; len = 2 * len; / 将element放到下标为i的位置,下标i加一 arrayi = element; +i; 欢迎留言和我分享,我会第一时间给你反馈。 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 精选留言: Alvin 2018-09-28 01:56:09 老师讲的很好,练习题最好是O(1),最差是O(n), 均摊是O(1)。 看到好多人纠结于清空数组的问题:
13、 对于可反复读写的存储空间,使用者认为它是空的它就是空的。如果你定义清空是全部重写为0或者某个值,那也可以! 04|复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度 file:/F/temp/geektime/数据结构与算法之美/04复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度.html2019/1/15 15:35:12 但是老师举的例子完全没必要啊!写某个值和写任意值在这里有区别吗,使用值只关心要存的新值!所以老师的例子,清空把下标指到第一个位置就可以了 ! 742赞 作者回复2018-09-28 02:07:26 嗯嗯 是的 多谢你。同学们帮把这一条顶上去吧 可以让其他同
14、学都看看 阿杜S考特 2018-09-27 2技巧和诀窍技巧和诀窍 3V M 2006 Microchip Technology Inc.DS41285A_CN 第 i 页 技巧和诀窍简介技巧和诀窍简介 技巧 #1:使用 LDO 稳压器,从 5V 电源向 3.3V 系统供 电 4 技巧 #2:选择方案:采用齐纳二极管的低成本供电系统 6 技巧 #3:选择方案:采用 3 个整流二极管的更低成本供 电系统 .8 技巧 #4:使用开关稳压器,从 5V 电源向 3.3V 系统供 电 10 技巧 #5:3.3V ? 5V 直接连接 .13 技巧 #6:3.3V ? 5V 使用 MOSFET 转换器.14
15、 技巧 #7:3.3V ? 5V 使用二极管补偿.16 技巧 #8:3.3V ? 5V 使用电压比较器.18 技巧 #9:5V ? 3.3V 直接连接 .21 技巧 #10: 5V ? 3.3V 使用二极管钳位22 技巧 #11: 5V ? 3.3V 有源钳位.24 技巧 #12: 5V ? 3.3V 电阻分压器.25 技巧 #13: 3.3V ? 5V 电平转换器.29 技巧 #14: 3.3V ? 5V 模拟增益模块32 技巧 #15: 3.3V ? 5V 模拟补偿模块33 技巧 #16: 5V ? 3.3V 有源模拟衰减器34 技巧 #17: 5V ? 3.3V 模拟限幅器.37 技巧
16、#18: 驱动双极型晶体管 41 技巧 #19: 驱动 N 沟道 MOSFET 晶体管 44 目录目录 技巧和诀窍技巧和诀窍 技巧和诀窍技巧和诀窍 DS41285A_CN 第 ii 页 2006 Microchip Technology Inc. 注:注: 技巧和诀窍技巧和诀窍 2006 Microchip Technology Inc.DS41285A_CN 第 1 页 技巧和诀窍简介技巧和诀窍简介 3.3 伏至 5 伏连接。 概述概述 我们对处理速度的需求日益增长,伴随着这种增 长,用来构建单片机的晶体管尺寸则在持续减小。 以更低的成本实现更高的集成度,也促进了对更小 的几何尺寸的需求。随
17、着尺寸的减小,晶体管击穿 电压变得更低,最终,当击穿电压低于电源电压 时,就要求减小电源电压。因此,随着速度的提高 和复杂程度的上升,对于高密度器件而言,不可避 免的后果就是电源电压将从 5V 降至 3.3V,甚至 1.8V。 Microchip 单片机的速度和复杂性已经到达足以要 求降低电源电压的程度,并正在向 5V 电源电压以 下转换。但问题是绝大多数接口电路仍然是为 5V 电源而设计的。这就意味着,作为设计人员,我们 现在面临着连接 3.3V 和 5V 系统的任务。此外, 这个任务不仅包括逻辑电平转换,同时还包括为 3.3V 系统供电、 转换模拟信号使之跨越 3.3V/5V 的 障碍。
18、技巧和诀窍技巧和诀窍 DS41285A_CN 第 2 页 2006 Microchip Technology Inc. 本 技巧和诀窍提供了一些电源供电组件、数 字电平转换组件甚至模拟转换组件,以解决所面临 的挑战。全书对每种转换均给出了多种选择方案, 从单片 (All-in-One)接口器件到低成本的分立解 决方案都有涉及。简而言之,无论导致转换的原因 是复杂性、成本还是尺寸,设计人员处理 3.3V 挑 战可能需要的全部组件均在本文有所讨论。 注:注: 本 技巧和诀窍中假设电源为 3.3V。然 而对于其他电源电压,给出的方法只需要 经过适当的修正,将同样适用。 技巧和诀窍技巧和诀窍 2006
19、 Microchip Technology Inc.DS41285A_CN 第 3 页 电源电源 面对 3.3V 挑战首先要解决的问题之一是产生 3.3V 电源电压。假设讨论的是 5V 系统至 3.3V 系统的 连接,我们可以认为已经拥有稳定的 5 VDC电源。 本节将给出针对 5V 至 3.3V 转换而设计的电压稳 压器解决方案。只需要适中的电流消耗的设计可以 使用简单的线性稳压器。如果电流需求较高的话, 可能就需要开关稳压器解决方案。对成本敏感的应 用,可能需要简单的分立式二极管稳压器。下面针 对这几种情况各给出一个例子,同时包含了必要的 支持信息,使其适用于各种最终应用。 表表 1:电源
20、比较:电源比较 方法方法VREGIQ效率尺寸成本瞬态响应效率尺寸成本瞬态响应 齐纳旁路 稳压器 10% 典型值 5 mA60% 小低差 串联线性 稳压器 0.4% 典型值 1 A 至 100 A 60% 小中极好 开关降压 稳压器 0.4% 典型值 30 A 至 2 mA 93% 中 到 大 高好 技巧和诀窍技巧和诀窍 DS41285A_CN 第 4 页 2006 Microchip Technology Inc. 技巧技巧 #1使用使用 LDO 稳压器,从稳压器,从 5V 电源向电源向 3.3V 系统供电系统供电 标准三端线性稳压器的压差通常是 2.0-3.0V。要 把 5V 可靠地转换为
21、3.3V,就不能使用它们。压 差为几百个毫伏的低压降 (Low Dropout, LDO) 稳压器,是此类应用的理想选择。图 1-1 是基本 LDO 系统的框图,标注了相应的电流。从图中可 以看出, LDO 由四个主要部分组成: 1. 导通晶体管 2. 带隙参考源 3. 运算放大器 4. 反馈电阻分压器 在选择 LDO 时,重要的是要知道如何区分各种 LDO。器件的静态电流、封装大小和型号是重要 的器件参数。根据具体应用来确定各种参数,将会 得到最优的设计。 技巧和诀窍技巧和诀窍 2006 Microchip Technology Inc.DS41285A_CN 第 5 页 图图 1-1:LD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 行测 吉林 公务员 考试 甲级 参考 解析