数据结构中时间复杂度和空间复杂度的理解
2016-07-11 21:03
483 查看
刚开始学习数据结构,由于感觉计算时间和空间复杂度好多复杂的公司,看的头都大了,所以就没有仔细理解大概浏览了一遍,谁知后面感觉好多题目都是问时间和空间复杂度的,所以就感觉很迷茫,要重新开始学习这个啦,考试题目一般涉及时间复杂度的比较多,空间复杂度的比较少,所以着重学习时间复杂度,当然时间是没有一个准备的度量标准,因为每个机子都不一样,这里就从普遍意义上面的计算开始:
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))
为算法的渐进时间复杂度,简称时间复杂度。即是要有一个f(n)满足频率/f(n)在n很大时是一个不为0的常数。最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n), k次(k>=2)方阶O(nk),指数阶O(2n)。
简化式: 1<log2n<n<nlog2n<nk<2n
最主要的问题是怎么求取时间复杂度呢?
(1)如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。(2)当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。(3)算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))
为算法的渐进时间复杂度,简称时间复杂度。即是要有一个f(n)满足频率/f(n)在n很大时是一个不为0的常数。最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n), k次(k>=2)方阶O(nk),指数阶O(2n)。
简化式: 1<log2n<n<nlog2n<nk<2n
最主要的问题是怎么求取时间复杂度呢?
(1)如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。(2)当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。(3)算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关
相关文章推荐
- Swift 3.0在集合类数据结构上的一些新变化总结
- 浅谈算法和数据结构(4):快速排序
- 浅谈算法和数据结构(3):合并排序
- 浅谈算法和数据结构(2):基本排序算法
- Android Binder机制(二) Binder中的数据结构
- 复习(数据结构):动态数组:c++_stl写法
- 数据结构关于AOV与AOE网的区别
- 二、数据结构与算法--数组
- 数据结构 二叉树的互相遍历求法
- RMQ问题——sparse-table算法
- 数据结构学习笔记(一)基础概念
- 二叉树应用-表达式·表达式树·表达式求值(数据结构基础 第6周)
- hdu 5195(拓扑排序+线段树优化)
- 微软公司等数据结构+算法面试100题
- 算法导论 第三部分——基本数据结构——第14章:数据结构的扩张
- java 中几种常用数据结构
- 堆和栈的区别(转过无数次的文章)
- 数据结构C++使用最小堆实现huffman树
- 数据结构C++实现基本的堆
- encode_json 会对给定的Perl的数据结构转换为一个UTF-8 encoded, binary string.