python数据结构---1.开始之前

写在前面:

由于最近在复习数据结构,本人呢对于python也比较熟悉了解,加上python近年来比较火所以想写一系列关于python数据结构的内容

和严蔚敏老师书的结构类似,我也会从以下几种数据结构来写

  1. 线性表
  2. 字符串
  3. 栈和队列
  4. 树和二叉树
  5. 字典和集合
  6. 排序

从整体上来讲,python写数据结构和算法肯定是比C/C++简单许多的,所以学习成本不会那么大,希望每个人都能先学习一下python的基础知识,然后再来看这个系列的内容。

正文

今天是这个系列的第一篇博客,所以我不会直接讲数据结构或者算法,而是讲讲一些必须要了解的东西,然后举点小例子让大家感受一下。
我们使用计算机编程的最终目的只有一个,用计算机去解决实际问题。而且我们写的程序不应该仅仅只能解决一个问题,而是需要解决一系列的问题,因此我们在写代码之前不要着急去动手,而是应该这样做:

  • 审题(或者说弄清楚需求)
  • 深入分析需求,得到最简单而又最合适的问题描述
  • 思考如何把问题用计算机实现,这就需要数据和设计算法

以上其实是需求分析和代码设计,我也就不提那么多软件工程相关的了,毕竟还是想着让大家学习成本尽可能降低,说这个只是想让大家多思考,别急着盲目写代码。

有了设计好的算法之后,我们用编程写出相应的代码就解决了问题,至于后面的测试和优化这里暂时也就不讨论了。所以我们可以看到编程其实最难的地方在于思考如何设计出让计算机能解决问题的计算方法。

来举个例子吧:
假如我现在想求一个正数的平方根,有什么办法吗?

分析一下这个问题,我们首先想到的就是求平方根,也就是对x,算出一个y,使得y*y=x

这个想法很好,然后继续,那我们如何得到y呢

  • 我们可以尝试0-x中的所有数,然后当这个数的平方等于x时即为所求,但是实现起来不现实吧。
  • 我们可以退而求x平方根的近似解,即我们求得y,使得|y*y-x |小于一个很小很小的数,这个时候我们也可以说y是x的平方根。

那有了第二种思路,我们就可以设计算法来实现了:

  1. 给出一个正数x,以及允许误差e,令y为任意正数。
  2. 如果|y*y-x|<e,就把此时的y作为结果返回
  3. 如果y与根号x的差异较大,那就更新y,y=(y+x/y)/2
  4. 用新的y重新计算误差

然后把算法用代码实现

def mysqrt(x):
    E=1e-8
    y=1.0
    while abs(y**2-x)>E:
        y=(y+x/y)/2
    return y

print(mysqrt(2))

在这里插入图片描述
尽管我们实现了代码,但是我还是要强调另外一件事,那就是不要重复造轮子,注意效率。我一开始就说了python简单,为什么?因为python已经把常用的数据类型都给我们内置好了,基本的运算操作也已经都写好了或者有相关的库可以调用,所以不用我们那么麻烦的再去像C一样自己去写代码去构造集合,字典这样的结构,同时也就需要我们会用这些已经有的东西。
基本的数据类型:

  • 数字
  • 字符串
  • 列表
  • 元组
  • 集合
  • 字典

所以需要大家先去了解这些数据类型的使用方法,比如:list的切片,append操作,set与dict的使用。当然对于计算来说,math库中的函数或者numpy中的函数都要有所了解。

上面例子中的函数,其实我们用内置的函数就一句话

import math
print(math.sqrt(2))

#或者使用numpy
import numpy as np
print(np.sqrt(2))

在这里插入图片描述
效率更高,代码量也更少。所以我们要学会利用现有的东西去解决新的问题,重点是我们要有写代码之前的思考过程!!!

最后

这篇博客的最后,我想提一下常见的算法设计模式:

  • 枚举法:也是暴力算法,就是枚举出各种可能,选择出需要的解。
  • 贪心法:在对问题求解时,总是做出在当前看来是最好的选择。
  • 分治法:分而治之的思想,把复杂的问题分解为相对简单的问题。
  • 回溯法:试探求解,发现无法继续时返回之前的状态。
  • 动态规划:有点类似于分治法,它也是把复杂问题分解为一系列简单问题,但是它会利用各个子问题之间的关系,一步步求解,也就避免了大量重复计算。
  • 分支限界:主要用于搜索,当搜索结果超过了边界就直接删除,缩小求解空间。

还有算法性能的评价,时间复杂度,空间复杂度等等,很多内容我就不全部赘述一遍了,有很多优质博客大家有兴趣可以自己去查看。

大家可以想想下面这段代码有哪些信息。

a=[1,2,3,4]
print(id(a[0]),id(a))
print(id(a[1])-id(a[0]))
b=[]

import sys
print(sys.getsizeof(a),sys.getsizeof(a[1]),sys.getsizeof(b),sys.getsizeof([1]))

在这里插入图片描述
额,提一点题外话。为什么不更新flask相关的内容,第一是因为最近在复习没什么太多时间,第二就是感觉没多少人想看,所以就没什么动力更新。等明年稍微闲下来了我会慢慢去把flask,django还有关于go gin相关的博客全部补上的。java web相关的内容我还得去学一段时间,感觉计算机这个专业吧知识面太广,每个知识深度又很深,只能坚持努力一点点地去学了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章