zoukankan      html  css  js  c++  java
  • 算法的基础

    一、二分查找:

      假如我们来玩一个猜数的游戏,随便想一个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表示法表示。

  • 相关阅读:
    笔记
    Jquery 实现select 3级级联查询
    将properties文件的配置设置为整个Web应用的全局变量。
    jquery ajax异步提交表单数据
    tomcat : 虚拟路径映射
    使用bootstrap-select控件 搜索栏键入关键字动态获取后台数据
    Springboot解决ajax跨域的三种方式
    oracle中的递归查询语句
    oracle使用序列自定义固定长度id
    JVM内存空间
  • 原文地址:https://www.cnblogs.com/zsvslx/p/10549508.html
Copyright © 2011-2022 走看看