NOIP高中信息技术竞赛资料数据结构
NOIP初赛复习(九)数据结构基础
NOIP初赛复习(九)数据结构基础展开全文定期推送信息学新闻,竞赛自主招生,信息学专业知识,信息学疑难解答,融科教育信息学竞赛培训等诸多优质内容的微信平台,欢迎分享文章给你的朋友或者朋友圈!算法 + 数据结构=程序算法通常是决定程序效率的关键,但一切算法最终都要在相应的数据结构上实现。
数据结构是计算机存储、组织数据的方式,是指相互之间存在一种或多种特定关系的数据元素的集合。
许多算法的精髓就是在于选择了合适的数据结构作为基础。
选择数据结构的考虑要素:1、数据结构要适应问题的状态描述。
在程序中,要涉及到状态的存储、转换等。
选择的数据结构必需先适用于描述状态,并使对状态的各种操作能够明确地定义在数据结构上。
2、数据结构应与所选择的算法相适应。
数据结构是为算法服务的,其选择要充分考虑算法的各种操作。
数据结构对算法的影响:1、数据结构的存储能力。
如果数据结构存储能力强、存储信息多,算法将会较好设计。
反之对于过于简单的数据结构,可能就要设计一套比较复杂的算法了。
在这一点上,经常体现时间与空间的矛盾。
2、定义在数据结构上的操作。
“数据结构”一词之所以不同于“变量”,主要在于数据结构上定义了基本操作,这些操作就好比工具,有了好的工具,算法设计也会比较轻松。
数据结构根据数据元素之间关系的不同特性,通常可以归类为下列四类基本结构:(1)集合结构:元素间关系仅是同属一个集合。
(2)线性结构:元素间存在一对一的关系。
(3)树形结构:元素间的关系是一对多的关系。
(4)图形结构:元素间的关系是多对多的关系。
一、线性结构线性结构是N个数据元素构成的有限序列。
线性结构存储方式分为顺序存储结构和链式存储结构两种。
顺序存储结构平时使用的数组就是这种结构,比如Pascal:a:[1..100]oflongint; C++:int a[100]。
当需要在顺序存储的线性表中插入一个数据元素时,需要顺序移动后续的元素以“腾”出某个合适的位置放置新元素。
学科竞赛-信息学奥林匹克教程(数据结构篇)
信息学奥林匹克教程(数据结构篇)《信息学奥林匹克教程(数据结构篇) 奥赛经典高级教程系列(奥赛经典高级教程系列)》内容简介为了进一步推广、普及计算机技术,提高竞赛水平,在原来编写的一套《信息学奥林匹克教程》(基础篇·提高篇·语言篇)的基础了,我们又编写了这本《数据结构篇》。
《数据结构篇》主要帮助学生全面地掌握数据结构知识与应用技巧,相对于其他数据结构书不同之处就在于增加了一些针对性的例题和习题,着眼点是提高数据结构的应用方法与技巧,是一本具有实战意义的教材。
从逻辑角度看,数据可归结为三种基本结构:线性结构、树结构和图结构;从存储角度看,数据可归结为四种基本结构:顺序结构、链接结构、索引结构和散列结构。
每一种逻辑结构可根据不同需要采用不同的存储结构,或者不同的存储结构的组合。
数据的逻辑结构和存储结构确定后,再结合指定运算的算法,就容易利用一种程序设计语言编写出程序。
通过数据结构的学习,能够大大提高程序设计能力和水平。
《数据结构篇》是为广大信息学爱好者学习数据结构而精心编著的一本教材。
本书内容比较全面,着重于实用与实战,在算法分析上简明扼要,细致清晰,便于自学。
全书共分十章:第一章为概论,它为学习以后的各章做准备;第二章至第五章为线性结构;第六章和第七章分别为树结构和图结构,分别讨论了每一种逻辑结构所对应的存储结构和相应的算法;第八章和第九章分别为查找与排序,它包含了数据处理中主要使用的几种查找和内排序方法;最后一章为读者提供了检测知识的模拟试题及解答。
作者简介向期中,长郡中学特级教师,湖南省计算机学会理事,国际金牌教练,国家教育部计算机课程咨询委员会委员。
对中小学计算机教育事业有一种执着的追求,参加工作20年来,一直以“当一流教师,办一流教育,出一流人才”为自己的工作目标,对中小学计算机教学和青少年信息学奥林匹克竞赛的辅导倾注了全部热情和心血。
在信息学奥林匹克竞赛培训中把“先做人,后成才”的育人理念贯穿到整个奥赛培训的始终,学生在愉快的学习中取得了一个个辉煌的成绩:在近几年的信息学奥林匹克竞赛中,辅导的学生有100多人获湖南省一等奖,11人次进入国家集训队,3人进入国家代表队,3人获国际金牌。
信息学奥赛NOIP数据结构链表、堆
删除结点
//删除结点9 p->nextNode=q; q->prevNode=p; //讨论 如果要删除的是头结点,如何处理? 如果要删除的是尾结点,如何处理?
循环链表
将单链表中的尾节点的指针域由NULL改为指向 头结点,使整个单链表形成一个环,这种头尾相 接的单链表就可以称之为**单循环链表,简称循 环链表(circular linked list)。
创建链表
person * initLink(int n){ person * head=(person*)malloc(sizeof(person)); head->number=1; head->next=NULL; person * cyclic=head;//cyclic环尾 for (int i=2; i<=n; i++) { person * body=(person*)malloc(sizeof(person)); body->number=i; body->next=NULL; cyclic->next=body; cyclic=cyclic->next; } cyclic->next=head;//首尾相连 return head;
删除一个结点
node *delete_node(node *head, int pos)//删除节点 {node *item = NULL;
node *p = head->next; if (p = NULL) { printf("link is empty!");
return NULL; } p = search_node(head, pos - 1);//获得位置pos节点的指针 if (p != NULL&&p->next != NULL) {
NOIP 初赛复习(数据结构)
续的存储单元里的方法。
序列: a1,a2,a3,a4
a1 a2
b b+ l
a3 b+ (2-1)*l L :表示每个元素所占字节数目 练习: 一个向量第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是 a4 地址: b+ (3-1)*l ( B ) 元素所占的第一个单元 A) 110 的存储地址 100 D) 109 B) 108 C)
思考: 满二叉树第I(I>=1)层上的结点数目为( 2i-1 )
k 深度为k的满二叉树有( 2 -1 ) 个结点(k≥1)
二叉树的几种特殊情形
(2) 完全二叉树(Complete BinaryTree) 若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最 下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完 全二叉树。 特点: (1) 满二叉树是完全二叉树,完全二叉树不一定是满二叉树。 (2) 在满二叉树的最下一层上,从最右边开始连续删去若干结点后得 到的二叉树仍然是一棵完全二叉树。 (3) 在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子, 即该结点必是叶结点。
已知队列(13,2,11,34,41,77,5,7,18,26,15),第 一个进入队列的元素是13,则第五个出队列的元素是( B )。 A)5 B)41 C)77 D)13 E)18
线性结构
(1) 一维数组: 向量
N 向量
(2) 多维数组
1. 矩阵的存储
个 行 向 量
a11 a12 …… a1n a21 a22 …… a2n a31 a32 …… a3n am1am2 …… amn
树形结构
(1) 二叉树的递归定义 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0), 或者由一个根结点及两棵互不相交的、分别称作这个根的左子树 右子树 左子树和右子树 左子树 的二叉树组成。 (2)二叉树的五种基本形态 (2)二叉树的五种基本形态 二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树 皆为空。 二叉树的五种基本形态如下图所示。 思考: 三个结点的二叉树有几种?
NOIP基础数据结构_哈希、并查集
your site here
•解决冲突方法有多种,最常见的有“拉链 法”和“线性探测法”。下面主要讲解这 两种hash表的实现方法。
LOGO
哈希表(hash)
hash表的拉链法实现图示
•Key2与keyN冲突
your family site
your site here
Key1 Key2 Key3 . . . KeyN
hash表的拉链法实现pascal版
const
your family site
//注:本程序用数组模拟指针法编程
maxN = 1000000; maxM = 2000003; //大质数,通常 maxM > 2*maxN
type
Tnode =record x, c :longint; next :longint; end; //记录读入数据x和计数器c //用数组模拟指针,next是下一个元素下标
your family site
your site here
LOGO
哈希表(hash)
hash表的拉链法实现pascal版
begin
your family site
assign(input,'expa.in'); reset(input); assign(output,'expa.out'); rewrite(output); readln(n); for i:=1 to n do
your family site
your site here
•hash的思想是能直接找到需要的元素,因此必须 在元素的存储位置和它的关键字之间建立一确定 的对应关系f,使每个关键字和存储结构中一个( 几乎)唯一的存储位置相对应。
2023noip大纲
2023年NOIP大纲2023年NOIP大纲是我国青少年信息学奥林匹克系列竞赛的重要参考资料,为广大参赛选手提供了明确的竞赛方向和复习目标。
相较于往年,2023年NOIP大纲在保留经典题型和知识点的基础上,进行了一定程度的更新和调整,以适应信息学竞赛的发展趋势。
以下为2023年NOIP大纲的主要内容概述。
一、基础知识1. 计算机硬件基础:包括计算机组成原理、操作系统、计算机网络、数据结构与算法等方面的基础知识。
2. 编程语言:掌握C、C++、Pascal等编程语言的基本语法和常用库函数,了解Java、Python等编程语言的初步知识。
3. 算法与数据结构:熟练掌握常见的算法(如排序、查找、图算法等)和数据结构(如数组、链表、栈、队列、树、图等)及其应用。
4. 数学基础:具备较强的数学能力,熟悉组合数学、离散数学、线性代数等数学知识,并能运用数学方法解决实际问题。
二、编程技能1. 代码实现:能够熟练地编写代码实现各种算法和数据结构,具备良好的编程风格。
2. 算法优化:了解算法的时间复杂度和空间复杂度,能够对算法进行优化和改进。
3. 编程策略:掌握常见的编程策略(如贪心、分治、动态规划等),能够在实际问题中灵活运用。
4. 代码调试:具备较强的代码调试能力,能够快速定位和解决程序中的错误。
三、题目类型1. 选择题:涵盖计算机基础知识、编程语言、算法与数据结构、数学等方面。
2. 填空题:考察选手对基础知识、编程技能的掌握程度,以及解决实际问题的能力。
3. 解答题:主要考察选手的算法设计、代码实现和编程策略运用能力,以及数学知识和实际问题解决能力。
4. 编程实践:考察选手在限定时间内完成实际问题编程的能力,侧重于算法应用和代码实现。
四、考试要求1. 掌握C、C++、Pascal其中一种编程语言。
2. 熟悉计算机基础知识、算法与数据结构、数学等方面的内容。
3. 具备较强的编程实践能力,能够熟练地编写、调试代码。
NOIP高中信息技术奥赛资料第二章---数据类型剖析.
在C语言中,字符型数据有以下特点: 字符型数据只能用单引号括起来,不能用双引号或其
它括号。 字符型数据只能是单个字符,不能是字符串。 字符可以是字符集中任意字符。但数字被定义为字符
型之后就不能参与数值运算。如'5'和5 是不同的。'5' 是字符型数据,不能参与运算。
1.十进制整数转换为二进制整数
十进制整数转换为二进制整数采用“除2取余, 逆序排列”法。具体做法是:用2去除十进制整 数,可以得到一个商和余数;再用2去除商,又 会得到一个商和余数,如此进行,直到商为0时 为止,然后把先得到的余数作为二进制数的低位 有效位,后得到的余数作为二进制数的高位有效 位,依次排列起来。
注意,必须有小数点。
2) 指数形式 由十进制数,加阶码标志“e”或“E”以及阶码 (只能为整数,可以带符号)组成。其一般形 式为:
a E n(a为十进制数,n为十进制整数) 其值为 a*10n。如: 2.1E5 (等于2.1*105) 3.7E-2 (等于3.7*10-2) 0.5E7 (等于0.5*107) -2.8E-2 (等于-2.8*10-2)
2) 八进制数 八进制数必须以0开头,即以0作为八进制数的前缀。 数码取值为0~7。八进制数通常是无符号数。 以下是合法的八进制数:015(十进制为13)、0101(十 进制为65)、0177777(十进制为65535); 以下是不合法的八进制数:256(无前缀0)、03A2(包 含了非八进制数码)、-0127(出现了负号)。 3) 十六进制数 十六进制数的前缀为0X或0x。其数码取值为0~9, A~F或a~f。 以下是合法的十六进制数:0X2A(十进制为42)、 0XA0 (十进制为160)、0XFFFF (十进制为65535); 以下是不合法的十六进制数:5A (无前缀0X)、0X3H (含有非十六进制数码)。
NOIP高中信息技术奥赛资料第二章---数据类型
几乎所有编程语言,包括C语言,都会 有三种基本的程序结构: 顺序结构、选择结构和循环结构。
顺序结构
顺序结构就是一条一条地从上到下执行语句, 所有的语句都会被执行到,执行过的语句不会 再次执行。
选择结构
选择结构就是根据条件来判断执行哪些语句, 如果给定的条件成立,就执行相应的语句,如 果不成立,就执行另外一些语句。
3、变量定义必须放在变量使用之前。一般放在 函数体的开头部分。
整型数据的分类
整型数据的一般分类如下: 基本型:类型说明符为int,在内存中占2个字
节。 短整型:类型说明符为short int或short。所占
字节和取值范围均与基本型相同。 长整型:类型说明符为long int或long,在内存
2) 八进制数 八进制数必须以0开头,即以0作为八进制数的前缀。 数码取值为0~7。八进制数通常是无符号数。 以下是合法的八进制数:015(十进制为13)、0101(十 进制为65)、0177777(十进制为65535); 以下是不合法的八进制数:256(无前缀0)、03A2(包 含了非八进制数码)、-0127(出现了负号)。 3) 十六进制数 十六进制数的前缀为0X或0x。其数码取值为0~9, A~F或a~f。 以下是合法的十六进制数:0X2A(十进制为42)、 0XA0 (十进制为160)、0XFFFF (十进制为65535); 以下是不合法的十六进制数:5A (无前缀0X)、0X3H (含有非十六进制数码)。
数据类型说明
常量与变量
对于基本数据类型量,按其值是否可 变又分为常量和变量两种。
在程序执行过程中,其值不发生改变 的量称为常量,其值可变的量称为变 量。它们可与数据类型结合起来分类, 例如,可分为整型常量、整型变量、 浮点常量、浮点变量、字符常量、字 符变量。
信息学竞赛中数据结构解析
信息学竞赛中数据结构解析数据结构是指数据之间的逻辑关系,是信息学奥林匹克竞赛的考纲内容之一,现就近三年在全国青少年信息学奥林匹克联赛中出现的数据结构做一个汇总。
一、栈和队列栈是限定只在一端进行插入、删除的特殊线形表,其特点是先进后出。
例1.某车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。
已知某时该车站站台为空,从这一时刻开始出入记录为:“进出进进出进进进出出进出”。
假设车辆入站的顺序为1,2,3……,则车辆出站的顺序为()。
(第10届选择题14)A、1,2,3,4,5B、1,2,4,5,7C、1,3,5,4,6D、1,3,5,6,7E、1,3,6,5,7分析:根据栈的先进后出的特点,可以将进栈和出栈分别列出。
进栈顺序:1|23|456| |7| “|”表示有出栈操作。
出栈顺序:1 3 65 7 ;故答案为:E。
例2.设栈S的初始状态为空,元素a,b,c,d,e,f,g依次入栈,以下出栈序列不可能出现的是()。
(第11届选择题20)A、a,b,c,e,d,f,gB、b,c,a,f,e,g,dC、a,e,d,c,b,f,gD、d,c,f,e,b,a,gE、g,e,f,d,c,b,a答案为:E。
例3.已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素是13,则第五个出队列的元素是()。
(第9届选择题17)A、5B、41C、77D、13E、18分析:根据队列先进先出的特点,出队和入队的顺序一致,故答案为:B。
二、二叉树二叉数是数据结构中的重点内容,在信息学奥林匹克竞赛中经常考到的内容主要有二叉数的度、叶子、高度(或深度),满二叉数、完全二叉数;二叉数的遍历有广度(宽度)遍历,深度遍历,前序、中序、后序遍历。
例1.一个高度为h的二叉树最小元素数目是()。
(第9届选择题16)A、2h+lB、hC、2^h-1D、2hE、2^(h-l)分析:高度为h的二叉数,最少的结点数是每层一个子结点,故答案为:B。
信息技术奥赛辅导数据结构(高一高二合上第一部分)
执行A块 执行B块
顺序结构
输入x,y x→a
y→x a→y 输出x,y
例如:交换两个变量
宁夏育才中学
14
结构化流程图( N-S 图)
②选择结构
满足条件否?
满足
不满足
执行A块
执行B块
③循环结构
当
While条件
型
循
循环体 环
循环体 直 到
从中可以看出,编程解决各种各样的实际问题,只学习 掌握好诸如pascal、C等程序设计语言是远远不够的, 另外还必须具备数据结构和算法的相关知识。
数据结构主要讲述客观世界中纷繁复杂的事物及其内在 的联系如何有效地在计算机中进行表示;算法主要讲解 建立在这种表示基础上的一些常用的解决实际问题的思 想、方法和步骤。二者是一个相辅相成的统一体,是缺 一不可的两个方面。有了它们以后,我们才能比较顺利 地编写程序。
பைடு நூலகம்
宁夏育才中学
5
算法
什么是“算法”?
算法是为解决一个问题而采用的方 法和步骤。
或者说,算法是解题方法的精确描 述,解决一个问题的过程就是实现一个 算法的过程。
宁夏育才中学
6
算法的特点
1. 确定性
算法的每一步都必须是明确无误的,不能含糊其辞,不能存在歧义,否则 就会使执行者无所适从。如计算”3/0”或”将3或4与X相乘”等是不允许的。
结果。”
宁夏育才中学
7
算法的描述
描述算法的方法,常用的有自然语言、程序流 程图、N-S图、类程序设计语言和程序设计语 言等。
(1)用自然语言描述算法 (2)用流程图来描述算法
信息学奥赛-数据结构
1 2
1 2
5 4
5 4
3 (a)
3 (b)
结点的度: 无向图中与结点相连的边 的数目,称为结点的度。 有向图中结点的度等于该 结点的入度和出度之和
1 2
1 2
结点的入度:在有向图中, 以这个结点为终点的有向 边的数目。
结点的出度:在有向图中, 以这个结点为起点的有向 边的数目。
5 4
5 4
3 (a)
3 (b)
图的遍历
(1)深度优先遍历 从图中某个顶点v0出发,然后 搜索V0的一个邻接点Vi,若Vi未 被访问,则访问之.再搜索Vi的 一个邻接点按此方式访问。若 某顶点的邻接点全部访问完毕, 则回到它的上一顶点,然后再 从此顶点又按深度优先的方法 搜索下去,直到访问完毕为止
深度优先遍历得到的序列为: 0->1->3->7->4->2->5->6
数据结构
数据结构是计算机存储、组织数据的方式。 数据结构是指相互之间存在一种或多种特定关系 的数据元素的集合。
通俗解释:数据相当于书. 计算机相当于书架,存放了很多书,书架分为 很多格子,书存放在不同格子(内存空间,对应一个地址),中。 为了更快的取到想要的书,要用特定的存放方式—数据结构
线性表
练习
1、二叉树T,已知其前序遍历序列为1
243
5 7 6,中序遍历序列为4 2 1 5 7 3 6,则 其后序遍历序列为( B ) 。 A. 4 2 5 7 6 3 1 C. 4 2 7 5 3 6 1 B. 4 2 7 5 6 3 1 D. 4 7 2 3 5 6 1
22
图
通俗说,各顶点用边连起来就叫做图 图和树的区别?
主要代表:树、图结构、多维数组
NOIP基础数据结构
begin new(front);
your family site
your site here
front^.next:=nil; readln(n); for i:=1 to n do begin read(x); insert(x); end; //下面是遍历链表的常用方法 t:=front^.next; while (t<>nil) do begin write(t^.v,' '); t:=t^.next; end; end.
LOGO
记录、 记录、 针、链
针
指针
•指针(point),其本质是内存的“地址”, 指针变量所保存的就是一个32位地址(对32 your family site 位操作系统而言) •指针变量要“指向有意义的地址”,指向 错误的地址很容易引起程序崩溃。通常是 指向一个其它变量的地址或用new命令来申 请一块“有意义的地址”。内存大小以机 器的可用内存为上限
C++语言 … Tperson g[100]; int main() { g[0].name =“LiHong”; g[0].age =16; g[0].weight=50.2; cout<<g[0].name<<endl; … }
LOGO
记录、 记录、 针、链
记录数组 记录数组 项访问 类 举
Pascal语言 … g:array[1..100] of Tperson; t: ^Tperson;
LOGO
your site here
记录、 记录、 针、链
针 举
C++语言 int *p1, *p2; int main() { p2=NULL; p1= new(int); *p1=32; p2=p1; cout<<*p2<<endl; return 0; }
NOIP中常用的数据结构
破坏原结构!
修改代表元素的father!
while (father[x] != x) x = father[x]; while (father[y] != y) y = father[y]; if (x != y) father[x] = y;
第26页/共35页
并查集
时间复杂度分析
仍然很高!
路径压缩!
第5页/共35页
堆
1、插入一个元素z
z yx
不关心大小,只关心位置 如何调整?
显然,x<y
情况1:z>=x 完美结束 情况2:z<x 将x和z互换位置,显然z<y, 以z为根的子树一定是堆 翻页继续!
第6页/共35页
堆
1、插入一个元素z
u
w
z
显然,u<w 情况1:z>=u 完美结束 情况2:z<u
转化为:求
x^(n+1)-1 x-1
mod p = ? (p为质数)
转化为:求(A/B) mod p = ? (p为质数)
inc(st); End;
插入一个时间为t 数值为x的数 Procedure insert(t,x:longint); begin
While (st<=ed) and (x<=a[ed.p]) do Begin
inc(ed); a[ed].p:=x; a[ed].t:=t; End; End;
第22页/共35页
第二步:做Dp for (i=1; i<=n; i++) { 往堆中插入第i时刻变成兴奋状态的药水; 往堆中删除第i时刻变成失活状态的药水; F[i]=堆中最大值+a[i]; }
NOIP信息学奥赛数据结构复习
2.二叉树 二叉树的基本形态:
二叉树也是递归定义的,其结点有左右子树之分,逻 辑上二叉树有五种基本形态:
(1)空二叉树——(a); (2)只有一个根结点的二叉树——(b); (3)右子树为空的二叉树——(c); (4)左子树为空的二叉树——(d); (5)完全二叉树——(e)
3.两种重要的树
(1)完全二叉树——只有最下面的两层结点度小于2,并且最下 面一层的结点都集中在该层最左边的若干位置的二叉树; (2)满二叉树——除了叶结点外每一个结点都有左右子女且叶 结点都处在最底层的二叉树,。
A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 4, 3, 7, 6
D. 1, 4, 3, 7, 2 E. 1, 4, 3, 7, 5
(2006)13. 设栈S的初始状态为空,元素a, b, c, d, e 依次入栈,以下出栈 序列不可能出现的有( )。
A. a, b, c, e, d
A) 2 B) 3 C) 4 D) 5
五、树
1.树的概念 树的递归定义如下:(1)至少有一个结点(称为根)(2)其它是互不 相交的子树
1.树的度——也即是宽度,简单地说,就是结点的分支数。以组成该树 各结点中最大的度作为该树的度,如上图的树,其度为3;树中度为零的 结点称为叶结点或终端结点。树中度不为零的结点称为分枝结点或非终 端结点。除根结点外的分枝结点统称为内部结点。 2.树的深度——组成该树各结点的最大层次,如上图,其深度为4;
如下图
4.二叉树的性质 (1) 在二叉树中,第i层的结点总数不超过2^(i-1); (2) 深度为h的二叉树最多有2h-1个结点(h>=1),最少有h 个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数 为2的结点总数为N2,
【精品】NOIP初赛大全(基础知识+基本算法+数据结构).docx
分区联赛初赛复习大全选择题一、硬件计算机发展可划分:1946年2月,在美国宾夕法尼亚大学诞生了世界上第一台电子计算机ENIAC (Electronic Numerical Integrator And Computer),这台计算机占地170平方米,重30吨,用了18000多个电子管,每秒能进行5000次加法运算。
冯•诺依曼理论1944年,美籍匈牙利数学家冯•诺依曼提出计算机基本结构和工作方式的设想,为计算机的诞生和发展提供了理论基础。
时至今日,尽管计算机软硬件技术飞速发展,但计算机本身的体系结构并没有明显的突破,当今的计算机仍属于冯•诺依曼架构。
其理论要点如下:1、计算机硬件设备山存储器、运算器、控制器、输入设备和输出设备5部分组成。
2、存储程序思想一一把计算过程描述为山许多命令按一定顺序组成的程序,然后把程序和数据一起输入计算机,计算机对L:存入的程序和数据处理后,输出结果。
我国的计算机发展情况•我国从1956年开始计算机的科研和教学工作;・1960年我国第一台自行设计的通用电子计算机107机诞生;・1964年我国研制成大型通用电子计算机119机;・1983年每秒运行一亿次的银河巨型计算机在国防科技大学诞生;・1992年研制成功每秒运行10亿次的“银河II ”巨型计算机;・1997年又研制成功每秒运行130亿次的“银河III”巨型计算机;・我国较有名的微型计算机殆牌有:'‘联想”、“长城”、"方正”等;微型机的主要技术指标1、字长:知己算计能够巳接处理的二进制数据的位数。
单位为位(BIT)2、主频:指计算机主时钟在一秒钟内发出的脉冲数,在很人稗度上决定了计算机的运算速度。
3、内存容量:是标志计算机处理信息能力强弱的一向技术指标。
单位为字节(BYTE) o8BIT=1BYTE 1024B二1KB 1O24KB=1MB4、外存容量:一般指软盘、硬盘、光盘。
计算机的特点:运算速度快,运算精度高,具有记忆能力,具有逻辑判断能力,具有自动控制能力; 计算机的应用:1、数值计算:弹道轨迹、天气预报、高能物理等等2、信息管理:企业管理、物资笛理、电算化等3、过程控制:工业白动化控制,卫星飞行方向控制4、辅助工程:CAD、CAM、CAT、CAI 等计算机硬件山五大部分纽成:运算器、控制器、存储器、输入设备、输出设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章绪论程序设计就是使用计算机解决现实世界中的实际问题。
对于给定的一个实际问题,在进行程序设计时,首先要把实际问题中用到的信息抽象为能够用计算机表示的数据;第二要把抽象出来的这些数据建立一个数据模型,这个数据模型也称为逻辑结构,即建立数据的逻辑结构;第三要把逻辑结构中的数据及数据之间的关系存放到计算机中,即建立数据的存储结构;最后在所建立的存储结构上实现对数据元素的各种操作,即算法的实现。
本章就是要使大家了解计算机中的数据表示,理解数据元素、逻辑结构、存储结构和算法的有关概念;掌握基本逻辑结构和常用的存储方法,能够选择合适的数据的逻辑结构和存储结构;掌握算法及算法的五个重要特性,能够对算法进行时间复杂度分析,从而选择一个好的算法,为后面的学习打下良好的基础。
1.1基本概念和术语1.数据(data):是对客观事物的符号的表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。
2.数据元素(data element):是数据的基本单位,在计算机程序中通常作为一个整体来处理。
一个数据元素由多个数据项(data item)组成,数据项是数据不可分割的最小单位。
3.数据结构(data structure):是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构是一个二元组,记为:data_structure=(D,S).其中D为数据元素的集合,S是D上关系的集合。
数据元素相互之间的关系称为结构(structure)。
根据数据元素之间关系的不同特性,通常由下列四类基本结构:(1)集合:数据元素间的关系是同属一个集合。
(图1)(2)线性结构:数据元素间存在一对一的关系。
(图2)(3)树形结构:结构中的元素间的关系是一对多的关系。
(图3)(4)图(网)状结构:结构中的元素间的关系是多对多的关系。
(图4)图1 图2图3 图41.2 数据的逻辑结构和物理结构1.逻辑结构:数据元素之间存在的关系(逻辑关系)叫数据的逻辑结构。
即上面给出的四种结构。
2.物理结构:数据结构在计算机中的表示(映象)叫数据的物理结构,又称存储结构。
一种逻辑结构可映象成不同的存储结构:顺序存储结构和非顺序存储结构(链式存储结构和散列结构)。
1.3算法及算法分析1. 算法:是对特定问题求解步骤的一种描述,是指令的有限序列。
一个算法是一系列将输入转换为输出的计算步骤。
2. 算法的重要特性①输入:一个算法应该有零个或多个输入。
②有穷性:一个算法必须在执行有穷步骤后正常结束,而不能形成无穷循环。
③确定性:算法中的每一条指令必须有确切的含义,不能产生多义性。
④可行性:算法中的每一条指令必须是切实可执行的,即原则上可以通过已经实现的基本运算执行有限次来实现。
⑤输出:一个算法应该有一个或多个输出,这些输出是同输入有某个特定关系的量。
3. 算法的时间复杂度①定义:设问题的规模为n,把一个算法的时间耗费T(n)称为该算法的时间复杂度,它是问题规模为n的函数。
②算法的渐进时间复杂度设T(n)为一个算法的时间复杂度,如果当n趋向无穷大时T(n)与函数f(n)的比值的极限是一个非零常数M,即记作T(n)=O(f(n)),则称O(f(n))为算法的渐进时间复杂度,简称时间复杂度,也称T(n)与f(n)的数量级相同,通常,f(n)应该是算法中频度最大的语句的频度。
③常用的算法的时间复杂度的顺序O(1)<O(lgn)<O(n)<O(n·lgn)<O(n2)<O(n3)<…<O(2n)④算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。
例如:在数组A[0...n-1]中查找给定值K的算法如下:(1)i=n-1;(2)while(i>=0&&(A[i]!=k))(3) i--;(4)return i;此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关:若A中没有与K相等的元素,则语句(3)的频度f(n)=n;若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。
⑤最坏时间复杂度和平均时间复杂度最坏情况下的时间复杂度称为最坏时间复杂度。
一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何情况下更长。
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
例1求下列交换两个变量i和j的值的算法的时间复杂度。
(1) i=10;(2) j=20;(3) t=i;(4) i=j;(5) j=t;解:各行语句的执行次数均为1,所以该算法的时间耗费T(n)= 1+1+1+1+1=5,该算法的时间耗费T(n)与问题的规模n无关,因此,该算法的时间复杂度T(n)=O(1)。
例2求两个n阶方阵的乘积C=A×B,其算法如下,计算该时间复杂度。
程序段:(1) for(i=0; i<n; i++)(2) for(j=0; j<n; j++)(3) {c[i][j]=0;(4) for(k=0; k<n; k++)(5) c[i][j]+=a[i][k]*b[k][j];}解:解法1计算程序段中的每一行的执行次数。
第(1)行for(i=0; i<n; i++)中只考虑循环条件表达式i<n的执行次数(忽略初始化表达式i=0和修正表达式i++的执行次数,下同),表达式i<n共执行n+1次(i为0到n-1时该表达式非零,共n次,i为n时该表达式为零,共1次,合计执行n+1次),所以,第(1)行共执行n+1次;第(2)行for(j=0; j<n; j++),在第(1)行for(i=0; i<n; i++)中的表达式i<n非零时(共n次)都要执行一遍,而每一遍同样要执行n+1次,所以,第(2)行共执行n (n+1)次;第(3)行c[i][j]=0;在表达式i<n和j<n均非零时执行,共执行n2次;第(4)行for(k=0; k<n; k++)在表达式i<n和j<n均非零时执行一遍,而每一遍同样要执行n+1次,所以,第(4)行共执行n2(n+1)次;第(5)行c[i][j]+=a[i][k]*b[k][j]; 在表达式i<n、j<n和k<n均非零时执行,共执行n3次;因此,各行执行次数分别为:n+1,n(n+1),n2,n2(n+1),n3。
如果用T(n)表示该算法的时间耗费,则T(n)= n+1+n(n+1)+n2+n2(n+1)+n3=2n3+3n2+2n+1 由此可知,该算法的时间耗费T(n)是矩阵阶数n的函数,T(n)=O(n3)。
解法2只计算执行频度最高的行。
显然,在该程序段中,执行频度最高的行为c[i][j]+=a[i][k]*b[k][j]; 在表达式i<n、j<n和k<n均非零时执行,而表达式i<n、j<n和k<n均有n次非零,所以,该行共执行n3次。
因此,该算法的时间耗费T(n)是矩阵阶数n的函数,T(n)=O(n3)。
【课堂实践】分析并计算下面程序段执行的时间复杂度。
i=1; k=0;while(i<=n-1){ k+=10*i;i++;}第2章线性表线性表是最常用且最简单的一种数据结构,一个线性表是n个数据元素的有序系列,每个数据元素可以是一个数或一个符号,也可以使一页书,甚至其他更复杂的信息。
如26个字母的字母表:(A,B,C,D…..,Z)在复杂的线性表中,一个数据元素可以由若干个数据项组成,在这种情况下,常把数据元素称为一个记录,含有大量记录的线性表又称文件。
如图综合上述例子,可以将线性表描述为:线性表是由n个数据元素的有限序列(a1,a2,…,a n)组成的,其中每一个数据元素a i的具体含义可以按不同的情况和要求定义具体的内容,它可以是一个数、一个符号、一串文字,甚至是其他更复杂的信息。
线性表中数据元素的个数n称为线性表的长度。
2.1 线性表的逻辑结构及基本运算1.线性表简单的定义n个数据元素的有限序列其特点是除了表头和表尾外,表中的每一个元素有且仅有唯一的前驱和唯一的后继,表头有且只有一个后继,表尾有且只有一个前驱。
线性表中的数据元素不仅可以进行访问,还可进行插入和删除。
若n=0,则表示一个空表,即没有任何数据元素的线性表;若n>0,则除a1和a n外,有且仅有一个直接前驱和一个直接后继,即a i(其中1< i<n)是线性表中第i个数据元素,在a i之前仅有一个数据元素a i-1,而在a i之后也仅有一个数据元素a i+1。
称a1称为起始结点,a n称为终端结点,i称为a i在线性表中的序号或位置。
线性表中结点的之间的关系就是上述的邻接关系,由于该关系是线性的,我们称线性表是一种线性结构。
2.线性表的基本运算(1)线性表初始化格式:InitList(L)初始条件:线性表L不存在。
操作结果:构造一个空的线性表L。
(2)求线性表的长度格式:LengthList(L)初始条件:线性表L存在。
操作结果:返回线性表L中所有元素的个数。
(3)取表元格式:GetList(L,i)初始条件:线性表L存在,且1≤i≤LengthList(L)。
操作结果:返回线性表L的第i个元素(ai)的值。
(4)按值查找格式:LocateList(L,x)初始条件:线性表L存在,x有确定的值。
操作结果:在线性表L中查找值为x的数据元素,并返回该元素在L中的位置。
若L中有多个元素的值与x相同,则返回首次找到的元素的位置;若L中没有值为x的数据元素,返回一个特殊值(通常为-1)表示查找失败。
(5)插入操作格式:InsertList(L,i,x)初始条件:线性表L存在,i为插入位置(1≤i≤n+1,n为插入前的表长)。
操作结果:在线性表L的第i个元素(a i)位置上插入值为x的新元素,原序号为i,i+1, …,n的数据元素的序号插入后变为i+1,i+2, …,n+1,插入后表长=原表长+1。
(6)删除操作格式:DeleteList(L,i)初始条件:线性表L存在,i(1≤i≤n)为给定的待删除元素的位置值。
操作结果:在线性表L中删除序号为i的数据元素(a i),删除后,原序号为i+1,i+2, …,n的数据元素的序号变为i,i+1, …,n-1,删除后表长=原表长-1。
注:以上给出的是线性表的基本运算,并不是全部运算,其它运算可用这些基本运算来实现,这些运算都是定义在逻辑结构层次上的运算,只有确定了存储结构之后,才能具体实现这些运算。