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来执行检查语法错误,然后再输入不同的参数来检查结果。

转载于:https://www.cnblogs.com/walle-zhao/p/10456196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯算法提高----2n皇后

2n皇后问题描述给定一个n*n的棋盘&#xff0c;棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后&#xff0c;使任意的两个黑皇后都不在同一行、同一列或同一条对角线上&#xff0c;任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放…

运用tp5上传图片,并生成缩略图

最近想做个相册&#xff0c;需要用到上传图像&#xff0c;并且考虑到性能问题&#xff0c;还要生成缩略图&#xff0c;就学习下。在网上看了很多大神写的文章&#xff0c;经过各种调试总算出来了&#xff0c;分享下。不好之处&#xff0c;多多指教 ​ ​ ps&#xff1a;运用tp5…

求解最长回文子串----Manacher 算法

最长回文子串问题&#xff1a;给定一个字符串&#xff0c;求它的最长回文子串长度。 如果一个字符串正着读和反着读是一样的&#xff0c;那么我们称之为回文串。例如&#xff1a;abba、aaaa、abvcba、123321等 暴力法&#xff1a;遍历字符串的所有子串&#xff0c;对每个字串进…

Peter's smokes -poj 2509

题意&#xff1a;彼得有n支雪茄&#xff0c;每k个烟头可以换一支新雪茄&#xff0c;问彼得最多可以吸多少支雪茄 &#xff1f; 当时自己做时&#xff0c;错在了直接在while循环开始前&#xff0c;便将雪茄的初始数量给加上了&#xff0c;然而应该是先处理后再加上最终剩余的雪茄…

模式匹配算法----KMP算法以及next数组的解法

KMP算法&#xff1a;求字符串匹配&#xff08;也叫模式匹配&#xff09;的算法&#xff0c;即给定一个字符串&#xff0c;求其某一子串在其中出现的位置。 普通模式匹配 例如&#xff1a;给定字符串为abcabaaabaabcac&#xff0c;求其子串abaabcac在其中出现的位置。 结果为…

Spring Boot使用layui的字体图标时无法正常显示 解决办法

在html文件使用字体图标并且预览时正常&#xff0c;但是启动工程后显示不正常&#xff0c;浏览器调试界面显示字体文件无法decode&#xff1a; Failed to decode downloaded font: xxxxx 如图所示&#xff1a; 显示结果&#xff1a; 原因&#xff1a;经过maven的filter&#xf…

蓝桥杯第七届国赛JAVA真题----机器人塔

机器人塔X星球的机器人表演拉拉队有两种服装&#xff0c;A和B。 他们这次表演的是搭机器人塔。 类似&#xff1a;队内的组塔规则是&#xff1a; A 只能站在 AA 或 BB 的肩上。B 只能站在 AB 或 BA 的肩上。你的任务是帮助拉拉队计算一下&#xff0c;在给定A与B的人数时&…

致自己人生的一句话

千锤万凿出深山 烈火焚烧若等闲 转载于:https://www.cnblogs.com/wuhefeng/p/10467737.html

单链表常见操作

最近在重新学习数据结构和算法的知识&#xff0c;数据结构和算法问题本身比较枯燥和乏味&#xff0c;而且比较难不容易掌握&#xff0c;但是属于程序员内功的一部分&#xff0c;学习起来容易上瘾。 1. 单链表定义 package algorithm.datastructors;/*** 单向链表* author i3247…

蓝桥杯第五届省赛JAVA真题----最长公共子序列

一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&#xff1a; "abcdefg" 而言&#xff0c;"ab","abd","bdef" 等都是它的子序列。 特别地&#xff0c;一个串本身&#xff0c;以及空串…

Python divmod() 函数

Python divmod() 函数 Python 内置函数 python divmod() 函数把除数和余数运算结果结合起来&#xff0c;返回一个包含商和余数的元组(a // b, a % b)。 在 python 2.3 版本之前不允许处理复数。 函数语法 divmod(a, b)参数说明&#xff1a; a: 数字b: 数字实例 >>>div…

蓝桥杯第五届省赛JAVA真题----单位分数

形如&#xff1a;1/a 的分数称为单位分数。 可以把1分解为若干个互不相同的单位分数之和。 例如&#xff1a; 1 1/2 1/3 1/9 1/18 1 1/2 1/3 1/10 1/15 1 1/3 1/5 1/7 1/9 1/11 1/15 1/35 1/45 1/231 等等&#xff0c;类似这样的分解无穷无尽。我们增加一个约…

.NET面试题总结

1、c#垃圾回收机制 从以下方面入手展开&#xff1a; 1、压缩合并算法 2、代的机制 3、GC调用终结器 2、委托和事件 先说它的定义&#xff1a;委托的本质是类&#xff0c;类型安全的指针&#xff0c;然后从用途上考虑&#xff0c;事件是包装的委托&#xff0c;但事件不是委托…

蓝桥杯第六届省赛JAVA真题----垒骰子

垒骰子 赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。 经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01; 我们先来规范一下骰子&#xff1a;1 …

JAVA应试技巧----大数开方

大数开方--牛顿迭代法&#xff1a; 如果一个数的位数为偶数个&#xff0c;那么这个数开方之后就有n/2位&#xff1b; 如果一个数的位数为奇数个&#xff0c;那么这个数开方之后就有n/21位&#xff1b; 我们以num1000为例&#xff0c;位数为4&#xff0c;偶数&#xff0c;那么开…

蓝桥杯历届试题----矩阵翻硬币

矩阵翻硬币 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义&#xff1a;将所有第 i*x 行&#xff0c;第 j*y 列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xff0…

并发队列、线程池、锁

1、CountDownLatch(计数器) CountDownLatch 类位于java.util.concurrent包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务A&#xff0c;它要等待其他任务执行完毕之后才能执行&#xff0c;此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是…

POJ 1088----滑雪(DP)

原题连接&#xff1a;http://poj.org/problem?id1088 Description Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降机来载你。Mic…

Vijos 1603 ----迷宫(矩阵乘法,矩阵快速幂)

描述 在某个神秘的星球上有一个游乐园 游乐园里有一个奇怪的迷宫&#xff0c;迷宫内有n个点&#xff0c;每个点之间都可能会有一条有向边&#xff08;可能会有自环&#xff09; 现在游乐园主有个问题想请你帮忙&#xff1a; 问&#xff1a;从s点走到f点&#xff0c;恰好走过…

蓝桥杯第六届省赛JAVA真题----循环节长度

循环节长度 两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为&#xff1a;循环节。 比如&#xff0c;11/136>0.846153846153….. 其循环节为[846153] 共有6位。 下面的方法&#xff0c;可以求出循环节的长度。 请仔细阅读代码&#xff0c;并填写…