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

统计局门户网站建设目标北京网站制作公司

统计局门户网站建设目标,北京网站制作公司,上海有限公司黄页,影视视频网站怎么做目录 1. 数据结构,算法的概念 2. 算法的效率 2.1 算法复杂度 3. 时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 小试牛刀 4. 算法的空间复杂度 4.1 小试牛刀 1. 数据结构,算法的概念 数据结构(Data Structure)是计算机存储、组织数据…

目录

1. 数据结构,算法的概念

2. 算法的效率

2.1 算法复杂度

3. 时间复杂度

3.1 时间复杂度的概念

3.2 大O的渐进表示法

3.3 小试牛刀

 4. 算法的空间复杂度

4.1 小试牛刀


 

1. 数据结构,算法的概念

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2. 算法的效率

如何衡量一个算法的好坏呢?

假设对于斐波那契数列的第 n 项的求解有如下代码:

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

 这样的递归代码看起来十分简洁,那么是不是代码越简洁算法的效率越高呢?显然这是不正确的。那该怎么衡量一个算法的好坏呢?

2.1 算法复杂度

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

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

3. 时间复杂度

3.1 时间复杂度的概念

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

例如:对于如下代码,请计算Func1 中 ++count 执行了多少次?

// 请计算一下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);
}

通过计算得到结果:N×N + 2×N + 10。

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

3.2 大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:O(N*N)。

通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。


另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界)


例如:在一个长度为N数组中搜索一个数据x
最好情况:1次找到
最坏情况:N次找到
平均情况:N/2次找到
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)。

3.3 小试牛刀

(1):计算二分查找的时间复杂度。

// 计算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;
}

 解:二分查找每次更新mid的位置都将查找的区间折半,因为时间复杂度是计算算法的最坏情况。易得二分查找的最坏情况就是:当区间长度为1时,查找到目标元素,或者压根查找不到该元素。分析:最坏情况是将区间的长度由 N 便到1,并且每次更新区间都是原区间的一半。可以得出公式:

注意:只有当底数为 2 时才可以简化为 log(N)。 

(2):计算斐波那契递归Fib的时间复杂度。

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

这道题算是时间复杂度计算的算法中比较困难的,建议画图计算。

 4. 算法的空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。


注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

4.1 小试牛刀

(1):计算阶乘递归Fac的空间复杂度。

long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

显然每次调用Fac函数只用了常数个空间,即空间复杂度为O(1),但是,因为递归会消耗栈上的空间,且易得该函数调用了 N + 1次,根据大O的渐进表示法:最终该算法的空间复杂度为O(N)。

(2):计算斐波那契递归Fib的空间复杂度。

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

显然Fac()函数的每次调用消耗的额外空间为常数个,即每次调用该函数的空间复杂度为O(1),上面我们又求出了该算法的时间复杂度为O(2^N),那么是不是该算法的空间复杂度就是O(2^N),显然不会这么简单!!!

 

 

 递归算法的空间复杂度取决于:每次函数调用的空间复杂度和最大递归深度

http://www.15wanjia.com/news/24042.html

相关文章:

  • 本地wordpress模板编辑器上海排名优化seo
  • 免费建设网站好吗淘宝推广软件哪个好
  • 创客贴网站做海报技能中国制造网外贸平台
  • 苏州网站开发建设公司恶意点击竞价时用的什么软件
  • 公司网站一定要备案吗千峰培训出来好就业吗
  • 网站直播间 是怎么做的哪里有网站推广优化
  • 惠州做网络推广的广西关键词优化公司
  • 海南棋牌网站建设网推怎么推广
  • 高端网站定制的方法近三天的国内外大事
  • 武汉网站建设开发山东网络推广优化排名
  • 怎么查看网站是哪家公司做的公司网站设计公司
  • 给做网站建设的一些建议百度app营销软件
  • 属于自己的网站哈尔滨网站制作软件
  • 医疗网站建设多少钱专业做网站公司
  • 网站建设新报价图片杭州网络推广
  • 郑州高端做网站网络整合营销4i原则
  • jsp做的网页是网站吗网址导航推广
  • 做a动漫视频在线观看网站南宁seo网络推广
  • 做网站需要什么许可证网站大全软件下载
  • 一个企业网站如何能放到互联网上 vpsseo研究中心教程
  • 淄博建站哪家好做一个公司网站要多少钱
  • 网站关键词突然没有排名了内容营销成功案例
  • 共享农业网站建设sem是什么岗位
  • 说明多媒体教学网站开发的一般步骤单页站好做seo吗
  • 网站log日志手机怎么制作网页
  • 学校网站建设培训心得体会重庆小潘seo
  • 在线兼容测试网站搜索指数的数据来源是什么
  • 深圳做分销网站公司营销策划书模板
  • 免费建设门户网站百度自动优化
  • 邯郸哪儿能做网站鱼头seo软件