考算法目的
① 算法分析的目的是什么
回答如下:
目的是评价算法的效率,通过评价可以选用更加好更加适合的算法来完成。
② 关于考北京大学计算机系研究生的~~了解的帮帮忙啊
北京大学数学科学学院考研考试参考书和考试要求
考试科目编号:
01 数学分析 02 高等代数
03 解析几何 04 实变函数
05 复变函数 06 泛函分析
07 常微分方程 08 偏微分方程
09 微分几何 10 抽象代数
11 拓扑学 12 概率论
13 数理统计 14 数值分析
15 数值代数 16 信号处理
17 离散数学 18 数据结构与算法
01 数学分析 ( 150 分)
考试参考书 :
1. 方企勤等,数学分析(一、二、三册) 高教出版社。
2. 陈纪修、于崇华、金路,数学分析 ( 上、下册 ) ,高教出版社。
02 高等代数 ( 100 分)
考试参考书:
1. 丘维声 , 高等代数 ( 第二版 ) 上册、下册,高等教育出版社, 2002 年 , 2003 年。
高等代数学习指导书(上册), 清华大学出版社, 2005 年。
2. 蓝以中,高等代数简明教程(上、下册),北京大学出版社, 2003 年(第一版第二次印刷)。
03 解析几何 ( 50 分)
考试参考书:
1. 丘维声,解析几何(第二版),北京大学出版社,(其中第七章不考)。
2. 吴光磊,田畴,解析几何简明教程,高等教育出版社, 2003 年。
04 实变函数 ( 50 分)
考试参考书:
1. 周民强,实变函数论, 北京大学出版社, 2001 年。
05 复变函数 ( 50 分)
考试参考书:
1. 方企勤,复变函数教程,北京大学出版社。
06 泛函分析 ( 50 分)
考试参考书:
1. 张恭庆、林源渠,泛函分析讲义(上册),北京大学出版社。
07 常微分方程 ( 50 分)
考试参考书:
1. 丁同仁、李承治,常微分方程教程,高等教育出版社。
2. 王高雄、周之铭、朱思铭、王寿松,常微分方程(第二版),高等教育出版社。
3. 叶彦谦,常微分方程讲义(第二版)人民教育出版社。
08 偏微分方程 ( 50 分)
考试参考书:
1. 姜礼尚、陈亚浙,数学物理方程讲义(第二版),高等教育出版。
2. 周蜀林,偏微分方程,北京大学出版社。
09 微分几何 ( 50 分)
考试参考书:
1. 陈维桓,微分几何初步, 北京大学出版社(考该书第 1-6 章)。
2. 王幼宁、刘继志, 微分几何讲义,北京师范大学出版社。
10 抽象代数 ( 50 分)
考试参考书:
1. 丘维声 , 抽象代数基础,高等教育出版社, 2003 年。
2. 聂灵昭、丁石孙,代数学引论(第一、二、三、四、七章,第八章第 1 、 2 、 3 节),高等教育出版社, 2000 年第二版。
11 拓扑学 ( 50 分)
考试参考书:
1. 尤承业,基础拓扑学讲义,北京大学出版社, 1997 年(考该书第1 - 3章)。
12 概率论 ( 50 分)
考试参考书:
1. 何书元, 概率论 北京大学出版社 , 2006 年。
2. 汪仁官, 概率论引论 北京大学出版社 , 1994 年。
13 数理统计 ( 50 分)
考试参考书:
1. 陈家鼎、孙山泽、李东风、刘力平编,数理统计学讲义(第二版),高等教育出版社, 2006 年。
14 数值分析 ( 50 分)
考试参考书:
1. 关治、陈景良,数值计算方法,清华大学出版社。
2. 蒋尔熊等,数值逼近,复旦大学出版社。
3. 王仁宏,数值逼近,高教出版社。
4. 周铁、徐树方、张平文、李铁军 计算方法,清华大学出版社出版。
15 数值代数 ( 50 分)
考试参考书:
1. 徐树方、高立、张平文,数值线性代数,北京大学出版社, 2000 年。
2. G. W. Stewart, Introction to Matrix Computation, Academic Press, New York , 1973. (有中译本)
16 信号处理 ( 50 分)
考试参考书:
1. 程乾生,数字信号处理,北京大学出版社 ,2003 年。
2. 奥米海姆 R.W. 谢费,数字信号处理,科学出版社, 1980 年。
17 离散数学 ( 50 分)
考试参考书:
1. 屈婉铃等,离散数学教程,北京大学出版社, 2002 年。
18 数据结构与算法 ( 50 分)
考试参考书:
1 .张乃孝主编,算法与数据结构—— C 语言描述,高等教育出版社 2002 年。
2. 张乃孝、裘宗燕,数据结构— C++ 与面向对象程序设计,高教出版社 1998 年。
3. 严蔚敏、吴伟民,数据结构( C 语言版),清华大学出版社 1996 年。
4. 裘宗燕,从问题到程序,机械工业出版社, 2005 年。
5. B. Stroustrup , C++ 程序设计语言 , 中译本:机械工业出版社, 2002 年。
说明
算法与数据结构是信息科学和计算机理论的核心内容,是一门理论和实际紧密结合的课程。通过考试主要目的是检查学生是否较全面地理解算法和数据结构的概念、掌 握各种数据结构与算法的实现方式,能够分析和比较不同数据结构和算法的特点。同时检查学生使用学习的知识解决问题的能力和程序设计的能力。
主要考试形式:
考概念——是非题、选择题、填空题、简答题形式
考存储表示——定义类型和变量、画存储示意图、 根据要求选择并构造存储表示
考算法思想——问答题、画算法执行示意图
考算法设计——算法理解、填充、改错;编程序
考算法分析——计算题或证明题
这上面说不完全,最好能去问问专业的教育机构,比如盛世清北啥的,他们口碑还不错。
③ 吉林高考数学考算法吗
要考。
根据所在地区有所不同,算法是新课标高老的必考内容,高考对于算法初步的考查常在于法步骤和程序框图及三种基本逻辑结构、基本算法语句、算法案例中,一一般出现在选择题或填空题中。
④ 面试笔试中让设计一种算法,是不是必须要写出代码来啊
一般面试考算法会考察你几个方面
1. 如果考官觉得你基础知识不错,考算法一般就是看你对一些常见知道的熟练程度,是否会灵活运用。就是看你有没有解决一个新问题的能力。一般伪代码说想法就行,一般会较难的问题。
2. 若觉得你的基础知识不行,可能目的就是探查你有没有基础的代码能力了。因为有很多人能说,但是不能写,哈哈。
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”为它们的最长公共子序列。不难证明有以下性质:
(
⑥ 数据分析笔试为什么考算法
数据分析笔试考算法是因为实际业务中复杂算法场景例如商品推荐、内容推荐、匹配策略等,都需要数据分析师做大量的探索验证工作。数据分析师需要学习统计学、编程能力、数据库、数据分析方法、数据分析工具等内容,还要熟练使用Excel,至少熟悉并精通一种数据挖掘工具和语言,具备撰写报告的能力,还要具备扎实的SQL基础。
⑦ 计算机二级选择题干货(五)——数据结构和算法
1、线性表、栈和队列等数据结构所表达和处理的数据以线性结构为组织形式。栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称后进先出表(Last In First Out);队列可看作是插入在一端进行,删除在另一端进行的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。在队列中,只能删除队头元素,队列的最后一个元素一定是最新入队的元素。因此队列又称先进先出表(First In First Out)。
2、栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除。二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种"后进先出"的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种"先进先出"的线性表。
3、栈是一种特殊的线性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。所以栈又称先进后出表(FILO-First In Last Out)。线性表可以顺序存储,也可以链式存储,而栈是一种线性表,也可以采用链式存储结构。
4、栈和队列都是一种特殊的操作受限的线性表,只允许在端点处进行插入和删除。二者的区别是:栈只允许在表的一端进行插入或删除操作,是一种"后进先出"的线性表;而队列只允许在表的一端进行插入操作,在另一端进行删除操作,是一种"先进先出"的线性表。
5、在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
top=0表示栈空,top=50表示栈满。入栈操作首先将top加1,然后将新元素插入到top指针指向的位置;退栈操作首先将top指针指向的元素赋给一个指定的变量,然后将top减1。栈顶指针top动态反映了栈中元素的变化情况。
6、栈是一种先进后出的线性表,栈实际上也是线性表,只不过是一种特殊的线性表。队列是指允许在一端进行插入、而在另一端进行删除的线性表,队列是一种"先进先出"或"后进后出"的线性表
队列是指允许在一端进行插入、而在另一端进行删除的线性表。它又称为"先进先出"或"后进后出"的线性表,体现了"先来先服务"的原则。
7、带链的队列也是线性链表,在线性链表中指向线性表中的第一个结点的指针称为头指针,头指针为NULL或0时称为空表,指向队尾元素的指针称为尾指针。队列在队尾插入元素,称为入队运算;在队头删除元素,称为退队运算。带链队列在开辟存储空间时,可以按照存储空间地址增大的方向开辟,也可以按照存储空间地址减少的方向开辟。
8、所谓循环队列,就是将队列存储空间的最后一个位置绕到第1个位置,形成逻辑上的环状空间,供队列循环使用。所以循环队列还是属于线性结构。循环队列的头指针front指向队列的第一个元素的前一位置,队尾指针rear指向队列的最后一个元素,循环队列的动态变化需要头尾指针共同反映循环队列的长度是:(sq.rear-sq.front+maxsize)%maxsize,所以循环队列的长度是由队头和队尾指针共同决定的
在循环队列中,用队尾指针rear指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置。
循环队列主要有两种基本运算:入队运算与退队运算。每进行一次入队运算,队尾指针就进一。每进行一次退队运算,排头指针就进一。当rear或front的值等于队列的长度+1时,就将rear或front的值置为1。一般情况下,rear大于front,因为入队的元素肯定比出队的元素多。特殊的情况是rear到达数组的上限之后又从数组的低端开始,此时,rear是小于front的。
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在实际应用中,队列的顺序存储结构一般采用循环队列的形式。因此,循环队列不是队列的一种链式存储结构。循环队列是一种存储结构,因此循环队列是一种物理结构,而不是逻辑结构。循环队列是队列的顺序存储结构,因此循环队列是线性结构。
9、循环队列不同于循环链表,循环队列是顺序存储结构,循环链表是链式存储结构。双向链表是链式存储结构,其中每个结点都有左指针和右指针,不同于二叉树结点的左子树指针和右子树指针。非线性结构和线性结构是数据的逻辑结构,顺序和链式是数据的存储结构,例如二叉树是非线性结构,也可以按照层序进行顺序存储。
10、非线性结构的逻辑特征是一个结点元素可能对应多个直接前驱和多个后驱。常见的非线性结构有:树(二叉树等),图(网等)。
11、由于二叉树的存储结构中每一个存储结点有两个指针域,因此,二叉树的链式存储结构也称为二叉链表,二叉链表属于非线性结构。
12、遍历是指不重复的访问所有结点。线性单链表每个结点只有一个指针域,由这个指针只能找到后件结点,但不能找到前件结点。双向链表中的每个结点设置两个指针,左指针指向其前件结点,右指针指向其后件结点。循环链表中增加了一个表头结点,循环链表中的所有结点的指针构成了一个环状链。二叉链表即二叉树的链式存储结构,每个存储结点有两个指针域,左指针域指向该结点的左子结点的存储地址,右指针域指向该结点的右子结点的存储地址。
13、线性表的顺序存储结构具有两个基本特点:(1)线性表中所有元素所占的存储空间是连续的;(2)线性表中各元素在存储空间中是按逻辑顺序依次存放的。
14、循环链表具有以下两个特点:(1)在循环链表中增加了一个表头结点,其数据域为任意或者根据需要来设置,指针域指向线性表的第一个元素的结点。循环链表的头指针指向表头结点。(2)循环链表中最后一个结点的指针域不是空,而是指向表头结点。即在循环链表中,所有结点的指针构成了一个环状链。
15、在循环链表中,只要指出表中任何一个结点的位置,就可以从它出发访问到表中其他所有的结点,而线性单链表做不到这一点。
16、根据二叉树的性质:二叉树第i(i≥1)层上至多有2i-1个结点。
17、所谓满二叉树是指这样的一种二叉树:除最后一层外,每层上的所有结点都有两个子结点。这就是说,在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第K层上有2K-1个结点,且深度为m的满二叉树有2m个结点。
18、在任意一颗树中,结点总数=总分支数目+1
19、二叉树的性质:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。本题中度为2的结点数为n,故叶子结点数为n+1个。
二叉树的性质:在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
20、在用完全二叉树表示堆,树中所有非叶子结点值均不小于其左右子树的根结点值,因此,堆顶元素必为序列的n个元素中的最大项。
21、作为一个算法,一般应具有以下几个基本特征。
可行性
确定性
有穷性
拥有足够的情报
22、计算机算法是指解题方案的准确而完整的描述
算法的有穷性,是指算法必须在有限的时间内做完,即算法必须能在执行有限个步骤之后终止。
23、希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。所以希尔排序法属于插入类排序,但它对简单插入排序做了很大的改进。
24、快速排序的基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,再分别对这两部分记录继续进行排序,以达到整个序列有序;插入排序的基本操作是指将无序序列中的各元素依次插入到已经有序的线性表中,从而得到一个新的序列;选择排序的基本思想是:扫描整个线性表,从中选出最小的元素,将它交换到表的最前面(这是它应有的位置),然后对剩下的子表采用同样的方法,直到表空为止;归并排序是将两个或两个以上的有序表组合成一个新的有序表。
25、在单链表中,增加头结点的目的是______。
头结点不仅标识了表中首结点的位置,而且根据单链表(包含头结点)的结构,只要掌握了表头,就能够访问整个链表,因此增加头结点目的是为了便于运算的实现。
26、算法分析是指对一个算法的运行时间和占用空间做定量的分析,一般计算出相应的数量级,常用时间复杂度和空间复杂度表示。分析算法的目的就是要降低算法的时间复杂度和空间复杂度,提高算法的执行效率。
27、算法是指解题方案的准确而完整的描述。但算法不等于程序,也不等于计算方法。当然,程序也可以作为算法的一种描述,但程序通常还需要考虑很多与方法和分析无关的细节问题,这是因为在编写程序时要受到计算机系统运行环境的限制。通常,程序的编制不可能优于算法的设计。作为一个算法,一般应具有可行性、确定性、有穷性、拥有足够情报四个基本特征。因此设计算法时不仅仅要考虑结果的可靠性,即不仅考虑算法结果的可行性,还要考虑步骤的确定性,时间和步骤的有穷性等。因此,算法是一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,且是明确的,此顺序将在有限的次数下终止。
28、一个算法通常由两种基本要素组成:一是对数据对象的运算和操作,二是算法的控制结构。因此设计算法时不仅需要考虑数据结构的设计,还要考虑数据的操作和运算及各操作之间的执行顺序。
29、在有向图中,若任意两个顶点都连通,则称该图是强连通图,这样的有向图的形状是环状,因而至少应有n条边。
30、当数据表A中每个元素距其最终位置不远,说明数据表A按关键字值基本有序,在待排序序列基本有序的情况下,采用插入排序所用时间最少。
31、数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构(也称数据的物理结构)。
32、假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2
(1)冒泡排序法:是一种最简单的交换类排序法,它是通过相邻数据元素的交换逐步将线性表变成有序。假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后的扫描和n/2遍的从后往前的扫描,需要比较的次数为n(n-1)/2次。
(2)简单插入排序法:在简单插入排序法中,每一次比较后最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同。在最坏情况下,简单插入排序需要n(n-1)/2次比较。
(3)简单选择排序法:对于长度为n的序列,选择排序需要扫描n-1遍,每一遍扫描均从剩下的子表中选出最小的元素,然后将该最小的元素与子表中的第一个元素进行交换。简单选择排序法在最坏情况下需要比较n(n-1)/2次。
(4)堆排序法:堆排序的方法为:①首先将一个无序序列建成堆。②然后将堆顶元素(序列中的最大项)与堆中最后一个元素交换(最大项应该在序列的最后)。在最坏情况下,堆排序需要比较的次数为。
假设线性表的长度为16,那么冒泡排序、直接插入排序、简单选择排序都需要比较120次,而堆排序需要比较64次。
33、对于长度为n的线性表,在最坏的情况下,快速排序所需要的比较次数为n(n-1)/2;冒泡排序所需要的比较次数为n(n-1)/2;直接插入排序所需要的比较次数为n(n-1)/2;堆排序所需要的比较次数为。
34、在进行顺序查找过程中,如果线性表中的第一个元素就是被查找元素,则只需做一次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后一个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行比较,这是顺序查找的最坏情况。所以对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
35、二分法查找只适用于顺序存储的有序表。在此所说的有序表是指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等)。
二分法检索要求线性表结点按关键值排序且以顺序方式存储。在查找时,首先与表的中间位置上结点的关键值比较,若相等则检索成功;否则根据比较结果确定下一步在表的前半部分或后半部分继续进行。二分法检索的效率比较高,设线性表有n个元素,则最多的检索次数为大于log2n(2为底数)的最小整数,最少的检索次数为1。
36、一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等存储结构。而采用不同的存储结构,其数据处理的效率是不同的。
37、顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素,链式存储结构中各数据结点的存储序号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。两者都可以存储线性的、有序的逻辑结构,顺序结构使用的是连续物理空间,链式结构可以使用零散的物理空间存储,链式结构更灵活,不存在谁节约空间的说法
38、顺序存储结构中,数据元素存放在一组地址连续的存储单元中,每个数据元素地址可通过公式LOC(ai)=LOC(a1)+(i-1)L计算得到,从而实现了随机存取。对于链式存储结构,要对某结点进行存取,都得从链的头指针指向的结点开始,这是一种顺序存取的存储结构。
39、链式存储结构克服了顺序存储结构的缺点:它的结点空间可以动态申请和释放;它的数据元素的逻辑次序靠结点的指针来指示,不需要移动数据元素。故链式存储结构下的线性表便于插入和删除操作。
40、线性表的顺序存储结构的存储空间只用于存放结点数据,而链式存储结构的存储空间不仅要存放结点数据,还要存放数据的指针,所以线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
41、在进行顺序查找过程中,如果线性表中的第1个元素就是被查找元素,则只需做一次比较就查找成功,查找效率最高;但如果被查找的元素是线性表中的最后一个元素,或者被查找的元素根本就不在线性表中,则为了查找这个元素需要与线性表中所有的元素进行较,这是顺序查找的最坏情况。所以对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次
42、对于长度为n的有序线性表,在最坏情况下,二分查找只需要比较 次,而顺序查找需要比较n次。二分法查找只适用于顺序存储的有序表,如果采用链式存储结构,也只能用顺序查找,所以,对长度为n的有序链表进行查找,最坏情况下需要的比较次数为n
43、根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构与非线性结构。
44、如果一个非空的数据结构满足下列两个条件:(1)有且只有一个根结点;(2)每一个结点最多有一个前件,也最多有一个后件。则称该数据结构为线性结构,又称线性表。
45、有一个以上根结点的数据结构肯定是非线性结构,循环链表、双向链表是线性结构;线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。
46、在链表中,如果有两个结点的同一个指针域的值相等,则该链表一定是非线性结构
47、线性表的链式存储结构称为线性链表,为了适应线性表的链式存储结构,计算机存储空间被划分为一个一个小块,每一小块占若干字节,通常称这些小块为存储结点。每一个存储结点分为两部分:一部分用于存储数据元素的值,称为数据域;另一部分用于存放下一个数据元素的存储序号,即指向后件的结点,称为指针域。在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致。为了要在线性链表中插入一个新元素,首先要给该元素分配一个新结点,以便用于存储该元素的值,然后将存放新元素值的结点链接到线性表中指定的位置。在线性链表的插入过程中不发生数据无素移动的现象,只需改变有关结点的指针即可,从而提高了插入的效率。为了在线性链表中删除包含指定元素的结点,首先要在线性链表中找到这个结点,然后将要删除结点放回到可利用栈。在线性链表中删除一个元素后,不需要移动表的数据元素,只需改变被删元素所在结点的前一个结点的指针域即可。因此,进行插入与删除时,不需要移动表中的元素。
48、在先左后右的原则下,根据访问根结点的次序,二叉树的遍历可以分为3种:前序遍历、中序遍历和后序遍历。
前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先访问根结点,然后遍历左子树,最后遍历右子树;并且遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
后序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后遍历右子树,最后访问根结点;并且遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。
二叉树的中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。
49、链表有线性链表,也有非线性链表。线性链表和二叉树链表的结点都有两个指针域,前者是线性结构,后者是非线性结构。线性单链表中的结点只有一个指针,叶子结点一般是对树结构而言,树结构是非线性结构,不是线性表。
50、算法的复杂度主要包括时间复杂度和空间复杂度:算法在运行过程中需辅助存储空间的大小称为算法的空间复杂度;算法的时间复杂度是指执行算法所需要的计算工作量,即算法执行过程中所需要的基本运算次数,为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。二者没有直接关系。
51、一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。一个算法所占用的存储空间包括程序所占的空间、输入的初始数据所占的存储空间以及算法执行过程中所需要的额外空间。其中额外空间包括算法程序执行过程中的工作单元以及某种数据结构所需要的附加存储空间。如果额外空间相对于问题规模来说是常数,则称该算法是原地(in place)工作的。
52、我们通常用时间复杂度和空间复杂度来衡量算法效率,算法的时间复杂度是指执行算法所需要的计算工作量;算法所执行的基本运算次数与问题的规模有关,而一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间;一般来说,一种数据的逻辑结构根据需要可以表示成多种存储结构。
所谓算法的时间复杂度,是指执行算法所需要的计算工作量。为了能够比较客观地反映出一个算法的效率,在度量一个算法的工作量时,不仅应该与所使用的计算机、程序设计语言以及程序编制者无关,而且还应该与算法实现过程中的许多细节无关。为此,可以用算法在执行过程中所需基本运算的执行次数来度量算法的工作量。
53、子程序调用是一种层次关系,子程序调用功能模块,调用功能模块的个数也不确定,可以是一个,也可以是多个。二叉树是一种很有用的非线性结构,二叉树不同于树形结构。二叉树具有以下两个特点:①非空二叉树只有一个根结点;②每一个结点最多有两棵子树,且分别称为该结点的左子树与右子树。选项D规定每个结点只能有两个后件。在子程序调用中,调用的功能模块可以是多个,可以调用超过两个功能模块。
54、结构图的深度表示控制的层数结构图的深度表示控制的层数
55、数据结构是指反映数据元素之间关系的数据元素集合的表示。更通俗地说,数据结构是指带有结构的数据元素的集合。所谓结构实际上就是指数据元素之间的前后件关系。线性结构与非线性结构都可以是空的数据结构。一个空的数据结构究竟是属于线性结构还是属于非线性结构,还要根据具体情况来确定。如果对该数据结构的运算是按线性结构的规则来处理的,则属于线性结构;否则属于非线性结构。
⑧ 在计算机中算法有什么作用
在计算机中算法的作用:计算机中使用的其他技术离不开算法的支撑,而且只有把算法和其他技术有效的结合起来,才能使计算机解决问题的能力最大化,最后达到1+1>2的效果。
计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述。
计算机不能做到无限快,存储也不是免费的,为了提高解决问题的效率,必须研究算法,同时,解决同一个问题的各种不同算法的效率常常相差非常大,这种效率上的差距影响往往比硬件和软件方面的差距还要大。
(8)考算法目的扩展阅读:
计算机中算法特点:
1、有穷性。一个算法应包含有限的操作步骤,而不能是无限的。事实上“有穷性”往往指“在合理的范围之内”。如果让计算机执行一个历时1000年才结束的算法,这虽然是有穷的,但超过了合理的限度,人们不把他视为有效算法。
2、确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。算法中的每一个步骤应当不致被解释成不同的含义,而应是十分明确的。也就是说,算法的含义应当是唯一的,而不应当产生“歧义性”。
3、有零个或多个输入、所谓输入是指在执行算法是需要从外界取得必要的信息。
4、有一个或多个输出。算法的目的是为了求解,没有输出的算法是没有意义的。
5、有效性。 算法中的每一个 步骤都应当能有效的执行。并得到确定的结果。
⑨ 算法怎么就这么难
推荐书籍:数据结构与算法分析:C语言描述
可以多看书多做题哦,或者关注我们的v信宫仲号《ACM算法日常》,有很多算法学习的资料~
⑩ bat校招为什么喜欢考算法和数据结构知乎
因为算法和数据结构是软件最重要的基础,好的软件需要好的算法和数据结构,不是用现成的控件或框架一堆就可以的。