python开发之算法&数据结构(一)
一、算法基础
1. 时间复杂度
在计算机科学中,时间复杂性,又称时间复杂度(Time Complexity ),算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
- Python的效率大概1秒能计算107个基本运算。
例1. 时间复杂度为:O(1)
print("hello world")
例2. 时间复杂度为:O(n)
for i in range(n):
print("hello world")
例3. 时间复杂度为:O(n²)
for i in range(n):
for j in range(n):
print("hello world")
例4. 时间复杂度为:O(n³)
for i in range(n):
for j in range(n):
for k in range(n):
print("hello world")
例5. 时间复杂度为:O(n²)
for i in range(n):
for j in range(i):
print("hello world")
例5分析:当i=0时,第二层循环执行0次;当i=1时,第二层循环执行1次;当i=2时,第二层循环执行2次;以此类推…当i=n-1时,第二层循环执行n-1次;整个程序执行了0+1+2+3+…+(n-1)次,利用等差数列求和公式,求得整个程序执行了 n²/2-n/2 次。但是时间复杂度考虑的是规模趋于无穷大的情况,不包括低阶项和首项系数,故例5的时间复杂度为:O(n²) 。
例6. 时间复杂度为:O(logn)
while n > 1:
print(n)
n = n // 2
例6分析:假设n=64,发现打印的n分别是64,32,16,8,4,2,一共打印了6次,由2^6=64 => 6 = log264,所以时间复杂度为:O(log2n);又因为计算机处理的是二进制数据,多数情况都是以2为底的情况,所以时间复杂度可以写为:O(logn) 。
常见时间复杂度效率排序:
O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(n²logn) < O(n³)
一眼法判断时间复杂度:
- 先看是否有循环减半的过程,如果有—> O(logn);
- 几层循环就是n的几次方的复杂度(循环要是关于n的)。
2. 空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间(内存)大小的量度。
空间换时间:
- 在实际公司应用中,更注重的是时间复杂度尽可能的小,毕竟空间可以通过加内存条解决,所以会有“空间换时间”的思想。
3. 递归
递归的两个特点:
- 调用自身
- 结束条件
对比以下两个递归函数:
def func1(x):
if x > 0:
print(x)
func1(x-1)
def func2(x):
if x > 0:
func2(x-1)
print(x)
分析:假设x = 4,func1打印输出:4,3,2,1;而func2打印输出:1,2,3,4。原因是func1是先打印再调用递归,func2是先调用递归再打印,当x = 4时执行到 func2(x-1),就会跳回代码开头执行 func2(x),第一层递归此时x = 3,执行到 func2(x-1)时,又跳回代码开头执行 func2(x),第二层递归此时x = 2ÿ