【Python数据结构和算法】(一)绪论:基本概念、算法分析、Python结构的性能

1 基本概念

数据结构
相互之间存在一种或多种特定关系的数据元素的集合。通常有四类基本结构:集合、线性结构、树形结构、图状或网状结构。

算法
对特性问题求解步骤的一种描述,是指令的有限序列。一个算法有下列五个重要特性:
有穷性:执行步数有穷,执行时间有穷
确定性:只有一条执行路径,对于相同的输入只能得出相同的输出
可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
输入:一个算法有零个或多个输入
输出:一个算法有一个或多个输出

程序和算法的区别在于,程序 [ 实现 ] 算法,算法不依赖于运行环境、编程语言等,而用C语言编出来的程序肯定和Python不同。

数据类型
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。如,C语言中的整型变量,其值集为某个区间上的整数,定义在其上的操作为加减乘除等运算。

抽象数据类型
abstract data type,简称ADT,是一个数学模型以及定义在该模型上的一组操作。抽象数据类型和数据类型实际上是一个概念,但抽象数据类型范畴更广,如后面将介绍的栈、队列等都属于抽象数据类型。

2 算法分析

2.1 算法设计的要求

  • 正确性:不含语法错误,能够产生满足要求的结果
  • 可读性:容易理解、调试和修改
  • 健壮性:输入非法也能够适当处理,而不会产生莫名其妙的输出结果
  • 效率和低存储量需求

2.2 算法效率的度量——大O记法

效率一般指算法运行的时间,但是同样一个算法,在不同的机器上用不同的语言编写可能所用的时间也不一样,因此要想出一种方法衡量算法效率,而与其他因素无关。通常的做法是:从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复的次数作为算法的时间量度。

可以认为,一个算法运行工作量的大小,只依赖于问题的规模 n n n ,一般算法中基本操作的重复次数是问题规模 n n n 的某个函数 f ( n ) f(n) f(n)。算法的时间量度记作: T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n))它表示随着问题规模 n n n 的增大,算法时间的增长率与 f ( n ) f(n) f(n) 的增长率相同,称为 时间复杂度

整理一下: n n n 是问题规模, f ( n ) f(n) f(n) 是基本操作的重复次数,是 n n n 的函数, O ( f ( n ) ) O(f(n)) O(f(n)) f ( n ) f(n) f(n) 进行处理,一般是“看最高阶,舍常数”,二者具有相同的增长率,最后把 O ( f ( n ) ) O(f(n)) O(f(n)) 记作 T ( n ) T(n) T(n)

下面举1个例题,来看时间复杂度如何计算:

a = 5
b = 6
c = 10
for i in range(n):
	for j in range(n):
		x = i * j
		y = j * j
		z = i * j
for k in range(n):
	w = a * k + 45
	x = b * b
d = 33

此处可将赋值语句看作是基本操作:

  • 首先对abc赋值,最后对d赋值,赋值语句共执行4次
  • 在 i 与 j 的嵌套循环中,3个赋值语句循环 n 2 n^2 n2 次,所以是 3 n 2 3n^2 3n2
  • 在 k 的循环中,2个赋值语句循环 n n n 次,为 2 n 2n 2n
    f ( n ) = 3 n 2 + 2 n + 4 f(n)=3n^2+2n+4 f(n)=3n2+2n+4 T ( n ) = O ( f ( n ) ) = O ( n 2 ) T(n)=O(f(n))=O(n^2) T(n)=O(f(n))=O(n2)

决定算法复杂度的是执行次数最多的语句,一般也是最内循环的语句。

3 Python结构的性能

3.1 列表

操作 性能
索引、索引赋值 O(1)
追加 append O(1)
pop() O(1)
pop(i) O(n)
insert(i,item) O(n)
删除 O(n)
遍历 O(n)
包含 O(n)
切片 O(k)
排序 O(nlogn)

3.2 字典

操作 性能
复制 O(n)
取值、赋值 O(1)
删除 O(1)
包含 O(1)
遍历 O(n)

猜你喜欢

转载自blog.csdn.net/codelady_g/article/details/123373963