有人说算法是程序的灵魂,也就是解决问题要有抽象出来,无外乎就是处理数据和怎么做。
数据:数据是操作的对象,在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,就是数据结构(data structure)
怎么做:操作的目的是对数据进行加工处理,以得到期望的结果,要求计算机进行操作的步骤,就是算法(algorithm) [ˈælɡərɪðəm] (爱了个瑞泽姆)
著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:算法 + 数据结构 = 程序
(1)做任何事情都有一定的步骤
(2)广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”
(3)对同一个问题,可以有不同的解题方法和步骤
(4)为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法
分两大类:数值运算算法;非数值运算算法
一个是算数的,花开两朵、各表一枝;另一个是事务管理领域的(排序、搜索、下棋)
我们来看看具体的算法(也可以说是方法吧,我们先不加入任何计算机实现的代码,专注算法本身)
简单的算法举例
(一)求1*2*3*4*5
(1)最先想到的
步骤1:先求1*2,得到结果2。
步骤2:将步骤1得到的乘积2再乘以3,得到结果6。
步骤3:将6再乘以4,得24。
步骤4:将24再乘以5,得120。这就是最后的结果。
很多的数的乘法怎么处理?。。。。。。
(2)抽象出2个数,一个是被乘数t、一个是乘数i,结果存在t中,之后一直乘直到i到了我们最后要算的数
Step1:使t=1,或写成1=>t
Step2:使i=2,或写成2 =>i
Step3:使t与i相乘,乘积仍放在变量t中,可表示为:t*i => t
Step4:使i的值加1,即i+1 => i
Step5:如果i不大于5,返回重新执行S3;否则,算法结束
最后得到t的值就是 5!的值
(二)判断一个正整数是不是素数
直到问得是啥
思路:
素数是除了1和自身之外,不能被其它任何整数整除的数
判断一个数n(n≥3)是否素数:将n作为被除数,将2到(n-1)各个整数先后作为除数,如果都不能被整除,则n为素数
S1:输入n的值
S2:i=2 (i作为除数)
S3:n被 i 除,得余数r
S4:如果r=0,表示n能被i整除,则输出n“不是素数”,算法
结束;否则执行S5
S5:i+1--->i
S6:如果i≤n-1,返回S3;否则输出n “是素数”,算法结束
这个当然是可以优化的。不用处理到n-1
(三)鸡兔同笼问题
鸡兔同笼,共有30个头,88只脚,求笼中鸡兔各有多少只?
(1)数学计算法
(2)计算机暴力法
S1:i=1;
S2:设鸡为i个,则兔为(30-i)个
S3:如果(i*2+(30-i)*4)=88,输出鸡i个,兔(30-i)个
S4:否则 i+1 => i 赋值给i
S5:如果 i>30,输出找不到答案,否则转到S2
以为这样就了解算法了吗?那也想得太天真了。来来来,看看这个
(四) 旅行推销员问题 (英语: Travelling salesman problem , TSP )是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。
n如果很大很大的时候,计算机也是无能为力了。这就要求有一些高手高手高高手的算法,来优化求解过程、降低求解难度。 这里就涉及到图论的知识。要尊重科学,尊重专业。
由于其在交通运输、电路板线路设计以及物流配送等领域内有着广泛的应用,国内外学者对其进行了大量的研究。早期的研究者使用精确算法求解该问题,常用的方法包括: 分枝定界 法、 线性规划 法、 动态规划 法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或 启发式算法 ,主要有 遗传算法 、 模拟退火法 、 蚁群算法 、 禁忌搜索 算法、 贪婪算法 和 神经网络 等。
这个算法还是很有意思的。这个我打算单独录制一篇算法说明来讲讲这个问题。
算法的特性
说一千道一万,我们还是得看看算法的特点吧,从前面的例子汇总我们可以看出
算法的表示
(1)自然语言
光说不练假把式,光练不说傻把式,又练又说真把式,随着问题的深入,这种自然语言的方法不适用了。
(2)流程图
三种基本的结构举例
2.1顺序结构
2.2选择结构
2.3循环结构
这就是之后我们会学到的while和do while
(3)N-S图
有了上面流程图的三种结构的基础,全部算法写在一个矩形框内,由一些基本的框组成一个大的框;N-S图像一个盒子,又称为“盒图”
(4)伪代码
用图表示算法,画图费事
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法
伪代码无固定、严格语法结构,可使用英文、本土语言或者英文结合本土语言对算法进行描述
伪代码几乎已经成为学术文章、项目开发等应用中使用频率最高的算法表示方法
(5)计算机语言
我要出的很多系列课程都要致力于用计算机语言实现具体的操作,要不然大家看着云里雾里的,到头来就是纸上谈兵,竹篮打水一场空。