- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十七课数据结构(上)
第十七课:数据结构(上) 周甫 zoofchow@ 学习目标 1 算法(algorithm) 什么是算法? 对一个现有的问题我们采取的解决过程及方法,即为算法. 一个用算法实现的程序会耗费两种资源:处理时间和内存。 算法的效率分析标准 简单性和清晰度 空间效率 时间效率 算法的类型 贪婪算法(greedy algorithm) 分治算法(divide-and-conquer algorithm) 回溯算法(backtracking algorithm) 计算增长率的方式 1.测量执行时间 通过System.currentTimeMillis()方法来测试 * 缺点: a.不同的平台执行的时间不同 b.有些算法随着输入数据的加大,测试时间会变得不切实际! 2.指令计数 指令---指编写算法的代码.对一个算法的实现代码计算执行指令次数。两种类型指令:不管输入大小,执行次数永远不变;执行次数随着输入大小改变而改变。一般,我们主要测试后一种指令。 * 3.代数计算 代码1: long end_time = 0; t1 int testVar = 0; t2 for (int i = 1; i = test_data; i++) t3 { testVar++; t4 testVar--; t4 } 假设t1 --- t4分别代表每条语句的执行时间,那么,以上代码的总执行时间为:t1 + t2 + n(t3 + 2t4).其中n = test_data,当test_data增大时,t1和t2可以忽略不计,也就是说,对于很大的n,执行时间可以近似于:n(t3 + 2t4) 4.测量内存使用率 一个算法中包含的对象和引用的数目,越多则内存使用越高,反之越低 比较增长率 1.代数比较法 条件1:c≦ f(n)/g(n) ≦ d (其中c和d为正常数,n代表输入大小) 当满足以上条件1时,则f(n)和g(n)具备相同的增长率,或者两函数复杂度的阶相同! 如:f(n) = n + 100 和 g(n) = 0.1n + 10 上两函数就具备相同的增长率。 条件2: 当n增大时,f(n)/g(n)趋向于0 当满足此条件2时,则该两个增长函数有不同的增长率。 比如:f(n) = 10000n + 20000 和 g(n) = n?2 + n + 1 。请比较以上两函数增长率是否一样,如果不一样,谁的增长率小? 2.大O表示法 如果f的增长率小于或者等于g的增长率,则我们可以用如下的大O表示法: f = O(g) O表示on the order of 将代码1的代数增长率函数的大O表达式如下: f(n) = t1 + t2 + n(t3 + 2t4) = a1*n + a = O(n) 其中a1 = t3 + 2t4; a = t1 + t2 3.最佳、最差、平均性能 对每一个算法不能只考虑单一的增长率,而应该给出最佳、最差、平均的增长率函数. 2 查找算法 1.线性查找 从数组的第一个元素开始查找,并将其与查找值比较,如果相等则停止,否则继续下一个元素查找,直到找到匹配值。 注意:要求被查找的数组中的元素是无序的、随机的。 static boolean linearSearch(int target, int[] array) { //遍历整个数组,并分别将每个遍历元素与查找值对比 for (int i = 0; i array.length; i++) if (array[i] == target) return true; return false; } 分析该算法的三种情况: a.最佳情况 要查找的值在数组的第一个位置。也就是说只需比较一次就可达到目的,因此最佳情况的大O表达式为:O(1) b.最差情况 要查找的值在数组的末尾或者不存在,则对大小为n的数组必须比较n次,大O表达式为:O(n) c.平均情况 估计会执行:(n + (n - 1) + (n - 2) + ….. + 1)/n = (n + 1) / 2次比较,复杂度为O(n) 2.二分查找 假设被查找数组中的元素是升序排列的,那我们查找值时,首先会直接到数组的中间位置(数组长度/2),并将中间值和查找值比较,如果相等则返回,否则,如果当前元素值小于查找值,则继续在数组的后面一半查找(重复上面过程);如果当前元素值大于查找值,则继续在数组的前面一半查找,
文档评论(0)