1.算法与复杂度

算法和复杂度的理解

一. 概念

算法: 通过代码计算提高程序的效率, 一个计算的过程, 解决问题的方法
数据结构:

  • 数据结构是计算机存储、组织数据的方式。
  • 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
  • 数据结构往往同高效的检索算法和索引技术有关。

程序 = 数据结构 + 算法

算法干什么的?

  1. 解决一些数学问题
  2. 提高代码效率
  3. 让你更有魅力
  4. ...还有很多

一个有趣的问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

如何用代码计算计算出这个次数呢?

汉诺塔问题: 有n个盘子时分三步
1. 把n-1个圆盘从A经过C移动到B
2. 把第n个圆盘从A移动到C
3. 把n-1个小圆盘从B经过A移动到C

通过以上的分析, 代码如下:

def hanoi(n, a, b, c):
    if n > 0:
        hanoi(n - 1, a, c, b)
        print(f"{n}-moving from {a} to {c}")
        hanoi(n - 1, b, a, c)

# 代用函数
hanoi(3, "A", "B", "C")

当次数n为3时, 结果如下:

1-moving from A to C
2-moving from A to B
1-moving from C to B
3-moving from A to C
1-moving from B to A
2-moving from B to C
1-moving from A to C

如果我们将n改为64, 结果是一个逆天的(我也不知道), 据说直到时间的尽头, 当然我们可以通过程序计算出需要的次数

代码给你, 这里按每次搬动一个盘子用时1秒:

def f(n):
    if n==0:
        return 0
    else:
        return 2*f(n-1)+1
x=int(input("请输入片的个数:"))
print("需要移动",f(x),"次")

当我们输入n=64, 大梵天传入的值, 计算出结果是: 18446744073709551615
那这个数字有多大呢, 即是单位是秒

算出,移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。5845.42亿年后的事,我是见不到了!

二. 时间复杂度

  1. 时间复杂度是用来估算算法运行时间的一个式子(单位)
  2. 时间复杂度高的算法效率低
  3. 时间复杂度效率排序: O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n2logn) < O(n**3)

三. 空间复杂度

  1. 用来评估算法内存占用大小的式子
  2. 空间复杂度的表示方法与时间复杂度完全一样
    • 算法使用的变量: O(1)
    • 算法使用了长度为n的一维列表: O(n)
    • 算法使用了m行n列的二维列表: O(mn)

贴心提示: 算法是比较烧头发的, 建议用Python写代码(人生发少, 我用Python)

posted @ 2022-07-17 19:34  ZeroCapSecond  阅读(119)  评论(0)    收藏  举报