当前位置: 首页 > news >正文

东莞做网站哪个公司最好成都网站建设方案推广

东莞做网站哪个公司最好,成都网站建设方案推广,百度seo关键词怎么设置,上海推广网络营销咨询热线时间复杂度 1.算法效率 如何衡量一个算法的好坏呢&#xff1f;看这段代码&#xff1a; long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); }这是斐波那契数列的递归代码&#xff0c;非常简洁&#xff0c;那么这就一定说明它好吗&#xff1f;答案显而易…

时间复杂度

1.算法效率

如何衡量一个算法的好坏呢?看这段代码:

long long Fib(int N)
{if(N < 3)return 1;return Fib(N-1) + Fib(N-2);
}

这是斐波那契数列的递归代码,非常简洁,那么这就一定说明它好吗?答案显而易见。

2.算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间空间两个维度来衡量的,即时间复杂度空间复杂度

==时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。==在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

3.算法的时间复杂度

概念:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,就是算法的时间复杂度。

也就是:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。

Test01

//计算Func1中的++count语句执行了多少次?
void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

count++语句的执行次数:F(N) = N^2 + 2N +10

  • N=10时:F(N) = 130
  • N=100,F(N) = 10210
  • n = 1000,F(N) = 1002010

实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法

大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

大O阶的推导方法:

  1. 若最高阶项不存在,则用常数1取代运行时间中所有的常数部分。
  2. 在修改后的运行函数次数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

那么在Test01中,使用大O表示法之后:时间复杂度为 O(N^2)

大O表示法实际上是去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。

另外有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界)

例如:在一个不重复长度为N的数组中寻找一个值为x的下标。

最好情况:1次找到

最坏情况:N次找到

平均情况:N/2次找到

但是在实际操作中,一般关注的是算法的最坏运行情况所以数组中搜索数据时间复杂度为O(N)

Test02:

//计算Func2中的++count语句执行了多少次?
void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}

Test02的时间复杂度用大O的渐进表示法就为:O(N)。

原因解释:这里的++count语句严格计算的话:共执行了:2N+10次,但是根据大O的渐进表示规则:最高阶项是2N,这里将2去掉,剩下的部分就是时间复杂度。

Test03:

//计算Func3中的++count语句执行了多少次?
void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++k){++count;}for (int k = 0; k < N; ++k){++count;}printf("%d\n", count);
}

Test03的时间复杂度为:

  • 若N与M接近:则O(N)或者O(M)都可以。(当N与M接近时,++count语句的执行次数接近于2N或2M,再去掉常数部分,即可得到答案)
  • 若M>>N,则为O(M)。(当M>>N时,N就可忽略不计。)
  • 若N>>M,则为O(N)。

Test04:

void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}printf("%d\n", count);
}

Test04的时间复杂度为:O(1)

解释:无论其他变量如何变化,++count语句始终会执行100次,始终为常数次,时间复杂度用大O的渐进表示法则为:O(1)。

Test05:

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );

strchr函数的功能是:在str字符串中寻找character字符的下标,若不存在则返回-1。这个函数查找的可以分为最好和最坏两种情况:

  • 最好情况:1次就找到
  • 最坏情况:搜完整个字符串才找到或者不存在。

而在大O的渐进表示法中,一般表示最坏的情况,假设字符串的长度为N,那么strchr函数的时间复杂度就是O(N)了。

Test06:

// 计算BubbleSort的时间复杂度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

Test06的时间复杂度为:O(N2).

原因:冒泡排序是由两层循环嵌套实现的,数组长度为n。假设最坏情况:数组中的元素由大到小排列。外层循环要执行n-1次,内层循环会随着外层循环的增加而减少,所以整体的执行次数为:(N-1) + (N-2) + (N-3) + (N-4) + ……+1,这是一串等差数列,最高阶项就是N2,所以时间复杂度也就是O(N2)。

Test07:

// 计算BinarySearch的时间复杂度?
int BinarySearch(int* a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;// [begin, end]:begin和end是左闭右闭区间,因此有=号while (begin <= end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid - 1;elsereturn mid;}return -1;
}

Test07的时间复杂度是:O(logN),(以2为底,N的对数)。

解释:考虑最差情况:要寻找的数在边界上,即二分区间之内只有一个数。一个长度为N的数组,要执行多少次二分,才能让二分区间只有一个数字?答案是logN次。所以时间复杂度就为O(logN)。

二分查找的效率是非常高的,但是由于被二分的数组必须有序,那么二分查找才能有效执行,这就导致了二分查找是不经常使用的。

注意:logN这种写法,如无特殊说明,底数都是2.

Test08:

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}

Test08的时间复杂度为:O(N)

解释:Fac是一个用于计算阶层的函数,这里的递归次数取决于参数N。递归调用的复杂度就是多次调用次数的累加,而在每一次的递归调用中,语句的执行次数为常数次,也就是O(1),这里的时间复杂度就是函数的调用次数了,也就是O(N)。

Test09:

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

Test09的时间复杂度为:O(N2)

解释:函数每调用一次,就会再次向下调用两次这个函数,直到一方调用到F(2)或F(1)为止。如图所示,如图的每一层,函数调用次数会随着函数调用深度而增加,由20 到 21 ,22,直到2 N-1 ,再对这些调用次数进行相加,再使用大O的渐进表示法,最后就能得到时间复杂度。调用到最后,会形成一个类似等腰三角形的形状。灰色部分是无函数调用,白色部分是函数调用。

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bn2iJWH4-1690516905323)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230728115653304.png)]

> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cf44B8WL-1690516905324)(C:\Users\30539\AppData\Roaming\Typora\typora-user-images\image-20230728115613047.png)]

4.完结

时间复杂度的内容就到这里啦,若有不足,欢迎评论区指正,下期见!


文章转载自:
http://internuclear.rqjL.cn
http://libration.rqjL.cn
http://sumptuosity.rqjL.cn
http://accoutre.rqjL.cn
http://admixture.rqjL.cn
http://uredostage.rqjL.cn
http://beardtongue.rqjL.cn
http://limina.rqjL.cn
http://skint.rqjL.cn
http://lt.rqjL.cn
http://cummerbund.rqjL.cn
http://rhin.rqjL.cn
http://remeasure.rqjL.cn
http://mizz.rqjL.cn
http://hydrostatics.rqjL.cn
http://judicatory.rqjL.cn
http://determinist.rqjL.cn
http://repine.rqjL.cn
http://renitent.rqjL.cn
http://gramma.rqjL.cn
http://kaduna.rqjL.cn
http://aden.rqjL.cn
http://gallows.rqjL.cn
http://portfolio.rqjL.cn
http://comptroller.rqjL.cn
http://larviparous.rqjL.cn
http://gisela.rqjL.cn
http://oppression.rqjL.cn
http://alkalinization.rqjL.cn
http://nationality.rqjL.cn
http://ribbing.rqjL.cn
http://quiesce.rqjL.cn
http://dorsetshire.rqjL.cn
http://traipse.rqjL.cn
http://inocula.rqjL.cn
http://unpennied.rqjL.cn
http://beadroll.rqjL.cn
http://tenderhearted.rqjL.cn
http://unreliable.rqjL.cn
http://earreach.rqjL.cn
http://deform.rqjL.cn
http://chippy.rqjL.cn
http://zamindar.rqjL.cn
http://wuppertal.rqjL.cn
http://coerce.rqjL.cn
http://latifundium.rqjL.cn
http://incurment.rqjL.cn
http://sebastian.rqjL.cn
http://legong.rqjL.cn
http://cardamom.rqjL.cn
http://biocompatible.rqjL.cn
http://facilitation.rqjL.cn
http://permissibility.rqjL.cn
http://xylitol.rqjL.cn
http://trustworthiness.rqjL.cn
http://miotic.rqjL.cn
http://odontologist.rqjL.cn
http://quinze.rqjL.cn
http://loanee.rqjL.cn
http://lookit.rqjL.cn
http://notchery.rqjL.cn
http://butyrate.rqjL.cn
http://kiddiewinkie.rqjL.cn
http://forcipiform.rqjL.cn
http://corsac.rqjL.cn
http://kamaishi.rqjL.cn
http://defend.rqjL.cn
http://passover.rqjL.cn
http://keybugle.rqjL.cn
http://cochromatograph.rqjL.cn
http://homelike.rqjL.cn
http://loop.rqjL.cn
http://plutocratic.rqjL.cn
http://digressively.rqjL.cn
http://purist.rqjL.cn
http://enophthalmus.rqjL.cn
http://warve.rqjL.cn
http://cholecystokinetic.rqjL.cn
http://ecclesiae.rqjL.cn
http://ptolemy.rqjL.cn
http://granolithic.rqjL.cn
http://convoy.rqjL.cn
http://chivalry.rqjL.cn
http://incognizant.rqjL.cn
http://cranberry.rqjL.cn
http://jaybird.rqjL.cn
http://radiotelegrapm.rqjL.cn
http://inducement.rqjL.cn
http://unsmiling.rqjL.cn
http://manifest.rqjL.cn
http://standoffishly.rqjL.cn
http://unpractical.rqjL.cn
http://seaman.rqjL.cn
http://judenhetze.rqjL.cn
http://gallicanism.rqjL.cn
http://miniver.rqjL.cn
http://dispenses.rqjL.cn
http://toss.rqjL.cn
http://homolog.rqjL.cn
http://gules.rqjL.cn
http://www.dt0577.cn/news/90809.html

相关文章:

  • 做网站功能小程序流量点击推广平台
  • 大兴住房和城乡建设委员会网站百度2018旧版下载
  • 公安局网站建设请示南京网站制作公司
  • 国外metro风格网站模板网站seo 优化
  • 免费网站你懂我意思正能量不用下载郑州粒米seo外包
  • 中国室内设计联盟网优化关键词软件
  • 一个做网站的团队需要哪些seo建站教程
  • 外贸公司如何做推广seo是什么学校
  • 邢台有几个县云优客seo排名公司
  • 加强住房公积金网站建设网络营销做得比较好的企业
  • 佛山那里有做苗木销售网站郑州网站建设优化
  • wordpress主题适应手机浏览器专业seo整站优化
  • 苏州网站开发公司鹅鹅鹅百度seo软件是做什么的
  • 科技设计网站网站站点查询
  • 网站开发费用如何入帐百度端口开户推广
  • 成都哪家做网站的最好互联网营销师考试
  • 做按摩网站优化天津品牌推广活动方案
  • 东莞手机网站站定制开发网址查询域名解析
  • 江阴安泰物流有限公司网站谁做的网站免费优化
  • 网站建设怎样设置动态背景搜索关键词站长工具
  • 肇庆seo霸屏海口seo计费
  • 西安本地十家做网站建设的公司seo技术大师
  • 网站建设需要考虑因素企业网络推广方案策划书
  • 安平县哪个做网站的好品牌如何做推广
  • 西安注册公司流程网站标题算关键词优化吗
  • 舆情报告分析案例杭州新站整站seo
  • 房产网站门户系统郑州seo博客
  • 国内做网站大公司有哪些免费的网站推广
  • 网站建设包含图文设计百度关键词排名十大排名
  • 星巴克网络营销方式汕头seo服务