码迷,mamicode.com
首页 > 编程语言 > 详细

算法的基础

时间:2019-03-17 23:25:39      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:数字   --   n个元素   包含   就是   排序   猜数游戏   开始   一个   

一、二分查找:

  假如我们来玩一个猜数的游戏,随便想一个1~100的数字,最多需要几次能猜对呢?

  傻找:什么是傻找呢,就是从1开始往上猜,如果想的数是99,岂不是要猜99次,你不傻谁傻?

  最佳的方案:如果我说50,你说猜小了,哇咔咔我们一下子就排除了50个数,再接下来知道怎么猜了把,当然是75啦,即每次猜的数都是余下数的一半,如此下去,不管你想的数是多少,我都能在7次之内猜出来,这就是大名鼎鼎的二分查找法。

  注意:二分查找法只适用于有序的列表。

  一般而言,对于包含n个元素的列表,用二分查找法最多需要log2的n步,而简单查最多需要n步。

  对数:

  算法的世界里,怎么可能少得了数字,那什么叫对数呢?

  如果a的x次方等于N(a>0,且a不等于1),那么数x就叫做以a为底N的对数,记作x=loga(N),其中a为底数,N为真数。例子:2的3次方等于8,那么3就是以2为底8的对数。

二、运行时间:

  线性时间,简单查找(逐个检查)列表中的元素,换言之,最多需要猜测的次数(之前的猜数)与列表长度相同,这被称为线性时间。

  对数时间,以二分查找运行的时间称为对数时间(log时间,log指log2,2为底数)。

  

三、大O表示法

  大O表示法为一种特殊的表示法,指出了算法的速度有多块。

  举例:如果说检查一个元素需要1毫秒。使用简单查找时,需要100毫秒(猜数游戏为例),那么二分查找大约需要(log2的100)7毫秒;由此可以得出简单查找所需的时间大约是二分查找的15倍;如果一个序列中包含10亿个元素,二分查找需要约30毫秒,那么简单查找所需要的时间为30*15=450毫秒,结果真的是这样吗?

  其实不是,而且是大错特错!!!

  简单查找与二分查找运行时间的增速不同,什么意思呢?

  也就是说,随着元素数量的增多,二分查找需要的额外时间并不多,而简单查找需要的额外时间却很多。因此,随着列表的增长,二分查找的速度比简单查找快得多。

  有签于此,仅知道算法需要多长时间才能郧西那个完毕还不够,还需要知道郧西那个时间如何随着列表增长而增大,这正是大O表示法的意义所在。

  大O表示法指出了算法有多块。例如,建设列表包含n个元素,简单查找需要检查每个元素,需要执行n次,使用大O表示法,这个时间为O(n),单位秒?没有--大O表示法指的并非以秒为单位的速度,而是让你比较操作数,它指出了算法运行时间的增速。

  二分查找法大O表示法为O(logn,注意此处log为简写,实际为log2的n次方)。

  注意:大O表示法指出的永远都是最糟糕情况下的运行时间。

  一些常见的大O运行时间:

  O(log n),对数时间,这样的算法包括二分查找;

  O(n),线性时间,这样的算法博爱阔简单查找;

  O(n * log n),快速排序,一种速度较快的排序算法;

  O(n的2次方),选择排序,一种速度较慢的排序算法;

  O(n!),旅行商解决方案,一种非常慢的算法。

 

总结:

  算法的速度指的并非时间,而是操作数的增速;

  二分查找的速度比简单查找快得多;

  O(log n)比O(n)快。需要搜索的元素越多,前者比后者就快得越多;

  算法运行时间是从其增速的角度度量的;

  算法运行时间使用大O表示法表示。

算法的基础

标签:数字   --   n个元素   包含   就是   排序   猜数游戏   开始   一个   

原文地址:https://www.cnblogs.com/zsvslx/p/10549508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!