python数据结构与算法(1)---时间复杂度
一.数据结构基础
1.数据结构概念
就是一组数据在内存中的存储形式,也是对基本数据类型的一次封装
也是数据对象中数据元素之间的关系。
算法与数据结构的区别:
数据结构只是静态的描述了数据元素之间的关系
高效的程序需要在数据结构的基础上设计和选择算法
程序=数据结构+算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题的载体。
2.抽象数据类型(ADT)
就是将数据类型和数据类型上的运算捆在一起,进行封装,相当于类
3.算法效率的衡量
实现算法程序的执行时间可以反映出算法的效率
但是单纯依靠运行的时间来比较算法的优劣不一定是客观准确的
时间复杂度:
反应算法在时间上的效率
我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,算法对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作在规模数量级上是相同的,因此可以忽略机器环境的影响客观的反应算法的时间效率。
“大O记法”表示算法的时间效率:
计算算法的基本操作的执行次数,为g(n),使得算法处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐进时间复杂度,简称时间复杂度,记为T(n)。
理解“大O法”:对于算法的基本操作的执行次数,不用计算的太细致,最重要的是数量级和趋势,这个基本操作数量的规模函数中一些常量因子可以忽略不计。例如: 和 属于同一个数量级,他们的时间复杂度都是级。
最坏时间复杂度(主要关注):
算法完成工作最多需要多少基本操作
平均时间复杂度(比较全面):
算法完成工作平均需要多少基本操作
时间复杂度的几条基本计算规则:
(1)基本操作,只有常数项。认为时间复杂度为O(1)
(2)顺序结构,时间复杂度加法计算
(3)循环结构,时间复杂度乘法计算
(4)分支结构,时间复杂度取最大值
(5)判断一个算法的效率时,往往只需要关注数量的最高次项,其他可以忽略。
(6)没有特殊说明的情况下,分析的都是最坏时间复杂度
list内置操作的时间复杂度:
dict内置操作的时间复杂度:
常见的时间复杂度之间的关系:
所消耗的时间的大小:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)