马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
各人好 自学完sklearn的根本使用后,颇感无趣。虽有阅文几篇,却无所获。遂于24年9月26日决习hello algorithm。 :)
好了,不开顽笑了。实在开设这篇专栏我也不知道有没有什么意义。实在是由于迩来在读TaskWeaver,但是源码又看不懂(固然看完了我会第一时间给各人总结的),感到头疼,以是决定摸摸鱼,继承写写自己的小博客~~~
这个专栏紧张是对网站教程的总结与代码实现,本领有限,欢迎各人一同互换讨论!
教程网站:序 - Hello 算法
作甚算法
算法便是有限时间内办理标题的思绪,旨在到达时间与空间上的最优,这意味着我们写代码并不范围于一种语言。但是我用python。
而数据结构则是构造和存储数据的方式,只管占用少内存,使用只管快速,提供轻便的数据体现。
复杂度分析
简朴来说,在实行的代码中,我们不光要到达运行时间的最短,也要只管到达最少的空间服从。现实过程思量到硬件、数据巨细、测试时间等影响,很少睁开完备的测试实行,而是通过复杂度分析来举行判定。
迭代
迭代即循环,我们通过简朴的案例熟悉一下根本的for, while循环。
- def for_loop(n: int) -> int:
- """
-
- 时间复杂度 o(n)
- 空间复杂度 o(1)
-
- :param n:
- :return:
- """
- res = 0
- for i in range(1, n+1):
- res += i
- return res
- for_loop(3)
复制代码- def while_loop(n: int) -> int:
- res = 0
- i = 1
- while i <= n:
- res += i
- i += 1
- return res
- while_loop(3)
复制代码 这个代码也很简朴,就是实现通过简朴的循环实现一个累加。时间复杂度和空间复杂度也都是雷同的。由于循环次数是与参数n相干,以是时间复杂度就是 o(n), 与其同时由于空间上只有n一个变量,那么我们的空间复杂度就是 o(1)。很简朴吧!
递归
递归紧张是通过调用函数自身来办理标题。递归函数就是先一次又一次的深入到最深层,然后再从最深层一层一层的叠加效果。
- def recur(n: int) -> int:
- if n == 1:
- return 1
- res = recur(n - 1)
- return n + res
- recur(3)
复制代码 固然这个函数的时空复杂度怎么算呢?也还可以,调用了3次函数,每次都有一个新的n,以是时空复杂的都是o(n)。
固然递归也有差别,具体体现为如下:
- 平常递归:当函数返回到上一层级的函数后,须要继承实行代码,因此体系须要生存上一层调用的上下文。
- 尾递归:递归调用是函数返回前的末了一个使用,这意味着函数返回到上一层级后,无须继承实行其他使用,因此体系无须生存上一层函数的上下文。
- def tail_recur(n, res):
- """尾递归"""
- # 终止条件
- if n == 0:
- return res
- # 尾递归调用
- return tail_recur(n - 1, res + n)
复制代码 固然看似某些标题非常困难,但是使用递归会非常浅显举行实现。好比:
- def fib(n: int) -> int:
- """
-
- 时间复杂度 o(2n)
- 空间复杂度 o(n)
-
- :param n:
- :return:
- """
- # f(n) = f(n-1) + f(n-2)
- if n == 1:
- return 0
- if n == 2:
- return 1
-
- return fib(n - 1) + fib(n - 2)
- fib(5)
复制代码 给各人留个小思索,盘算下时空复杂度 :), 固然我写在上面了,可以思索一下为什么。
困了,本日就学到这,晚安~
|