python数据结构与算法之问题求解
懂得计算机的童鞋应该都知道,一条计算机程序由数据结构跟算法两大部分组成。所以,其实不管你使用哪种计算机语言编写程序,最终这两部分才是一个程序设计的核心。所以,一个不懂得数据结构与算法的程序员不是一个好工程师。因此,对于每个在计算机领域的工作者而言,数据结构与算法都是很重要的一门必修课。
我还是按照自己复习计算机网络课程的模式来解释吧,先挑选一个课本,然后逐一用自己的语言过一遍书中的内容。由于本人一直用的Python进行程序开发与设计,所以就选了一本跟Python有关的书籍,那就是裘宗燕教授写的数据结构与算法--Pyhon语言描述。
就是这本书
如果你看过,或者知道这本书,应该会对它有所了解。这本书对于初学者来说其实并不容易,因为裘宗燕教授描述程序的语言是十分精确与严格的,基本跟计算机程序执行的思路相一致,因此在理解上有些许吃力。但是当你真的静下心学完之后,就会明显感觉到付出这种辛苦是很有必要的。因为在这本书中,不仅有数据结构与算法的知识和步骤,更重要的是书的编写处处都体现了一个编程工作者需要考虑问题的严谨思路,而这个思路才是解决同类问题的关键所在。所以,我认为这是一本很好的书,而且这种对书中知识点的理解也是一个程序员思考的必经之路。
好了,就从计算机程序设计的过程与步骤开始吧。
就像很多从事计算机编程的工作人员一样,我在开始进行编写代码之前总会有一系列的思考过程。这个思考过程是十分重要的,它才是能写出优秀代码的前提。在这一点,我一直认为工程师跟作家是很相似的,只不过作家是用人类的语言来将他所构思的观点通俗而又深刻地通过笔写出来,而工程师是用计算机语言将某一类问题的逻辑准确而又严谨地通过计算机求解出来。
大部分人使用计算机都被固定在几个独有的应用软件里面,这样固然很方便,但是具有局限性。其实,计算机最大的用处是可以通过程序来解决实际生活中遇到的一类问题。就像那些我们所熟悉的应用软件,它们之所以能够被广泛应用,也是因为解决了很多人生活中的实际问题,满足了人们的需求。
然而,在实际生活中的问题往往是各种各样无穷无尽的。所以并不可能都有固定的程序来让计算机执行,这个时候就需要我们程序开发人员根据不同的问题类型来进行归类编写程序。
之所以要对问题进行分类,就是因为开发一个程序,往往能解决一类型的问题。虽然开发的过程只需要一次,但是解决问题的过程可以有很多次。比如,一个简单的计算机程序,当被开发出来之后,不管是对于简单的加法实例1+1,还是对于复杂的乘法实例999*234,都能够被计算出来。
既然用计算机解决问题是要开发出解决问题的程序,那么程序又是怎么开发出来的呢?来看下图。
第一步:我们得知道需要解决的问题是什么样的问题,这个对于问题的描述就很重要。它的描述并不是像我们实际生活中提问的模糊问题,它是必须弄清问题的具体细节,也就是要对问题进行一个严格化描述,使人不产生歧义,并且包含了要解决问题需要做的各个方面。通常我们把这个阶段称之为需求分析阶段。
第二步:将上面对问题的严格化描述,通过程序求解步骤表达出来,这是对问题的一个过程性描述,并不是对问题是什么的描述,两者其实并不一样。在这样的表达之前,必须要有一个解决该问题的抽象计算模型,这个抽象计算模型包括计算过程中所用的数据,跟求解这个问题所用到的算法。所以,这个阶段是程序设计中最重要也是最困难的阶段,我们称之为程序设计阶段。
第三步:当有了合适的数据结构和算法的描述性语言之后,使用合编程语言将它实现出来就比较容易了。一般使用语言中的各种数据机制实现数据结构,用控制语句来实现算法。这里我们用的主要是Python语言,这时候的实现就是程序了。这个阶段称之为编码阶段。
第四步:当程序实现出来之后,需要我们用计算机或者肉眼来检验程序里面是否存在着语法错误,若有错误,进行修改,直到得到一个可执行的程序。这个阶段称之为检查测试阶段。
第五步:有了可执行程序之后,只是说明程序没有语法错误。但是还可能存在逻辑错误,或者设计错误。这个时候就需要对程序的功能进行再三确定,是否满足问题的所有条件。如果发现错误,就要再次回到上面的某一个阶段再进行重新设计或者编码。这个阶段称之为测试/调试阶段。
这就是计算机进行求解过程的5个阶段。下面用一个简单例子来解释说明一下。现在假设要求出任一个非负实数的平方根。
第一步就是将问题严格化,使之不存在歧义。这里假设实数的概念已经清楚,而不清楚的就是平方根。我们可以采用数学上对它的描述概念,就是非负实数x的平方根就是满足等式y*y=x的非负实数y。
但是还有一个问题,通常非负实数的平方根有很多是无穷的无理数,但是计算机程序必须在有穷步内完成,因此这里允许一个误差,使计算机求解的答案十分近似于求解答案。所以,上面的严格描述可以变成这样:求一个非负实数x的平方根,必须找到一个y,使y满足条件|y*y-x|<e,其中e就是作为参数实现给定的。
得到一个严格性对问题的描述之后,就进入第二步,设计抽象计算模型。对于求解平方根的算法,数学课程里面有一种,但是不太适合机械执行。因此这里采用另外一种算法,牛顿迭代法。
至于牛顿迭代法,知乎有个比较好的帖子,大家可以看一下。不过这里要用到它的一个公式Xn+1= Xn -f(Xn)/f'(Xn)。这个是求f(x)函数切线的根的一个公式。具体到平方根就是z = y - (y²-x)/2y = (2y²-y²+x)/2y = (y²+x)2y = (y+x/y)2
所以对于这个平方根的牛顿迭代法的计算过程描述如下:
0.对给定的任意正实数x和误差e,使得变量y取任意正实数,如令y=x
1.如果y*y与x足够接近,即|y*y|-x<e,计算结束并把y作为结果。
2.取z = (y+x/y)/2
3.将z值作为y的新值,回到步骤1。
这样第二个阶段,算法的设计就完成了。然后再用python实现这个算法,就很容易了。下面是python的代码:
def sqat(x):
y = 1.0
while abs(y*y - x) > 1e-6:
y = (y+x/y)/2
return y
其中变量y的初始值为1.0,允许的误差为10的-6次方。可以用Pycharm或者其他IDE来执行检查语法错误,然后再输入不同的参数来检查结果。
python数据结构与算法之问题求解的更多相关文章
- python数据结构与算法之问题求解实例
关于问题求解,书中有一个实际的案例. 上图是一个交叉路口的模型,现在问题是,怎么安排红绿灯才可以保证相应的行驶路线互不交错. 第一步,就是把问题弄清楚. 怎么能让每一条行驶路线不冲突呢? 其实,就是给 ...
- python数据结构与算法
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...
- Python数据结构与算法--List和Dictionaries
Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...
- Python数据结构与算法--算法分析
在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- Python数据结构与算法之图的广度优先与深度优先搜索算法示例
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...
- Python 数据结构和算法
阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...
- Python数据结构与算法(几种排序)
数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是 ...
- Python - 数据结构与算法(Data Structure and Algorithms)
入门 The Algorithms Python https://github.com/TheAlgorithms/Python 从基本原理到代码实现的Python算法入门,简洁地展示问题怎样解决,因 ...
随机推荐
- Github怎么写README
编辑README文件 大标题(一级标题):在文本下面加等于号,那么上方的文字就变成了大标题,等于号的个数无限制,但一定要大于0 大标题 ==== 中标题(二级标题):在文本下面加下划线,那么上方的文本 ...
- Hibernate一级缓存和二级缓存详解
(1)一级缓存 是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个session(一定要同一个session)又做了同一个操作,那么h ...
- P3440 [POI2006]SZK-Schools(费用流)
P3440 [POI2006]SZK-Schools 每所学校$i$开一个点,$link(S,i,1,0)$ 每个编号$j$开一个点,$link(i,T,1,0)$ 蓝后学校向编号连边,$link(i ...
- ensp 单臂路由实验
搭建如下拓扑 交换机: 创建vlan10 20 g0/0/1接口设置访问类型为access,加入到vlan10:g0/0/2接口设置访问类型为access,加入到vlan20 g0/0/3接口设置为t ...
- Supervisor的作用与配置
supervisor supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到super ...
- 为基于OpenCV的图像处理程序编写界面—关于QT\MFC\CSharp的选择以及GOCW的介绍
基于OpenCV编写图像处理项目,除了算法以外,比较重要一个问题就是界面设计问题.对于c++语系的程序员来说,一般来说有QT/MFC两种考虑.QT的确功能强大,特别是QML编写andr ...
- 原生JS封装创建多级菜单函数
手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求. 子类层级不确定,可根据数据自动生成多级菜单. 操作便捷,只需传入一个HTML标签. 缺点: 需要满足特定的数据结构 废话不多说,展示代码. ...
- line-height的定义
line-height 定义: 即行高,两行文字基线之间的距离 三问: 什么是基线? 形象可理解为字母x的下边缘 为什么是基线? 在css中基线乃各种线的基础 需要两行吗? 实例: <!doct ...
- restorecon【转】
本文转载自:https://blog.csdn.net/sinat_36888624/article/details/6076650 estorecon命令用来恢复SELinux文件属性即恢复文件的安 ...
- express之req res
request对象和response对象 Request req.baseUrl 基础路由地址 req.body post发送的数据解析出来的对象 req.cookies 客户端发送的cookies数 ...