什么是数学算法
⑴ 数学中都有什么算法啊
定义法、配方法、待定系数法、换元法、反证法、数学归纳法、导数法、赋值法、消去法、定比分离法、比较法、分析法、综合法 ,还有很多桑
介里有几个比较详细的哈.
一、换元法
“换元”的思想和方法,在数学中有着广泛的应用,灵活运用换元法解题,有助于数量关系明朗化,变繁为简,化难为易,给出简便、巧妙的解答.
在解题过程中,把题中某一式子如f(x),作为新的变量y或者把题中某一变量如x,用新变量t的式子如g(t)替换,即通过令f(x)=y或x=g(t)进行变量代换,得到结构简单便于求解的新解题方法,通常称为换元法或变量代换法.
用换元法解题,关键在于根据问题的结构特征,选择能以简驭繁,化难为易的代换f(x)=y或x=g(t).就换元的具体形式而论,是多种多样的,常用的有有理式代换,根式代换,指数式代换,对数式代换,三角式代换,反三角式代换,复变量代换等,宜在解题实践中不断总结经验,掌握有关的技巧.
例如,用于求解代数问题的三角代换,在具体设计时,宜遵循以下原则:(1)全面考虑三角函数的定义域、值域和有关的公式、性质;(2)力求减少变量的个数,使问题结构简单化;(3)便于借助已知三角公式,建立变量间的内在联系.只有全面考虑以上原则,才能谋取恰当的三角代换.
换元法是一种重要的数学方法,在多项式的因式分解,代数式的化简计算,恒等式、条件等式或不等式的证明,方程、方程组、不等式、不等式组或混合组的求解,函数表达式、定义域、值域或最值的推求,以及解析几何中的坐标替换,普通方程与参数方程、极坐标方程的互化等问题中,都有着广泛的应用.
二、消元法
对于含有多个变数的问题,有时可以利用题设条件和某些已知恒等式(代数恒等式或三角恒等式),通过适当的变形,消去一部分变数,使问题得以解决,这种解题方法,通常称为消元法,又称消去法.
消元法是解方程组的基本方法,在推证条件等式和把参数方程化成普通方程等问题中,也有着重要的应用.
用消元法解题,具有较强的技巧性,常常需要根据题目的特点,灵活选择合适的消元方法
三、待定系数法
按照一定规律,先写出问题的解的形式(一般是指一个算式、表达式或方程),其中含有若干尚待确定的未知系数的值,从而得到问题的解.这种解题方法,通常称为待定系数法;其中尚待确定的未知系数,称为待定系数.
确定待定系数的值,有两种常用方法:比较系数法和特殊值法.
四、判别式法
实系数一元二次方程
ax2+bx+c=0 (a≠0) ①
的判别式△=b2-4ac具有以下性质:
>0,当且仅当方程①有两个不相等的实数根
△ =0,当且仅当方程①有两个相等的实数根;
<0,当且仅当方程②没有实数根.
对于二次函数
y=ax2+bx+c (a≠0)②
它的判别式△=b2-4ac具有以下性质:
>0,当且仅当抛物线②与x轴有两个公共点;
△ =0,当且仅当抛物线②与x轴有一个公共点;
<0,当且仅当抛物线②与x轴没有公共点.
五、 分析法与综合法
分析法和综合法源于分析和综合,是思维方向相反的两种思考方法,在解题过程中具有十分重要的作用.
在数学中,又把分析看作从结果追溯到产生这一结果的原因的一种思维方法,而综合被看成是从原因推导到由原因产生的结果的另一种思维方法.通常把前者称为分析法,后者称为综合法.
六、 数学模型法
例(哥尼斯堡七桥问题)18世纪东普鲁士哥尼斯堡有条普莱格河,这条河有两个支流,在城中心汇合后流入波罗的海.市内办有七座各具特色的大桥,连接岛区和两岸.每到傍晚或节假日,许多居民来这里散步,观赏美丽的风光.年长日久,有人提出这样的问题:能否从某地出发,经过每一座桥一次且仅一次,然后返回出发地?
数学模型法,是指把所考察的实际问题,进行数学抽象,构造相应的数学模型,通过对数学模型的研究,使实际问题得以解决的一种数学方法.
七、配方法
所谓配方,就是把一个解析式利用恒等变形的方法,把其中的某些项配成一个或几个多项式正整数次幂的和形式.通过配方解决数学问题的方法叫配方法.其中,用的最多的是配成完全平方式.配方法是数学中一种重要的恒等变形的方法,它的应用十分非常广泛,在因式分解、化简根式、解方程、证明等式和不等式、求函数的极值和解析式等方面都经常用到它.
八、因式分解法
因式分解,就是把一个多项式化成几个整式乘积的形式.因式分解是恒等变形的基础,它作为数学的一个有力工具、一种数学方法在代数、几何、三角等的解题中起着重要的作用.因式分解的方法有许多,除中学课本上介绍的提取公因式法、公式法、分组分解法、十字相乘法等外,还有如利用拆项添项、求根分解、换元、待定系数等等.
九、换元法
换元法是数学中一个非常重要而且应用十分广泛的解题方法.我们通常把未知数或变数称为元,所谓换元法,就是在一个比较复杂的数学式子中,用新的变元去代替原式的一个部分或改造原来的式子,使它简化,使问题易于解决.
介里LL没有说很详细桑,内啥简便算法我也一起说了桑丶
乘法交换律,乘法分配律,加法交换律,加法结合律,乘法分配律,
⑵ 高中数学的算法,程序框图
其实你把课好好听、作业认真完成都搞懂就可以了,不要这么紧张。我经验是最后考试题目非常简单。要注重培养逻辑思维,模仿计算机按步骤办事计算。有问题再问我好了。
附上:对高中数学中算法的几点认识(网上找的,意义不大)
算法属于新教材的新增内容,笔者结合自己的教学体会,谈谈对算法的理解和认识,供各位同仁参考:
1、算法的内容
(1)自然语言(2)程序框图(3)算法语句,其中,在每种语言中有各自的结构,如:顺序结构、循环结构、条件结构等。
2、算法在高中课程中的地位:
算法内容的设计分为两部分。
一部分主要介绍算法的基础知识,可以称作算法的“三基”:算法基本思想,算法基本结构,算法基本语句。通过一些具体的案例介绍算法的基本思想,使学生了解:为了解决一个问题,设计出解决问题的系列步骤,任何人实施这些步骤就可以解决问题,这就是解决问题的一个算法。这是对算法的一种广义的理解。对算法的理解,更多地是与计算机联系在一起,计算机可以完成这些步骤。
算法的基本结构一般有三种:顺序结构,分叉结构,循环结构。前两种结构很容易理解,循环结构稍微有点难,这里用到函数思想,难在理解反映循环过程的循环变量。在教学过程中,一定要通过具体的案例,结合具体的情境引入概念,会使问题变得很简单。
介绍算法语句的时候,要区分算法语言和基本的算法语句。我们知道,现在使用的算法语言是很多的,例如,basic 语言,q-basic 语言,c-语言,等等。在高中的数学课程中,不要求介绍算法语言,仅仅需要了解基本语句,例如,输入语句,输出语句,赋值语句,条件语句,循环语句,等等。在不同的语言中,这些语句的表示可能不一样,数学课程要求采用公认的统一表示,称为伪代码。很容易把伪代码翻译成任何一种算法语言。
描述算法有三种语言:自然语言、框图语言、基本算法语句。
算法的另一部分设计,是把算法的思想融入相关数学内容中。实际上,算法思想是贯穿在高中数学课程始终的基本思想。例如,二分法求方程的解;点到直线的距离、点到平面的距离、直线到直线距离;立体几何性质定理的证明过程;一元二次不等式;线性规划;等等内容中,都运用了算法思想。
用算法思想学习和认识数学对于提高数学素养是很有用的,希望老师予以重视。
3、理解赋值语句:
赋值是算法中的难点之一,理解赋值对于理解算法是非常重要的。
赋值就是把数值赋予给定的变量。例如,a:=5,就表示变量a被赋予的值是5,即a=5,这个被赋值的变量可以与其他的值进行运算。对于被赋值的变量a,还可以赋予其它的值取代原来的值。我们可以用磁带录音来比喻赋值,在我们录音时,是把磁带上旧的录音材料冲掉之后,才能把新的录音材料加载上去。同样的道理,我们这里的赋值也是先把原来的值清零之后,再把新的值赋上去。下面我们通过一个例子来说明如何设置变量和给变量赋值。
例:设计一个算法,从4个不同的数中找出最大数。
解:记这5个不同的数分别为a1,a2,a3,a4,a5,算法步骤如下:
1、比较a1与a2将较大的数记作b.
(在这一步中,b表示的是前2个数中的最大数)
2、再将b与a3进行比较,将较大的数记作b.
(执行完这一步后,b的值就是前3个数中的最大数)
3、再将b与a4进行比较,将较大的数记作b.
(执行完这一步后,b的值就是前4个数中的最大数)
4、输出b,b的值即为所求得最大数。
分析:上述算法的4个步骤中,每步都要与上一步中得到的最大数b进行比较,得出新的最大数。b可以取不同的值,b就称之为变量。在第1步到第3步的算法过程中,我们都把比较后的较大数记作b,即把值赋予了b,这个过程就是赋值的过程,这个过程有两个功能,第一,我们可以不断地对b的值进行改变,即把数值放入b中;第二,b的值每变化一次都是为下一步的比较服务。
4、函数在循环结构中的作用:
(1)循环结构是算法的一种基本结构。
例如,设计算法,输出1000以内能被3和5整除的所有正整数。解决这个问题,我们首先要引入变量a表示待输出的数,则a=15n (n=1,2,3,…,66).n从n从1变到66,反复输出a,就能输出1000以内的所有能被3和5整除的正整数。像这样的算法结构称为循环结构,其中反复执行的部分称为循环体。变量n控制着循环的开始和结束,称为循环变量。
(2)循环结构是理解算法的另一个难点,难点在于对于循环变量的理解。
循环结构中的循环变量分为两种形式,一种是控制循环次数的变量,例如,输出1000以内能被3和5整除的所有正整数这个循环结构中,n就是控制循环次数的循环变量。另一种是控制结果精确度的变量,例如用二分法算法求方程f(x)=0在区间[0,1]上的一个近似解的流程图,要求精确度为。在这个算法过程中,精确度就是控制结果精确度的循环变量。
循环变量使得循环体得以“循环”,循环变量控制了循环的“开始”和“结束”,是刻画循环结构的关键。
以上几点是对算法的粗浅认识,不当之处,请批评指正!
⑶ 什么是算法算法的概念算法的特点都有哪些
1、算法概念:
在数学上,现代意义上的“算法”通常是指可以用计算机来解决的某一类问题是程序或步骤,这些程序或步骤必须是明确和有效的,而且能够在有限步之内完成.
2. 算法的特点:
(1)有限性:一个算法的步骤序列是有限的,必须在有限操作之后停止,不能是无限的.
(2)确定性:算法中的每一步应该是确定的并且能有效地执行且得到确定的结果,而不应当是模棱两可.
(3)顺序性与正确性:算法从初始步骤开始,分为若干明确的步骤,每一个步骤只能有一个确定的后继步骤,前一步是后一步的前提,只有执行完前一步才能进行下一步,并且每一步都准确无误,才能完成问题.
(4)不唯一性:求解某一个问题的解法不一定是唯一的,对于一个问题可以有不同的算法.
(5)普遍性:很多具体的问题,都可以设计合理的算法去解决,如心算、计算器计算都要经过有限、事先设计好的步骤加以解决.
⑷ 高一数学必修三 算法的概念
S1:
d=/Aa+Bb+C//根号下(A^2+B^2)
if(d=r)相切;
else if(d>r)相离;
else 相交;
S2:
h=根号下[L^2-a^2/3];
S=a^2*(根号下3)/4
V=S*h/3
⑸ 算法的核心是什么,数学就是算法吗
我觉得这样理解是不全面的,首先算法的核心是如何用抽象的数学模型来解决这个实际问题,而且实现的手段是通过代码编程,所以说算法的核心是数学是基本准确的。但是数学是算法这个说法就问题很大了。
数学包含的范围非常广,自己是一个自洽的系统,而且随着人类的认识的提高,数学也在发展,也发展了很多新的数学工具来帮我们解决实际问题。
所以说如果数学是背后的关于真理的理论,那么算法是部分真理被使用(通过代码实现的方式)来帮我们解决一些特定的问题。
这是我的理解。
⑹ 高二数学 算法的概念 在线等!!!!!!!!!!!!!
算法 参考出处:http://blog.csdn.net/ctu_85/archive/2008/05/11/2432736.aspx
一、什么是算法
算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。算法常常含有重复的步骤和一些比较或逻辑判断。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n 的函数f(n),算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。时间复杂度用“O(数量级)”来表示,称为“阶”。常见的时间复杂度有: O(1)常数阶;O(log2n)对数阶;O(n)线性阶;O(n2)平方阶。
算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。
[font class="Apple-style-span" style="font-weight: bold;" id="bks_etfhxykd"]算法 Algorithm [/font]
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。
一个算法应该具有以下五个重要的特征:
1、有穷性: 一个算法必须保证执行有限步之后结束;
2、确切性: 算法的每一步骤必须有确切的定义;
3、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;
4、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5、可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
算法的设计要求
1)正确性(Correctness)
有4个层次:
A.程序不含语法错误;
B.程序对几组输入数据能够得出满足规格要求的结果;
C.程序对精心选择的、典型的、苛刻的、带有刁难性的几组输入数据能够得出满足规格要求的结果;
D.程序对一切合法的输入数据都能产生满足规格要求的结果。
2)可读性(Readability)
算法的第一目的是为了阅读和交流;
可读性有助于对算法的理解;
可读性有助于对算法的调试和修改。
3)高效率与低存储量
处理速度快;存储容量小
时间和空间是矛盾的、实际问题的求解往往是求得时间和空间的统一、折中。
算法的描述 算法的描述方式(常用的)
算法描述 自然语言
流程图 特定的表示算法的图形符号
伪语言 包括程序设计语言的三大基本结构及自然语言的一种语言
类语言 类似高级语言的语言,例如,类PASCAL、类C语言。
算法的评价 算法评价的标准:时间复杂度和空间复杂度。
1)时间复杂度 指在计算机上运行该算法所花费的时间。用“O(数量级)”来表示,称为“阶”。
常见的时间复杂度有: O(1)常数阶;O(logn)对数阶;O(n)线性阶;O(n^2)平方阶
2)空间复杂度 指算法在计算机上运行所占用的存储空间。度量同时间复杂度。
时间复杂度举例
(a) X:=X+1 ; O(1)
(b) FOR I:=1 TO n DO
X:= X+1; O(n)
(c) FOR I:= 1 TO n DO
FOR J:= 1 TO n DO
X:= X+1; O(n^2)
“算法”一词最早来自公元 9世纪 波斯数学家比阿勒·霍瓦里松的一本影响深远的着作《代数对话录》。20世纪的 英国 数学家 图灵 提出了着名的图灵论点,并抽象出了一台机器,这台机器被我们称之为 图灵机 。图灵的思想对算法的发展起到了重要的作用。
算法是 计算机 处理信息的本质,因为 计算机程序 本质上是一个算法,告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。 一般地,当算法在处理信息时,数据会从输入设备读取,写入输出设备,可能保存起来以供以后使用。
这是算法的一个简单的例子。
我们有一串随机数列。我们的目的是找到这个数列中最大的数。如果将数列中的每一个数字看成是一颗豆子的大小 可以将下面的算法形象地称为“捡豆子”:
首先将第一颗豆子(数列中的第一个数字)放入口袋中。
从第二颗豆子开始检查,直到最后一颗豆子。如果正在检查的豆子比口袋中的还大,则将它捡起放入口袋中,同时丢掉原先的豆子。 最后口袋中的豆子就是所有的豆子中最大的一颗。
下面是一个形式算法,用近似于 编程语言 的 伪代码 表示
给定:一个数列“list",以及数列的长度"length(list)" largest = list[1] for counter = 2 to length(list): if list[counter] > largest: largest = list[counter] print largest
符号说明:
= 用于表示赋值。即:右边的值被赋予给左边的变量。
List[counter] 用于表示数列中的第 counter 项。例如:如果 counter 的值是5,那么 List[counter] 表示数列中的第5项。
<= 用于表示“小于或等于”。
二、算法设计的方法
1.递推法
递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。
【问题】 阶乘计算
问题描述:编写程序,对给定的n(n≤100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。
由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[ ]存储:
N=a[m]×10m-1+a[m-1]×10m-2+ … +a[2]×101+a[1]×100
并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:
3 0 2 1 ……
首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。
计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。细节见以下程序。
# include <stdio.h>
# include <malloc.h>
......
2.递归
递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。
能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。
【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。
斐波那契数列为:0、1、1、2、3、……,即:
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2) (当n>1时)。
写成递归函数有:
int fib(int n)
{ if (n==0) return 0;
if (n==1) return 1;
if (n>1) return fib(n-1)+fib(n-2);
}
递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。
由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。
【问题】 组合问题
问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为: (1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。
【程序】
# include <stdio.h>
# define MAXN 100
int a[MAXN];
void comb(int m,int k)
{ int i,j;
for (i=m;i>=k;i--)
{ a[k]=i;
if (k>1)
comb(i-1,k-1);
else
{ for (j=a[0];j>0;j--)
printf(“%4d”,a[j]);
printf(“\n”);
}
}
}
void main()
{ a[0]=3;
comb(5,3);
}
3.回溯法
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。
【问题】 组合问题
问题描述:找出从自然数1,2,…,n中任取r个数的所有组合。
采用回溯法找问题的解,将找到的组合以从小到大顺序存于a[0],a[1],…,a[r-1]中,组合的元素满足以下性质:
(1) a[i+1]>a,后一个数字比前一个大;
(2) a-i<=n-r+1。
按回溯法的思想,找解过程可以叙述如下:
首先放弃组合数个数为r的条件,候选组合从只有一个数字1开始。因该候选解满足除问题规模之外的全部条件,扩大其规模,并使其满足上述条件(1),候选组合改为1,2。继续这一过程,得到候选组合1,2,3。该候选解满足包括问题规模在内的全部条件,因而是一个解。在该解的基础上,选下一个候选解,因a[2]上的3调整为4,以及以后调整为5都满足问题的全部要求,得到解1,2,4和1,2,5。由于对5不能再作调整,就要从a[2]回溯到a[1],这时,a[1]=2,可以调整为3,并向前试探,得到解1,3,4。重复上述向前试探和向后回溯,直至要从a[0]再回溯时,说明已经找完问题的全部解。按上述思想写成程序如下:
【程序】
# define MAXN 100
int a[MAXN];
void comb(int m,int r)
{ int i,j;
i=0;
a=1;
do {
if (a-i<=m-r+1
{ if (i==r-1)
{ for (j=0;j<r;j++)
printf(“%4d”,a[j]);
printf(“\n”);
}
a++;
continue;
}
else
{ if (i==0)
return;
a[--i]++;
}
} while (1)
}
main()
{ comb(5,3);
}
4.贪婪法
贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的整体情况,所以贪婪法不要回溯。
例如平时购物找钱时,为使找回的零钱的硬币数最少,不考虑找零钱的所有各种发表方案,而是从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种。这就是在使用贪婪法。这种方法在这里总是最优,是因为银行对其发行的硬币种类和硬币面值的巧妙安排。如只有面值分别为1、5和11单位的硬币,而希望找回总额为15单位的硬币。按贪婪算法,应找1个11单位面值的硬币和4个1单位面值的硬币,共找回5个硬币。但最优的解应是3个5单位面值的硬币。
【问题】 装箱问题
问题描述:装箱问题可简述如下:设有编号为0、1、…、n-1的n种物品,体积分别为v0、v1、…、vn-1。将这n种物品装到容量都为V的若干箱子里。约定这n种物品的体积均不超过V,即对于0≤i<n,有0<vi≤V。不同的装箱方案所需要的箱子数目可能不同。装箱问题要求使装尽这n种物品的箱子数要少。
若考察将n种物品的集合分划成n个或小于n个物品的所有子集,最优解就可以找到。但所有可能划分的总数太大。对适当大的n,找出所有可能的划分要花费的时间是无法承受的。为此,对装箱问题采用非常简单的近似算法,即贪婪法。该算法依次将物品放到它第一个能放进去的箱子中,该算法虽不能保证找到最优解,但还是能找到非常好的解。不失一般性,设n件物品的体积是按从大到小排好序的,即有v0≥v1≥…≥vn-1。如不满足上述要求,只要先对这n件物品按它们的体积从大到小排序,然后按排序结果对物品重新编号即可。装箱算法简单描述如下:
{ 输入箱子的容积;
输入物品种数n;
按体积从大到小顺序,输入各物品的体积;
预置已用箱子链为空;
预置已用箱子计数器box_count为0;
for (i=0;i<n;i++)
{ 从已用的第一只箱子开始顺序寻找能放入物品i 的箱子j;
if (已用箱子都不能再放物品i)
{ 另用一个箱子,并将物品i放入该箱子;
box_count++;
}
else
将物品i放入箱子j;
}
}
上述算法能求出需要的箱子数box_count,并能求出各箱子所装物品。下面的例子说明该算法不一定能找到最优解,设有6种物品,它们的体积分别为:60、45、35、20、20和20单位体积,箱子的容积为100个单位体积。按上述算法计算,需三只箱子,各箱子所装物品分别为:第一只箱子装物品1、3;第二只箱子装物品2、4、5;第三只箱子装物品6。而最优解为两只箱子,分别装物品1、4、5和2、3、6。
若每只箱子所装物品用链表来表示,链表首结点指针存于一个结构中,结构记录尚剩余的空间量和该箱子所装物品链表的首指针。另将全部箱子的信息也构成链表。以下是按以上算法编写的程序。
}
5.分治法
任何一个可以用计算机求解的问题所需的计算时间都与其规模N有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算;n=2时,只要作一次比较即可排好序;n=3时只要作3次比较即可,…。而当n较大时,问题就不那么容易处理了。要想直接解决一个规模较大的问题,有时是相当困难的。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题(1<k≤n),且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
分治法所能解决的问题一般具有以下几个特征:
(1)该问题的规模缩小到一定的程度就可以容易地解决;
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3)利用该问题分解出的子问题的解可以合并为该问题的解;
(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
分治法在每一层递归上都有三个步骤:
(1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
(2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
(3)合并:将各个子问题的解合并为原问题的解。
6.动态规划法
经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。
为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。以下先用实例说明动态规划方法的使用。
【问题】 求两字符序列的最长公共字符子序列
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质:
(
⑺ med 和rms是什么数学算法
RMS就是均方根值: RMS---root meam square,最原始的是针对正弦波推导出来的,但实际上对所有的波形都适用。电路上的计算基本过程是先平方再平均(积分)最后开方,其中开始时还有绝对值整流的过程。RMS是从有效值的定义里推导出来的计算方法,因此,两者等效。电路实现时,是这种计算方法的迫近。 均方根值也称作为效值,它的计算方法是先平方、再平均、然后开方。比如幅度为100V而占空比为0.5的方波信号,如果按平均值计算,它的电压只有50V,而按均方根值计算则有70.71V。这是为什么呢?举一个例子,有一组100伏的电池组,每次供电10分钟之后停10分钟,也就是说占空比为一半。如果这组电池带动的是10Ω电阻,供电的10分钟产生10A的电流和1000W的功率,停电时电流和功率为零。 那么在20分钟的一个周期内其平均功率为500W,这相当于70.71V的直流电向10Ω电阻供电所产生的功率。而50V直流电压向10Ω电阻供电只能产生的250W的功率。对于电机与变压器而言,只要均方根电流不超过额定电流,即使在一定时间内过载,也不会烧坏。 它是扬声器的功率处理能力(或称扬声器的额定功率)是一项重要技术参数,它代表扬声器承受长期连续安全工作的功率输入能力。 声音信号不是一种正弦波信号,而是一种随机的,这些随机信号可用三个能数来表示,有效值(RMS)又称均方根值,是以信号峰值等幅的正弦信号的一种测量结果,接近于平均值,基本上代表信号的发热能量。峰值(Peak)是信号达到的最大电平,对于正弦波来说,峰值电平大于有效值电平3dB,对于音乐信号来说,峰值电平超过有效值可达10-15dB在评定一种扬声器的位移能力时,峰值是重要的,峰值因子,用来说明峰值电平与有效值电平的比率,对于按AES2-1984的粉红色噪声源来说,峰值因子为6dB,即峰值电压是有效值电压的4倍。
RMS值实际就是有效值,就是一组统计数据的平方的平均值的平方根。
RMS=(X1平方+X2平方++Xn平方)/n 的1/2次方。
在直流(DC)电路中,电压或电流的定义很简单,但在交流(AC)电路中,其定义就较为复杂,有多种定义方式。均方根(rms)指的是定义AC波的有效电压或电流的一种最普遍的数学方法。
要得出rms值需要对表示AC波形的函数执行三个数学操作:
(1)计算波形函数(一般是正弦波)的平方值。
(2)对第一步得到的函数求时间平均值。
(3)求第二步得到的函数的平方根。
在一个阻抗由纯电阻组成的电路中,AC波的rms值通常称作有效值或DC等价值。比如,一个100V rms的AC源连接着一个电阻器,并且其电流产生50W热量,那么对于100V连接着这个电阻器的电源来说也将产生50W的热量。
对正弦波来说,rms值是峰值的0.707倍,或者是峰-峰值的0.354倍。家用电压是以rms来表示的。所谓的“117V”的交流电,其峰值(pk)约为165V,峰-峰值(pk-pk)约为330V。