数据与算法基础(1)
大家好,今天我们来了解一下算法基础,数据算法作为一个很重要的一项锻炼思维的技能在编程中.
算法概念:一个计算过程,解决问题的方法.
我们经常听到: 程序 = 数据结构 + 算法
我们在写代码时,用到的函数语句都是动态的,我们在修改一个函数的过程中,我们可以算作这是一个算法,
变量是静态的,不能灵活的改动内部.
我们在解决复杂的问题时:
通常会使用几种算法去解决,我们说一个数据使静态的,算法有输入也有输出,就好比一个函数有参数和一个返回值.
时间复杂度
就是python运行的时间的快慢,着重阐述的是一个单位
概念:算法运行的快慢
我们在日常生活中:
眨眼的时间:几毫秒
睡觉的时间:几个小时
完成一个项目的时间:几天或者几个月.
我们在阐述这些时间的时候都是用以上的单位去阐述时间长短的这个概念,没有人说睡觉的时间是1000000秒,对吧,所以说这里的时间复杂度就是一个估算的单位
print("hello,world")
我们称上面的时间复杂度为:O(1)
for i in range(n)
print("hello,world")
我们称上面的时间复杂度O(n)
for i in range(n)
for j in range(n)
print("hello,world")
我们称上面的时间复杂度O(
n
2
n^2
n2)
我们称以上的一类用O(n)来表示
while n>1
print(1)
n // 2
n = 64
结果: 64
32
16
8
4
2
我们会发现一共运行了6次,我们称这中循环折半的复杂度的式子
2
6
2^6
26 = 64
l
o
g
2
64
log_2^{64}
log264 = 6
时间复杂度:O(log6)
每当你的算法中出现循环减半的过程,每当循环迭代出现减半的时候,复杂度式子就会出现O(logn),其实式子中有一个下标2,但是因为计算机中大多都是2进制,所以我们省事就省略了.,这里的n可以是任何数.
注意事项:
1, 时间复杂度:用来估计算法运行的一个式子(单位)
2, 一般来说,时间复杂度高的算法比复杂度低的算法慢
3, 常见的时间复杂度(按效率比较):
O(1)<O(logn)<O(n)<O(nlogn)<O(
n
2
n^2
n2 )<O(
n
2
n^2
n2logn)<O(
n
3
n^3
n3)
4,复杂问题的时间复杂度:
O(n!)<O(
2
n
2^n
2n)<O(
n
n
n^n
nn)
空间复杂度
下面我们来阐述一下空间复杂度
空间复杂度概念:与是时间复杂度表示方法一模一样.,表明一个算法占用的内存大小.
1,算法使用了几个变量–>O(1)
2,算法使用长度为n的一维列表–>O(n)
3,算法使用的m行n列的二维列表O(mn)
注意事项:
1,时间复杂度相比于时间复杂度相比更重要,因为现在的内存很便宜,大一点内存没关系,我们在乎的速度的快慢.
2,我们可以改进算法使算法占用更大,但是是速度更快
3,空间换时间
递归函数
递归函数是一个重要的函数思想,在解决很多算法题都显得十分重要.
递归函数中,包含两种必备条件:
基线条件:函数不再调用自己,以防止形成无限循环.
递归条件:函数调用自身
在Python编程中,递归是一种函数调用自身的技术,它可以在简单的问题上实现复杂的解决方案。递归函数是一个函数,该函数通过调用自身来解决问题。在递归函数中,问题的解决方案分解成了更小的子问题,这些子问题也被分解成更小的子问题,直到问题的规模变得足够小,可以直接求解。
分而治之的策略
递归算法的核心思想是将问题分解成若干个同样的子问题,直到子问题无法再分解,求出子问题的解后再逐步合成原问题的解。递归算法的基本构成是递归关系和终止条件。递归关系描述了原问题与子问题之间的关系,终止条件是指当问题规模足够小时,可以直接求解。
递归算法的优点是简单,直观,易于理解和实现。但是,由于递归算法需要不断地调用自身,每次调用都需要消耗额外的栈空间,因此它的时间和空间复杂度相对较高。在处理复杂问题时,可能会导致栈溢出或运行时间过长等问题。为了避免这些问题,需要在实现递归算法时注意控制递归深度和优化算法。
递归算法是一种在函数中调用自身的算法。以下是一些经典的递归算法题:
-
阶乘问题:计算给定数 n 的阶乘。公式为 n! = n * (n-1) * (n-2) * … * 1
-
斐波那契数列:计算给定数 n 的斐波那契数列。斐波那契数列的规则是:第一个数为 0,第二个数为 1,从第三个数开始,每个数都是前两个数之和。
-
汉诺塔问题:有三个柱子 A、B、C,其中柱子 A 上有 n 个大小不同的盘子,大盘子在下,小盘子在上。需要将这些盘子从 A 移动到 C,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。
-
遍历二叉树:给定一个二叉树,按照前序遍历、中序遍历和后序遍历的顺序遍历该树。
-
排序问题:使用递归算法实现快速排序和归并排序。
这些问题都是经典的递归算法题,掌握这些问题能够帮助我们更好地理解递归算法的思想.
下一章我们将讲解汉诺塔问题的递归函数.