困惑的点——log,如何计算得出?

① 上限:用来表示该算法可能有的最高增长率。

② 大O表示法:如果某种算法的增长率上限(最差情况下)是f(n),那么说这种算法“在O(f(n))中”。n为输入规模。

上限的精确定义:对非负函数T(n),若存在两个正常数c和n0,对任意n>n0,有T(n)<cf(n),则称T(n)在集合O(f(n))中。

——T(n)表示算法的实际运行时间;

——f(n)是上限函数的一个表达式。

我们总是试图给算法的时间代价找到一个最“紧”(即最小)的上限,因此一般说顺序搜索法在O(n)中,而不是等于,因为也可以说它在O(n2)中。可以理解为O为上限的集合?

几个例子:

sum=0;

for(i=1;i<=n;i++)

sum+=n;

for循环执行,时间代价为O(n)。

sum=0;

for(i=1;i<=n;i++)

for(j=1;j<=i;j++)

sum+=n;

内层循环执行i次,外层执行n次,但是每一次内层循环的时间代价都因i的变化而不同。可以看到,第一次执行外层循环时i=1,第二次执行时i=2。每执行一次外层循环,i就以1的步长递增,直至最后一次i=n。因此,总的时间代价是从1累加到n,即 ,总运行时间为O(c3n2+c2n+c1),可化简为O(n2)。

③ 双重循环如排序,时间代价也为O(n2),只不过运行时间为第二个程序的两倍。上例中c3为1/2。

sum=0;

for (k=1;k<=n;k=k*2)    //Do log n times;

for (j=1;j<=n;j++)       // Do n times;

{

sum++;

}

内层循环执行次数恒为n。设外层循环执行次数为i,则循环结束时2i-1=n,i为logn,所以总时间代价为nlogn。

sum=0;

for (k=1;k<=n;k=k*2)    //Do log n times;

for (j=1;j<=k;j++)       // Do k times;

{

sum++;

}

外层循环同上,依旧是logn次,但内层循环次数为k,每次都随着外层循环变量k值的变化而变化。设外层循环执行第i次,则k=2i-1,即内层执行2i-1次。外层执行一次内层执行20次,外层执行两次内层21,一共执行20+21次,以此类推总的执行次数为 ,最终可化简为O(n)。

关于大O法可参考:https://blog.csdn.net/yuhk231/article/details/60099774

大O法时间复杂度计算的更多相关文章

  1. 大M法(Big M Method)

    前面一篇讲的单纯形方法的实现,但程序输入的必须是已经有初始基本可行解的单纯形表. 但实际问题中很少有现成的基本可行解,比如以下这个问题: min f(x) = –3x1 +x2 + x3 s.t. x ...

  2. 自适应阈值二值化之最大类间方差法(大津法,OTSU)

    最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间 ...

  3. 大津法---OTSU算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  4. 自适应阈值分割—大津法(OTSU算法)C++实现

    大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命名的.大津法按照图像上灰度值的分布,将图像分成背景和前景两部分看待,前景就是我们要按照阈值分割出来的部分.背景和 ...

  5. OSTU大津法图像分割

    OSTU图像分割 最大类间方差法,也成大津法OSTU,它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分 ...

  6. 服务端、实时、大数据、AI计算

    服务端.实时.大数据.AI计算,各种各样的计算,计算机本质是什么,计算机的本质是 利用compute的计算速度为人提供更优的计算结果. 所以实时也好,准实时.离线.AI本质上是两个维度,实时准实时强调 ...

  7. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...

  8. Java基础-时间复杂度计算方式

    Java基础-时间复杂度计算方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   时间复杂度通常是衡量算法的优劣的,衡量算法的时间严格来讲是很难衡量的,由于不同的机器性能不用环境 ...

  9. python学习--大数据与科学计算第三方库简介

    大数据与科学计算  库名称 简介 pycuda/opencl GPU高性能并发计算 Pandas python实现的类似R语言的数据统计.分析平台.基于NumPy和Matplotlib开发的,主要用于 ...

随机推荐

  1. 打包的@font-face包

    在网页中使用 @font-face 规则嵌入字体,前提是可以从你的网站或第三方 Web 服务器下载到相应的字体.以这种方式提供的字体,会在使用该字体的页面第一次加载时被浏览器下载并缓存起来,以后就不用 ...

  2. 2018ICPC焦作 F. Honeycomb /// BFS

    题目大意: 给定n m表示一共n行每行m个蜂巢 求从S到T的最短路径 input 1 3 4 +---+ +---+ / \ / \ + +---+ +---+ \ \ / \ + + S +---+ ...

  3. Codeforces 479【A】div3试个水

    题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...

  4. selenium基础(滚动条操作)

    滚动条操作:当待操作的元素在页面可是区域外时,要将待操作的元素滚动到可视区域当中 步骤:1.先找要将要操作的元素element = driver.find_element_by_xxxx(" ...

  5. Redis连不上的一些细节配置

    远程链接redis连不上,在确保防火墙设置正确的情况下 把redis.conf中的 bind 127.0.0.1注释 另外把protected-mode yes 改为protected-mode no

  6. 【Wikioi】P1401 逆序统计 代码

    题目链接:http://wikioi.com/solution/list/1401/ 题解链接:http://user.qzone.qq.com/619943612/blog/1377265690 代 ...

  7. JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = "I love JavaScript!"

    String 字符串对象 在之前的学习中已经使用字符串对象了,定义字符串的方法就是直接赋值.比如: var mystr = "I love JavaScript!" 定义mystr ...

  8. 【转载】OpenCL实现矩阵相乘

    矩阵相乘其实就是前一个矩阵的每一行乘以后一个矩阵的每一列,然后将乘后的每一个数字相加,得到结果矩阵的指定位置的数值.具体算法回顾一下线性代数即可.但是这种行列相乘其实都是独立的,如果是CPU计算必须串 ...

  9. 阿里云Aliplayer高级功能介绍(一):视频截图

    基本介绍 H5 Video是不提供截图的API的, 视频截图需要借助Canvas,通过Canvas提供的drawImage方法,把Video的当前画面渲染到画布上, 最终通过toDataURL方法可以 ...

  10. 修改web项目的启动页

    修改web项目的启动页