导航:首页 > 源码编译 > 大学计算机第七版算法设计枚举法

大学计算机第七版算法设计枚举法

发布时间:2023-02-04 09:21:51

⑴ 大一计算机专业应该掌握的算法有哪些

大一的话不用掌握太专一的算法,主要是真正理解程序设计的3中流程,知道数组能干哪些事情,尝试理解函数递归,理解RAM机模型。掌握以下基本算法:
筛选法、试除法求素数,汉诺塔,放苹果,简单枚举法,N皇后问题等简单回溯法,简单模拟法,高精度算法(+-*/),GCD算法,二分法、牛顿发求根,选择、冒泡排序等基本算法。
一开始,学会用程序表达自己的算法思想是最基本的基本功。
年级高了以后,等你学了离散数学。数据结构,算法设计与分析以后,就能设计些较复杂的算法了。

推荐几本书:
算法导论,英文叫Introction to Algorithms,2nd Edition,这个很经典
计算机程序设计艺术,这个也是经典着作,最好看看
数据结构与算法分析
如果你们学校有ACM校队的话最好和他们交流交流。

⑵ 枚举法是什么

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法. 一、特点:将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如: 找出1到100之间的素数。需要将1到100之间的所有整数进行判断。 枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点: 1、得到的结果肯定是正确的; 2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。 3、通常会涉及到求极值(如最大,最小,最重等)。 二、枚举算法的一般结构:while循环。 首先考虑一个问题:将1到100之间的所有整数转换为二进制数表示。 算法一: for i:=1 to 100 do begin 将i转换为二进制,采用不断除以2,余数即为转换为2进制以后的结果。一直除商为0为止。 end; 算法二:二进制加法,此时需要数组来帮忙。 program p; var a:array[1..100] of integer; {用于保存转换后的二进制结果} i,j,k:integer; begin fillchar(a,sizeof(a),0); {100个数组元素全部初始化为0} for i:=1 to 100 do begin k:=100; while a[k]=1 do dec(k); {找高位第一个为0的位置} a[k]:=1; {找到了立刻赋值为1} for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0} k:=1; while a[k]=0 do inc(k); {从最高位开始找不为0的位置} write('(',i,')2='); for j:=k to 100 do write(a[j]); {输出转换以后的结果} writeln; end; end. 枚举法,常常称之为穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。 采用枚举算法解题的基本思路: (1) 确定枚举对象、枚举范围和判定条件; (2) 一一枚举可能的解,验证是否是问题的解 下面我们就从枚举算法的的优化、枚举对象的选择以及判定条件的确定,这三个方面来探讨如何用枚举法解题。 例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡? 算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。 下面是解这个百鸡问题的程序 var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100 do for z:=0 to 100 do{枚举所有可能的解} if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); {验证可能的解,并输出符合题目要求的解} end. 上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序: var x,y,z:integer; begin for x:=0 to 100 do for y:=0 to 100-x do begin z:=100-x-y; if (x*3+y*2+z div 3=100)and(z mod 3=0)then writeln('x=',x,'y=',y,'z=',z); end; end. 未经优化的程序循环了1013 次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次 ,时间复杂度为O(n2)。从上面的对比可以看出,对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向。 在枚举算法中,枚举对象的选择也是非常重要的,它直接影响着算法的时间复杂度,选择适当的枚举对象可以获得更高的效率。如下例: 例2、将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 例如:三个三位数192,384,576满足以上条件.(NOIP1998pj) 算法分析:这是1998年全国分区联赛普及组试题(简称NOIP1998pj,以下同)。此题数据规模不大,可以进行枚举,如果我们不加思地以每一个数位为枚举对象,一位一位地去枚举: for a:=1 to 9 do for b:=1 to 9 do ……… for i:=1 to 9 do 这样下去,枚举次数就有99次,如果我们分别设三个数为x,2x,3x,以x为枚举对象,穷举的范围就减少为93,在细节上再进一步优化,枚举范围就更少了。程序如下: var t,x:integer; s,st:string; c:char; begin for x:=123 to 321 do{枚举所有可能的解} begin t:=0; str(x,st);{把整数x转化为字符串,存放在st中} str(x*2,s); st:=st+s; str(x*3,s); st:=st+s; for c:='1' to '9' do{枚举9个字符,判断是否都在st中} if pos(c,st)<>0 then inc(t) else break;{如果不在st中,则退出循环} if t=9 then writeln(x,' ',x*2,' ',x*3); end; end. 在枚举法解题中,判定条件的确定也是很重要的,如果约束条件不对或者不全面,就穷举不出正确的结果, 我们再看看下面的例子。 例3 一元三次方程求解(noip2001tg) 问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。 要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。 提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*(x2)<0,则在(x1,x2)之间一定有一个根。 样例 输入:1 -5 -4 20 输出:-2.00 2.00 5.00 算法分析:由题目的提示很符合二分法求解的原理,所以此题可以用二分法。用二分法解题相对于枚举法来说很要复杂很多。此题是否能用枚举法求解呢?再分析一下题目,根的范围在-100到100之间,结果只要保留两位小数,我们不妨将根的值域扩大100倍(-10000<=x<=10000),再以根为枚举对象,枚举范围是-10000到10000,用原方程式进行一一验证,找出方程的解。 有的同学在比赛中是这样做 var k:integer; a,b,c,d,x :real; begin read(a,b,c,d); for k:=-10000 to 10000 do begin x:=k/100; if a*x*x*x+b*x*x+c*x+d=0 then write(x:0:2,' '); end; end. 用这种方法,很快就可以把程序编出来,再将样例数据代入测试也是对的,等成绩下来才发现这题没有全对,只得了一半的分。 这种解法为什么是错的呢?错在哪里?前面的分析好象也没错啊,难道这题不能用枚举法做吗? 看到这里大家可能有点迷惑了。 在上面的解法中,枚举范围和枚举对象都没有错,而是在验证枚举结果时,判定条件用错了。因为要保留二位小数,所以求出来的解不一定是方程的精确根,再代入ax3+bx2+cx+d中,所得的结果也就不一定等于0,因此用原方程ax3+bx2+cx+d=0作为判断条件是不准确的。 我们换一个角度来思考问题,设f(x)=ax3+bx2+cx+d,若x为方程的根,则根据提示可知,必有f(x-0.005)*(x+0.005)<0,如果我们以此为枚举判定条件,问题就逆刃而解。另外,如果f(x-0.005)=0,哪么就说明x-0.005是方程的根,这时根据四舍5入,方程的根也为x。所以我们用(f(x-0.005)*f(x+0.005)<0) 和 (f(x-0.005)=0)作为判定条件。为了程序设计的方便,我们设计一个函数f(x)计算ax3+bx2+cx+d的值,程序如下: {$N+} var k:integer; a,b,c,d,x:extended; function f(x:extended):extended; {计算ax3+bx2+cx+d的值} begin f:=((a*x+b)*x+c)*x+d; end; begin read(a,b,c,d); for k:=-10000 to 10000 do begin x:=k/100; if (f(x-0.005)*f(x+0.005)<0) or (f(x-0.005)=0) then write(x:0:2,' '); {若x两端的函数值异号或x-0.005刚好是方程的根,则确定x为方程的根} end; end. 用枚举法解题的最大的缺点是运算量比较大,解题效率不高,如果枚举范围太大(一般以不超过两百万次为限),在时间上就难以承受。但枚举算法的思路简单,程序编写和调试方便,比赛时也容易想到,在竞赛中,时间是有限的,我们竞赛的最终目标就是求出问题解,因此,如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么我们最好是采用枚举法,而不需太在意是否还有更快的算法,这样可以使你有更多的时间去解答其他难题

⑶ pascal基础知识

一、算法的基础知识
1.用计算机解决问题的步骤:
① 分析问题
② 算法设计
③ 描述算法
编程实现
从上面的求解问题过程可以看出,关键在于前三步的解决:第一步就是解决模型的数据结构,第二步是解决问题的算法,第三步是形式化地描写算法。
2.算法的定义:
算法是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算。算法可以理解为:程序(数据处理)+ 数据结构(数据组织)。
3.算法的性质:
① 有限性
② 确定性
③ 输入输出(可以没有输入,但一定有输出)
④ 可行性
常见的算法有:穷举法、迭代法、递推法、递归法、回溯法、深度及广度搜索法、动态规划、构造法等等。
2.N-S图:
1973年,美国学者I.Nassi和B.Shneiderman提出了一种用图形表示算法的方法,称为N-S流程图。N-S图包括顺序、选择和循环三种基本结构。
3.程序设计语言:
计算机中的语言分为低级语言和高级语言,而低级语言又分为机器语言和汇编语言。
机器语言是一种CPU的指令系统,它是CPU可以识别的一系列有0和1这种二进制代码组成的指令。它依赖于机器,不同类型的计算机有不同的机器语言,机器语言的程序有许多机器指令组成,每条指令由操作码和地址码组成,数据和指令都放在不同的地址单元中。
汇编语言它是一种符号语言,为了克服机器语言固有的缺陷,20世纪50年代中期出现,将难以记忆和辨别的机器语言操作码用有意义的英文单词作为“助记符”来代替0、1进行编程。
高级语言,不再面向机器,而是接近人类的自然语言。常见的还有C/C++,Pascal,Basic,Java等。
数据类型、常量、变量及说明方法
数据类型确定了该类型数据项的表示、取值范围以及所能参与的运算。在pascal语言中,无论常量还是变量都必须属于一个确定的数据类型。
Pascal 提供了丰富的数据类型,可以分为三大类:
① 简单类型:分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型)
② 构造类型:分为数组类型、集合类型、记录类型和文件类型
③ 指针类型
这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。另外,我们把整型、字符型、布尔型、枚举型和子界型称为顺序类型。

另:数据结构
-栈 队列
– 并查集
– 堆
– 字母树 线段树 平衡树 动态树
– 块状链表
– 后缀数组
– ……


– 先进后出
* 队列
– 先进先出
* 常见的应用有哪些?
– 表达式求值
– 搜索
* 深搜
* 广搜
– 优化

* 集合用代表元表示
– representative?Getfather(x)
* 初始的时候,所有元素各自成为一个集合
– for i?1 to N
* father[i]?i
* 判断是否在同一集合
– 代表元是否相同
* return Getfather(x)=Getfather(y)
* 合并两个集合
– 将其中一集合的代表元指向另一集合代表元
* father[Getfather(x)]?y

并查集
* 如何寻找代表元?
– Getfather(x)
* if father[x]=x
– return x
* return Getfather(father[x])
* 如何优化?
– 路径压缩
* Getfather(x)
– if father[x]=x
>>return x
– father[x]?Getfather(father[x])
– return father[x]

* 用途
– 用于寻找最值
* 大根堆、小根堆
* 小根堆性质
– 是一棵完全二叉树
* i的父亲是谁?
– idiv 2
* i的左右儿子是谁?
– 2i和2i+1
– 树上的每棵子树,儿子的值不小于根
堆排序
– 建堆
– 取出根
– 删除根
– 反复取、删的过程
时间效率
– O(Nlog N)
块状数组
* 增加一下题目内容
– 询问区间最大值
– 询问区间和
– 询问区间内的和最大连续串
– 可以修改一个数
– 可以将一串连续的数变为一个值
– 可以将一串连续的数旋转一下
* 块状数组?块状链表
– 可以将一串连续的数翻转一下

可能有些难

⑷ 可以用什么分支来实现枚举法检验条件

枚举算法的结构特点 ①枚举法的关键就是列举和检验这两个操作,如图 3—1 所示。 图3-1 列举和检验 ②为了保证对所有可能的情况
2. 枚举算法的一般设计步骤 ①确定列举的范围:确定列举的对象的范围,不能随意扩大和缩小列举范围,否则可能会造成多解 或漏解后果。 ②明确检验的条件
3. 枚举法的优缺点 枚举法充分利用了计算机快速高效的特点,让计算机进行重复运算,以求得问题的解。由于枚举法 是将所有可能的解无一例外地进行检验,
网络文库

⑸ 求最大公因数的三种方法

、使用分解质因数法:把几个数分解成几个质因数的积,然后找相同的质因数,再把这几个质因数相乘,积就是他们的最大公因数。
2、使用短除法:用短除法对要求公因数的数组一直往下除,除到不能再被整除为止,这样在短除法运算过程中产生的除数就是要求的公因数了,其中最大的就是最大公因数。

⑹ 算法设计(枚举法和迭代法)

枚举法:
求解百钱买百鸡问题:我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
迭代法:
不使用数组,输入一个50以内的正整数,求解菲波那契数列的前n项。最前2项为1,1。

⑺ 数学里的枚举法是什么意思

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举法。

枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

(7)大学计算机第七版算法设计枚举法扩展阅读:

枚举法的时间复杂度可以用状态总数*考察单个状态的耗时来表示,因此优化主要是:

1、减少状态总数(即减少枚举变量和枚举变量的值域);

2、降低单个状态的考察代价。

优化过程从几个方面考虑。具体讲

1、提取有效信息;

2、减少重复计算;

3、将原问题化为更小的问题;

4、根据问题的性质进行截枝;

5、引进其他算法。

阅读全文

与大学计算机第七版算法设计枚举法相关的资料

热点内容
好色小姨全集下载 浏览:532
宅男在线观看电影 浏览:863
韩国演员朱艺彬图片 浏览:42
从现代买物资到民国小说 浏览:865
我的世界起床大作战服务器地址 浏览:666
翠微居合集百度云 浏览:524
程序员和数字有关系吗 浏览:99
美团收款机出现命令模式 浏览:501
《惊变》高清完整版 浏览:514
java减月份 浏览:63
实变函数与泛函分析基础pdf 浏览:978
在知网下载pdf格式 浏览:392
男的送快递的电影叫什么名字 浏览:647
苹果电脑信任app在哪里设置 浏览:894
当设计师撞程序员 浏览:549
1080p蓝光超清画质影视 浏览:15
ftp是属于什么服务器 浏览:500
素食主义者磁力 浏览:962
免费vip会员电视剧的网址 浏览:718
程序员懂修电脑吗 浏览:309