1. 算法:计算机程序的本质上一个算法来告诉计算机确切的步骤来执行一个指定的任务。
算法的五大特性:
1. 输入:算法具有0个或多个输入;
2. 输出:算法至少有1个或多个输出;
3. 有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成;
4. 确定性:算法中的每一步都有确定的含义,不会出现二义性;
5. 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成;数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型,如 int, float, char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指数据对象中数据元素之间的关系。
2.数据结构
a. 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型,如 int, float, char等。数据元素之间不是独立的,存在特定的关系,这些关系便是结构。数据结构指数据对象中数据元素之间的关系。
b. Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做python的内置数据结构,比如列表、元组、字典。而有些数据组织方式,python系统里面没有直接定义,需要我们自己去定义实现这些数据的组织方式,这些数据的组织方式称之为python的数据结构,比如栈、队列等。
c. 算法与数据结构的区别:
数据结构只是静态的描述了数据元素之间的关系;
高效的程序需要在数据结构的基础上设计和选择算法。
程序=数据结构+算法
(算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体)
d. 抽象数据类型(abstract data type,ADT)
抽象数据类型的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上的运算的实现与这些数据类型和运算在程序中的引用隔开,使他们相互独立。
最常用的数据运算有五种:
插入、删除、修改、查找、排序;
3.算法效率的衡量:
a. 执行时间反应算法效率;(但单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的)
每台机器执行的总时间不同,但是执行基本运算数量大体相同;
b. 描述算法效率:时间复杂度T(n);
分析算法时,存在几种可能的考虑:
算法完成工作最少需要多少基本操作:即最优时间复杂度;
算法完成工作最多需要多少基本操作:即最坏时间复杂度;
算法完成工作平均需要多少基本操作:即平均时间复杂度;
因此,我们主要关注算法的最坏情况,即最坏时间复杂度;最坏时间复杂度,提供了一种保证,表明算法在此种程度的基本操作中一定能完成工作。
c. 时间复杂度的几条计算规则:
- 基本操作,即只有常数项,认为其时间复杂度为O(1);
- 顺序结构,时间复杂度按加法计算;
- 循环结构,时间复杂度按乘法计算;
- 分支结构,时间复杂度取分支的最大值;
- 判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略;
- 在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度;
常见的时间复杂度所消耗的时间从小到大:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
注意:ls.append() 中.append()函数,封装了一些步骤;需要分析函数体里的代码,才能代表这一句话时间的复杂度为多少;
d. List 内置操作的时间复杂度
操作 | 大O效率 |
indexx[] | O(1) |
Index assignment | O(1) |
Append() | O(1) |
Pop() | O(1) |
Pop(i) | O(n) |
Insert(i,item) | O(n) |
iteration | O(n) |
Del operator | O(n) |
Contains(in) | O(n) |
Get slice[x:y] | O(k) |
Del slice | O(n) |
Set slice | O(n+k) |
Reverse | O(n) |
Concatenate(+号) | O(k) k 代表第2个列表的元素 |
sort | O(nlogn) 与排序算法有关系 |
multiply | O(nk) 列表的乘法 |
Dict 内置操作的时间复杂度:
操作 | 大O效率 |
copy | O(n) |
Get item | O(1) |
Set item | O(1) |
Delete item | O(1) |
Contains(in) | O(1) |
iteration | O(n) |