总结是一种思辨和反思的过程,可以帮助我们深入思考问题的本质和解决方法。通过总结工作中的经验和教训,可以帮助我们更好地规划和执行下一步的工作计划。接下来是一些国内外知名企业的成功经验分享,或许能给我们带来启示。
数据结构与算法篇一
知识部分:1.数据结构的内容:
数据的存储结构:是数据的逻辑结构在存储器里的实现;
数据的运算:插入、删除、排序、查找等;2.数据的存储结构分为:顺序存储结构和链式存储结构。3.单链表与双链表的插入与删除这里不再赘述,百度一下吧!
5.串的基本运算有:链接、赋值、求长度、全等比较、求子串、求子串的位置及替换等。6.广义表:广义表是线性表的推广,也称列表。
广义表的特点:
广义表的元素可以使字表,且字表的元素还可以是字表;
广义表可以被其他广义表所共享;
广义表可以是递归的表,机本身的一个字表;
7.多维数组与稀疏矩阵的存储比较复杂,请用百度查找相关内容,不再赘述;
8.树:树并不重要,重要的知识点是二叉树,对树理解不透彻的同学,请用百度搜索。9.二叉树:
二叉树的重点内容包括:
二叉树的遍历:中序遍历、前序遍历、后续遍历;(重点考察)完全二叉树(定义):在一棵二叉树中,若最多只有最下面两层的节点数可小于2,且最下面一层的节点集中于最左边的位置,则称此二叉树为完全二叉树;树的先根次序周游对应于二叉树的前序周游(遍历),树的后根次序周游对应于二叉树的中序周游(遍历)。
10.二叉树的存储结构:链式存储结构与顺序存储结构。
二叉树的链式存储:
是指二叉树的各节点随机存储在内存空间中,节点之间的关系用指针标示;
二叉树的顺序存储:
二叉树的顺序存储就是按一定的次序,用一组地址连续的存储单元存储二叉树的节点元素;
完全二叉树的顺序存储的性质:
用数组a[1….n]顺序存储完全二叉树的各节点,则当i0,且i=[(n-1)/2]时,节点a[i]的右子女是节点a[2i+1],否则节点a[i]没有右子女;同理当i0且i=[n/2],节点i的左子女节点是2i,否则没有!11.哈夫曼树:基本定义术语:
节点的路径长度:从根节点到该节点的路径上分支的数目;
树的路径长度:树中所有的节点的路径长度之和;
哈夫曼树:在有n个叶子节点,并带有相同权值的二叉树中,必定存在一个二叉树,使其带权路径长度最短,这样的二叉树被称为“最优二叉树”或“哈夫曼树”
如下图:
12.排序算法:
常考的排序算法有:插入排序、冒泡排序、选择排序、快速排序、堆排序。
快速排序:这是一种高效排序方法:
实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而“保证列表的前半部分都小于后半部分”就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
堆排序:与前面的算法都不同,它是这样的:
首先新建一个空列表,作用与插入排序中的“有序列表”相同。
找到数列中最大的数字,将其加在“有序列表”的末尾,并将其从原数列中删除。
重复2号步骤,直至原数列为空。
堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得“找到数列中最大的数字”这样的操作只需要o(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。
看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法。至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的。
算法的时间复杂度:
平均时间复杂度。
插入排序o(n2)。
冒泡排序o(n2)。
选择排序o(n2)。
快速排序o(nlogn)。
堆排序o(nlogn)。
归并排序o(nlogn)。
基数排序o(n)。
希尔排序o(n1.25)。
数据结构与算法篇二
(一)课程性质。
《数据结构》是一门专业基础课,在计算机软件的各个领域中均会使用到数据结构的有关知识。本课程的先修课程为c程序设计或c++程序设计。
(二)教学目的。
学会从问题入手,分析研究计算机加工的数据结构的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作算法,并初步掌握时间和空间分析技术。另一方面,本课程的学习过程也是进行复杂程序设计的训练过程,要求学生会书写符合软件工程规范的文件,编写的程序代码应结构清晰、正确易读,能上机调试并排除错误。
(三)教学时数。
课堂讲授每周4学时,18周,共72学时。
(四)教学方法。
本课程将采用课堂讲授及课堂讨论相结合的交互式教学法,同时辅以必要的上机操作实践。
(五)面向专业。
计算机科学与技术专业。
二、教学内容。
第一章绪论。
(一)教学目的要求。
介绍数据结构的一些基本概念,算法的时间复杂度和空间复杂度的分析方法,抽象数据类型的定义和使用以及算法的描述方法。掌握数据结构的一些基本概念,掌握算法的时间复杂度和空间复杂度的分析方法,了解抽象数据类型的定义和使用,了解算法的描述方法。
(二)教学内容。
主要内容:数据结构的一些基本概念:数据、数据元素、数据逻辑结构、数据存储结构、数据类型、算法等。抽象数据类型。算法时间复杂度和空间复杂度的分析。
教学重点:有关数据结构的各个名词和术语的含义,以及语句频度和时间复杂度、空间复杂度的估算。
教学难点:算法时间复杂度和空间复杂度的分析。
第一节。
一、非数值计算。
第二节。
一、数据。
三、数据类型。
四、抽象数据类型。
五、多型数据类型。
第三节。
一、固有数据类型。
基本概念和术语什么是数据结构。
二、数据抽象。
三、抽象数据类型的描述语言。
第四节。
一、算法。
二、算法设计的要求。
三、算法效率的度量。
四、算法的存储空间需求。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
4学时。
第二章线性表。
(一)教学目的与要求。
介绍线性表的基本概念和类型定义,对顺序表和单链表的常用操作方法及其程序实现,循环链表和双向链表的定义和它的插入、删除等操作方法。掌握线性表的基本概念和类型定义;熟练掌握对顺序表和单链表的常用操作方法及其程序实现;掌握循环链表和双向链表的定义和它的插入、删除等操作方法。
(二)教学内容。
主要内容:线性表的基本概念和类型定义,线性表的顺序存储结构,线性表的链接存储结构:(1)单链表的查找、插入和删除;(2)循环链表;(3)双向链表。
教学重点:在顺序表和链表上各种基本算法的实现及相关的时间性能分析。
教学难点:用所学的基本知识设计有效算法解决与线性表相关的应用问题。链表要分清链表中指针p和结点*p之间的对应关系,区分链表中的头结点、头指针以及循环链表、双向链表的特点等。
第一节。
一、线性表的定义。
二、线性表的基本操作。
第二节。
一、顺序表。
二、顺序表上基本运算的实现。
三、顺序表应用举例。
第三节。
一、线性链表。
二、循环链表。
三、双向链表。
四、静态链表。
第四节一、一元多项式的数学表示二、一元多项式的计算机表示。
三、抽象数据类型:一元多项式的定义。
四、抽象数据类型:一元多项式的存储结构。
五、抽象数据类型:一元多项式的基本操作算法实现。
(三)教学方法与形式。
一元多项式的表示及相加线性表的链式存储表示和实现线性表的顺序存储表示和实现。
线性表的类型定义算法和算法分析课堂讲授、多媒体课件。
(四)教学时数。
8学时。
第三章栈和队列。
(一)教学目的与要求。
介绍栈和队列的定义,顺序和链接存储的栈和队列的各种运算的方法及其程序实现。掌握栈和队列的定义,熟练掌握顺序和链接存储的栈和队列的各种运算的方法及其程序实现。
(二)教学内容。
主要内容:栈的类型定义,栈的顺序存储和链接存储的表示,在栈的顺序存储和链接存储上进行各种栈操作的算法,栈的应用举例,队列的类型定义,队列的顺序存储(循环队)和链接存储表示及各种操作的实现算法。
教学重点:栈和队列在两种存储结构上实现的基本运算。教学难点:递归的实现、循环队列中对边界条件的处理。
第一节。
一、抽象数据类型栈的定义。
二、栈的表示和实现。
第二节。
一、数制转换。
二、括号匹配的检验。
三、表达式求值。
第三节。
一、函数调用与栈。
二、递归调用栈的变化。
第四节。
一、抽象数据类型队列的定义。
二、链队列--队列的链式表示和实现。
三、循环队列--队列的顺序表示和实现。
第五节。
一、优先级队列的概念。
二、优先级队列的存储表示和实现。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
4学时。
第四章串。
(一)教学目的与要求。
介绍串的基本概念和操作,串的存储结构以及基本操作的算法实现。掌握串的基本概念和操作,掌握串的存储结构以及基本操作的算法实现。
(二)教学内容。
主要内容:串的类型定义,串的表示和实现,正文模式匹配,正文编辑——串操作应用举例串的类型定义。
教学重点:串类型定义中各基本操作的定义以及串的实现方法。教学难点:利用串的基本操作来实现串的其它操作。
优先级队列队列栈与递归的实现栈的应用举例。
栈
第一节。
一、串的定义。
二、串的基本操作。
第二节。
一、定长顺序存储表示。
二、堆分配存储表示。
三、串的块链存储表示。
四、字符串操作的实现。
第三节。
二、模式匹配的一种改进算法。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
4学时。
串的类型定义。
串的表示和实现。
字符串的模式匹配。
一、求子串位置的定位函数index(s,t,pos)。
第五章数组和广义表。
(一)教学目的。
介绍数组的基本概念和基本操作的算法实现;稀疏矩阵的定义和各种存储结构,稀疏矩阵的转置和相加的方法并了解其算法;广义表的定义、存储结构和求广义表的长度及深度的算法,建立广义表和输出广义表的方法并了解其算法。掌握数组的基本概念和基本操作的算法实现;掌握稀疏矩阵的定义和各种存储结构,掌握稀疏矩阵的转置和相加的方法并了解其算法;掌握广义表的定义、存储结构和求广义表的长度及深度的算法,掌握建立广义表和输出广义表的方法并了解其算法。
(二)教学内容。
主要内容:稀疏矩阵的定义、存储和运算,广义表的定义、存储和运算串的类型定义。教学重点:特殊矩阵的压缩存储,以及稀疏矩阵的三元组顺序表示。教学难点:特殊矩阵的压缩存储,以及稀疏矩阵的三元组顺序表示。
第一节第二节。
一、数组的存储方式。
二、数组元素存储位置的计算。
三、基本操作的实现。
第三节。
一、特殊矩阵。
二、稀疏矩阵。
第四节。
一、广义表的基本概念。
二、广义表的三个重要结论。
第五节。
一、头尾链表存储表示。
二、扩展线性链表存储表示。
第六节。
一、求广义表的深度。
二、复制广义表。
三、建立广义表的存储结构。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
6学时。
第六章树和二叉树。
(一)教学目的与要求。
介绍树的定义、性质、存储结构及遍历算法,握二叉树的各种遍历方法及其实现,二叉树的其他操作方法及实现,树、森林和二叉树的转换方法,哈夫曼树的定义和构造哈夫曼树的方法,哈夫曼树编码的方法。掌握树的定义、性质、存储结构及遍历算法,熟练掌握二叉树的各种遍历方法及其实现,掌握二叉树的其他操作方法及实现,掌握树、森林和二叉树的转换方法,掌握哈夫曼树的定义和构造哈夫曼树的方法,了解哈夫曼树编码的方法。
(二)教学内容。
主要内容:树的定义、性质和表示方法,二叉树的定义、性质和存储结构,二叉树的各种遍历方法及实现,建立二叉树、输出二叉树、求二叉树深度等的操作方法及实现,树的存储结构,进行先根遍历、后根遍历和按层遍历的方法及实现,进行树与二叉树的转换方法,哈夫曼树的定义、构造哈夫曼树的方法及哈夫曼编码的方法。
教学重点:二叉树和树的遍历及其应用。
教学难点:实现二叉树和树的各种操作的递归算法。
第一节。
一、树的定义。
二、森林的定义。
三、树的抽象数据类型定义。
第二节一、二叉树的定义二、二叉树的性质三、二叉树的存储结构。
第三节。
一、遍历二叉树。
二、线索二叉树。
第四节。
一、树的存储结构。
二、森林与二叉树的转换。
三、树和森林的遍历。
第五节。
一、最优二叉树(赫夫曼树)。
二、赫夫曼编码。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
10学时。
最优树和赫夫曼编码。
树和森林。
遍历二叉树和线索二叉树。
二叉树。
树的定义和基本术语。
第七章图。
(一)教学目的与要求。
介绍图的定义和术语;图的存储结构及深度和广度优先搜索方法及其实现;图的生成树的概念,求图的最小生成树的普里姆算法和克鲁斯卡尔算法并了解其实现算法;拓扑排序的方法并了解其实现算法;计算关键路径的方法及其实现算法。掌握图的定义和术语;熟练掌握图的存储结构及深度和广度优先搜索方法及其实现;掌握图的生成树的概念,掌握求图的最小生成树的普里姆算法和克鲁斯卡尔算法并了解其实现算法;掌握拓扑排序的方法并了解其实现算法;了解计算关键路径的方法并了解其实现算法。
(二)教学内容。
主要内容:图的定义和术语,图的邻接矩阵、邻接表和边集数组表示,图的深度和广度优先搜索遍历,图的生成树和最小生成树,拓扑排序。
教学重点:图在邻接矩阵与邻接表上实现的遍历算法(dfs和bfs)。教学难点:基于遍历算法的应用。
第一节。
一、图的定义。
二、无向图。
三、有向图。
四、连通图。
五、生成树。
第二节。
一、数组表示法。
二、邻接表三、十字链表。
四、邻接多重表。
第三节。
一、深度优先搜索。
二、广度优先搜索。
三、连通分量。
第四节。
一、kruskal算法。
二、prim算法。
第五节。
一、拓扑排序。
二、关键路径。
第六节。
一、从某个源点到其余各项点的最短路径。
二、每一对顶点之间的最短路径。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
12学时。
最短路径有向无环图及其应用。
最小生成树图的遍历图的存储表示图的定义和术语。
第八章查找表。
(一)教学目的与要求。
介绍顺序表查找和有序表查找的方法及实现;二叉排序树和平衡二叉树的定义、对二叉排序树和平衡二叉树进行插入、删除和查找的方法和实现。哈希表的定义,构造哈希函数的多种方法,以及处理冲突的方法;b树的定义,查找、插入和删除元素的方法。熟练掌握顺序表查找和有序表查找的方法及实现;掌握二叉排序树和平衡二叉树的定义、熟练掌握对二叉排序树和平衡二叉树进行插入、删除和查找的方法和实现。掌握哈希表的定义,构造哈希函数的多种方法,以及处理冲突的方法;了解b树的定义,查找、插入和删除元素的方法。
(二)教学内容。
主要内容:顺序查找和二分查找,索引查找和分块查找,散列查找,动态查找树表。教学重点:顺序查找、二分查找、二叉排序树上查找以及散列表上查找的基本思想和算法实现。
教学难点:二叉排序树的删除算法。
第一节。
一、顺序表的查找。
二、有序表的查找。
三、静态树表的查找。
四、索引顺序表的查找。
第二节一、二叉排序树。
二、平衡二叉树。
三、动态的m路搜索树。
四、b树和b+树基本概念。
第三节。
一、什么是哈希表。
二、哈希函数的构造方法。
三、处理冲突的方法。
四、哈希表的查找及其分析。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
10学时。
第九章内部排序。
(一)教学目的与要求。
介绍插入排序、交换排序、选择排序、快速排序、归并排序、基数排序的方法及其实现,快速排序、堆排序、二路归并排序的方法及其实现,各种排序方法的稳定性、时间复杂度和空间复杂度。掌握插入排序、交换排序、选择排序、快速排序、归并排序、基数排序的方法及其实现,熟练掌握快速排序、堆排序、二路归并排序的方法及其实现,掌握各种排序方法的稳定性、时间复杂度和空间复杂度。
(二)教学内容。
主要内容:排序的概念,直接插入排序,冒泡排序和快排序,直接选择排序和堆排序,归并排序。
哈希表动态查找表静态查找表教学重点:插入排序(直接插入、折半插入)、交换排序(冒泡、快速排序)、选择排序(直接选择、堆)、2-路归并排序。
教学难点:快速排序partition算法的应用和堆的调整。
第一节。
一、稳定的排序方法。
二、内部/外部排序。
三、内部排序种类。
四、排序中的基本操作。
五、排序数据的存储方式。
第二节。
一、直接插入排序。
二、其他插入排序。
三、希尔排序。
第三节。
一、起泡排序算法。
二、快速排序算法。
第四节。
一、简单选择排序。
二、树形选择排序。
三、堆排序。
第五节第六节。
一、多关键字的排序。
二、链式基数排序。
第七节。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
10学时。
第十章文件。
(一)教学目的与要求。
介绍文件和记录的基本概念以及基本操作。掌握文件和记录的基本概念以及基本操作。
(二)教学内容。
主要内容:基本概念,顺序文件,索引文件,索引顺序文件,散列文件,多关键码文件。教学重点:各种文件的结构特点及其适用场合。教学难点:各种文件的结构特点及其适用场合。
第一节。
一、文件及其类别。
二、记录的逻辑结构和物理结构。
三、文件的操作。
四、文件的物理结构。
第二节。
一、顺序文件的定义。
顺序文件基本概念。
各种排序方法的综合比较。
归并排序法基数排序选择排序法交换排序法插入排序排序的定义和方法。
二、顺序文件的优缺点。
第三节。
一、索引文件的定义。
二、索引文件的特点。
第四节。
一、isam文件。
二、vsam文件。
第五节。
一、散列文件的定义。
二、散列文件的特点。
第六节。
一、多重表文件。
二、倒排文件。
(三)教学方法与形式。
课堂讲授、多媒体课件。
(四)教学时数。
4学时。
三、考核方式。
本课程的考核采用闭卷考试的方式,课程的总评成绩由平时成绩、实验成绩和期末考试成绩三部分组成,其中平时成绩占总评成绩的10%,实验成绩占总评成绩的30%,期末考试成绩占总评成绩的60%。
四、教材选用。
1、殷人昆,陶永雷,谢若阳等:《数据结构(用面向对象方法与c++语言描述)》,清华大学出版社,2007.6年第二版。
2、严蔚敏,吴伟民:《数据结构(c语言版)》及《数据结构题集(c语言版)》,清华大学出版社,2003年第一版。
多关键码文件散列文件isam文件和vsam文件。
索引文件。
数据结构与算法篇三
数据结构与算法是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且也已经成为其他理工专业的热门选修课。总的来说感触还是比较深的,刚开始上的时候还蛮简单的,越到后面感觉越难,算法也更复杂了,有时候甚至听不懂,老师上课时讲的也蛮快的,所以只能靠课下下功夫了。下面是我对本学期学习这门课的总结。
第一章的数据结构和算法的引入,介绍了数据和数据类型、数据结构、算法描述工具、算法和算法评价四个方面的知识。
第二章具体地介绍了顺序表的概念、基本运算及其应用。基本运算有:初始化表、求表长、排序、元素的查找、插入及删除等。元素查找方法有:简单顺序查找、二分查找和分块查找。排序方法有:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。最后介绍了顺序串的概念,重点在于串的模式匹配。
第三章主要介绍的是线性逻辑结构的数据在链接存储方法下数据结构链表的相关知识。主要是单链表、循环链表的数据类型结构、数据结构、基本运算及其实现以及链表的相关应用问题,在此基础上介绍了链串的相关知识。在应用方面有多项式的相加问题、归并问题、箱子排序问题和链表在字符处理方面的应用问题等。本章未完全掌握的是循环链表的算法问题和c的描述。
第四章介绍在两种不同的存储结构下设计的堆栈,即顺序栈和链栈的相关知识,了解堆栈的相关应用,掌握应用堆栈来解决实际问题的思想及方法。本章主要内容是顺序栈和链栈的概念、数据类型、数据结构定义和基本运算算法及其性能分析。本章堆栈算法思想较为简单,所以能较好掌握。
第五章主要介绍顺序存储和链接存储方法下的两种队列、顺序(循环)队列和链队列的数据结构、基本运算及其性能分析以及应用。顺序队列(重点是循环队列)和链队列的概念、数据类型描述、数据结构和基本运算算法及其性能分析等。本章同堆栈有点类似,算法思想较为简单,所以能较好掌握;但难点重在循环队列队空、队满的判断条件问题。
第六章“特殊矩阵、广义表及其应用”将学习数组、稀疏矩阵和广义表的基本概念,几种特殊矩阵的存储结构及其基本运算,在此基础上学习特殊矩阵的计算算法与广义表应用等相关问题。本章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。
第七章二叉树及其应用。分为二叉树的基本概念、二叉树存储结构、二叉树的遍历算法、线索二叉树、二叉树的应用(哈夫曼树、二叉排序树、堆和堆排序、基本算法)。基本算法包括二叉树的建立、遍历、线索化等算法。在此基础上,介绍二叉树的一些应用问题,包括哈夫曼编码问题、(平衡)二叉排序树问题和堆排序问题等。
第八章说的是树和森林,首先我们要知道树与二叉树是不同的概念。课本介绍了树和森林的概念、遍历和存储结构,还有树、森林和二叉树的相互关系,树或森林怎样转化成二叉树,二叉树又如何转换为树和森林等算法。
第九章“散列结构及其应用”是逻辑结构“集合型”的数据元素在散列存储方法下的数据结构及其应用知识内容。主要介绍散列函数的概念、散列结构的概念、散列存储结构的概念---散列表、散列函数和散列表中解决冲突的处理方法---开放定址法、链地址法以及散列表的基本算法及其性能分析。本章概念较为多,所以掌握不太好。
第十章图及其应用。分为图的概念、图的存储结构及其基本算法、图的遍历及算法、有向图的连通性和最小生成树、图的最小生成树、非连通图的生成森林算法、最短路径、有向无环图及其应用。
二、对各知识点的掌握情况。
我对各知识点的掌握情况总结如下:
对于第一章对数据结构的概念理解颇深,大概是每次都要谈论到吧。对算法的时间性能,空间性能基本了解。这些在后面的章节都会有运用。第二章本章重点和难点在查找和排序问题的算法思想上,6种排序方法的性能比较。本章未掌握的为希尔排序、快速排序、归并排序的时间复杂度分析。第三章,对链表掌握还好,对其数据结构进行了分析,有循环链表,掌握的不是很好,对其中一些用法不熟练。第四章堆栈,本章堆栈算法思想较为简单,所以能较好掌握,但表达式计算问题未掌握好的。第五章的循环队列队空、队满的判断条件问题掌握的不是很好。第六章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。第七章对二叉树掌握较好,其概念,存储,遍历有很好的掌握。就是对二叉排序树有点生疏,它的生成算法不是很会。第八章树树与二叉树之间的转换,森林与二叉树的转换算法思想基本掌握。第九章散列的一些知识,没有深入学习,大概了解了散列存储结构散列表,散列函数,冲突的处理方法。第十章了解了图的逆邻接表的存储结构,关键路径求解算法未能掌握好,不能灵活运用图的不同数据结构和遍历算法解决复杂的应用问题。
三、学习体会。
刚刚接触这门课时,看到课本中全是算法,当时就晕了,因为我的c语言学的不好,我担心会影响这门课的学习,后来上课时老师说学习这门课的基础是c语言,所以我当时就决定一定要好好补补,争取不被拖后腿,在学习这门课的期间,也遇到了不少问。但是通过学习数据结构与算法,让我对程序有了新的认识,也有了更深的理解。同时,也让我认识到,不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的,所以,第一遍看课本要将概念熟记于心,然后构建知识框架。并且,对算法的学习是学习数据结构的关键。在第二遍看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。对算法的应用上,学习算法的目的是利用算法解决实际问题。会写课本上已有的算法之后,可以借其思想进行扩展,逐步提高编程能力。
四、对课程教学的建议。
1、课程课时较紧,课堂上的练习时间较少,讲解的东西越多,头脑有时就很混乱。
2、感觉上课时的气氛不是很好,虽然大部分人都在听,可是效果不是很好。所以希望老师能在授课中间能穿插一些活跃课堂氛围的话题,可以是大家都非常关心的一些内容,这样既让大家能在思考之余有一个放松,也能够提高学生的学习积极性和学习效率。
3、学习的积极性很重要,有时候我们花了很长时间去写实验报告,也很认真的去理解去掌握,可是最后实验报告可能就只得了一个c,抄的人反而得a,这样的话很容易打击学生的积极性,在后面的实验报告中没动力再去认真写。所以希望老师能在这方面有所调整。
4、虽然讲课的时间很紧,但是还是希望老师能在讲述知识点的时候能运用实际的调试程序来给我们讲解,这样的话能让我们对这些内容有更深刻的印象和理解。
-->。
数据结构与算法篇四
计算机技术已成为现代化发展的重要支柱和标志,并逐步渗透到人类生活的各个领域。随着计算机硬件的发展,对计算机软件的发展也提出了越来越高的要求。由于软件的核心是算法,而算法实际上是对加工数据过程的描述,所以研究数据结构对提高编程能力和设计高性能的算法是至关重要的。
非数值计算问题的数学模型不再是传统的数学方程问题,而是诸如表、树、图之类的数据结构。因此,简单地说,数据结构是一门研究非数值计算的程序设计问题的学科,主要研究数据的逻辑结构、存储结构和算法。
一、教学目的与要求---了解数据的逻辑结构和物理结构;
教学要求在每章教学内容给出,大体上为三个层次:了解、掌握和熟练掌握。他们的含义大致为:了解是正确理解概念,掌握是学会所学知识,熟练掌握就是运用所学知识解决实际问题。
教学目的为:了解算法对于程序设计的重要性;学习掌握基本数据结构的描述与实现方法,熟练掌握典型数据结构及其应用算法的设计。了解算法分析方法。
二、教学重点与难点--数据结构中基本概念和术语,算法描述和分析方法。
1、链表插入、删除运算的算法。算法时间复杂度。
2、后缀表达式的算法,数制的换算。
利用本章的基本知识设计相关的应用问题。
3、循环队列的特点及判断溢出的条件。
利用队列的特点设计相关的应用问题。
4、串的模式匹配运算算法。
5、二叉树遍历算法的设计。
利用二叉树遍历算法,解决简单应用问题哈夫曼树的算法。
6、图的遍历。
最小生成树。
最短路径。
7、二叉排序树查找。
平衡树二叉树。
8、堆排序。
快速排序归并排序。
四、教学内容、目标与学时分配。
教学内容教学目标课时分配。
1、绪论。
逻辑结构与存储结构。
算法和算法分析。
2、线性表。
线性表的定义与运算。
线性表的顺序存储。
线性表的链式存储。
3、栈。
栈的定义与运算。
栈存储和实现。
栈的应用举例。
4、队列。
队列的定义与基本运算。
队列的存储与实现。
队列的应用举例。
5、串。
串的定义与基本运算。
串的表示与实现。
串的基本运算。
6、树和二叉树。
树的定义和术语。
二叉树树的基本概念和术语遍历二叉数和线索二叉树。
二叉树的转换。
二叉树的应用。
哈夫曼树及其应用。
7、图。
图的定义和术语。
图的存储结构。
图的遍历算法。
图的连通性。
8、查找。
查找的基本概念与静态查找动态查找。
哈希表。
了解。
了解。
掌握。
熟练掌握顺序表存储地址的计算。
掌握单链表的结构特点和基本运算。
掌握双链表的结构特点和基本运算。
掌握栈的定义与运算。
掌握栈的存储与实现。
熟练掌握栈的各种实际应用。
掌握队列的定义与基本运算。
熟练掌握队列的存储与实现。
掌握循环队列的特征和基本运算。
了解串的逻辑结构。
掌握串的存储结构。
熟练掌握串的基本运算。
了解。
了解二叉树。
熟练掌握二叉树定义和存储结构。
了解二叉树的遍历算法。
掌握。
掌握哈夫曼的建立及编码。
了解。
了解。
熟练掌握。
熟练掌握。
了解。
熟练掌握。
了解哈希表与哈希方法。
4学时。
1学时。
1学时。
2学时。
8学时。
2学时。
2学时。
4学时。
8学时。
2学时。
2学时。
4学时。
6学时。
2学时。
2学时。
2学时。
6学时。
2学时。
2学时。
2学时。
12学时。
2学时。
2学时。
2学时。
2学时。
2学时。
2学时。
8学时。
2学时。
2学时。
2学时。
2学时。
8学时。
4学时。
2学时。
2学时。
9、排序。
12学时插入排序。
熟练掌握基本思想。
3学时快速排序。
了解各种内部排序方法和特点。
3学时选择排序。
掌握。
2学时各种排序方法比较。
掌握。
2学时。
实验内容实验目标课时分配算法编程实验:
1、用指针方式编写程序复习c(c++)语言指针、结构体等的用法。
2、对单链表进行遍历。
链表的描述与操作实现。
3、栈及其操作。
描述方法及操作。
4、编写串子系统1串的特点及顺序定长存储、操作、查找。
5、编写串子系统2串的特点及顺序定长存储、操作、查找。
6、编写树子系统1二叉树的特点及存储方式、创建、显示、遍历等。
7、编写树子系统2二叉树的特点及存储方式、创建、显示、遍历等。
8、图子系统。
图的邻接矩阵的存储、遍历、广度/深度优先搜索。
9、查找子系统。
理解查找基本算法、平均查找长度、静态、动态查找等。
五、考试范围与题型。
1、考试范围与分数比例。
1)绪论。
12%2)线性表。
17%3)栈。
7%4)队列。
6%5)串。
4%6)树和二叉树。
14%7)图。
15%8)查找。
4%9)排序。
21%。
2、考试题型与分数比例。
1)名词解释。
18%2)判断对错。
16%3)填空。
16%4)单项选择。
18%5)应用。
32%。
六、教材与参考资料。
1、教材:实用数据结构基础(谭浩强)中国铁道出版社。
(撰写人:
审核人:2学时2学时2学时2学时2学时2学时2学时2学时2学时)。
数据结构与算法篇五
课程设计是《数据结构》课程的一个重要的实践环节,它可加深学生对该课程所学内容的进一步的理解与巩固,达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,培养基本的对基本数据结构的理解和运用,良好的程序设计方法、提高编码及调试程序技能的能力,为整个专业的学习以及软件设计水平的提高打下良好的基础。
二、设计内容。
每位学生可以从《数据结构课程设计备选题目》中选择一个题目自行完成。要求每班中题目不能重复。
三、设计要求。
1.学生必须仔细阅读《数据结构课程设计任务书》,认真主动完成课设的要求。有问题及时主动通过各种方式与指导教师联系沟通。
2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时向教师汇报。
3.课程设计按照教学要求需要两周时间完成,学院安排设计时。
间学生不得缺席。
4、每位学生必须认真、独立完成设计任务,发现抄袭者或雷同者,一律按零分处理。
5、程序设计语言可选择c或c++。
6、程序要正确且具有一定的健壮性,不会因为用户的输入错误引起程序运行错误而中断执行,对输入值的类型、大小范围、字符串的长度等,进行正确性检查,对不合法的输入值给出出错信息,指出错误类型,等待重新输入。
四、上交相关内容要求。
上交的成果的内容必须由以下三个部分组成,缺一不可。
3.课程设计报告:(保存在word文档中,文件名要求按照“学号_姓名_课程设计报告题目”起名,如文件名为“001_张三_二叉树动态演示”.doc)。报告要求文字工整通顺、图表规范、思路清楚、内容正确。设计报告必须按照规定格式规范,a4纸双面打印、装订。
将以上三个部分放在一个文件夹里,文件夹名要求按照"学号_姓名_课程设计报告题目”.zip命名。每个班将所有学生的文件夹收集起来刻成光盘上交。
五、时间安排。
设计时间为两周(7.07—7.18),7月16日—7月18日答辩。考核方式。
成绩按五分制,包括课程设计过程、课程设计结果、课程设计报告三部分。其中:
课程设计过程:20%。
包括设计态度(10分)、出勤(10分)。
课程设计结果:40%。
其中:程序正确性:30分,运行效果:10分,答辩:10分。课程设计报告:40%。
其中:正确性:20分,完整性:10分,规范性:10分。
六、设计报告格式。
数据结构与算法篇六
数据结构与算法是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且也已经成为其他理工专业的热门选修课。随着高级语言的发展,数据结构在计算机的研究和应用中已展现出强大的生命力,它兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性。通过学习,先报告如下:
第一章的内容主要包括有关数据、数据类型、数据结构、算法、算法实现、c语言使用中相关问题和算法分析等基本概念和相关知识。其中重点式数据、数据类型、数据结构、算法等概念;c语言中则介绍了指针、结构变量、函数、递归、动态存储分配、文件操作、程序测试与调试问题等内容。
第二章主要介绍的是线性逻辑结构的数据在顺序存储方法下的数据结构顺序表(包括顺序串)的概念、数据类型、数据结构、基本运算及其相关应用。其中重点一是顺序表的定义、数据类型、数据结构、基本运算和性能分析等概念和相关知识。二是顺序表的应用、包括查找问题(简单顺序查找、二分查找、分块查找)、排序问题(直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、归并排序)、字符处理问题(模式匹配)等内容。本章重点和难点在查找和排序问题的算法思想上,6种排序方法的性能比较。
第三章主要介绍的是线性逻辑结构的数据在链接存储方法下数据结构链表的相关知识。主要是单链表、循环链表的数据类型结构、数据结构、基本运算及其实现以及链表的相关应用问题,在此基础上介绍了链串的相关知识。在应用方面有多项式的相加问题、归并问题、箱子排序问题和链表在字符处理方面的应用问题等。本章未完全掌握的是循环链表的算法问题和c的描述。
第四章介绍在两种不同的存储结构下设计的堆栈,即顺序栈和链栈的相关知识,了解堆栈的相关应用,掌握应用堆栈来解决实际问题的思想及方法。本章主要内容是顺序栈和链栈的概念、数据类型、数据结构定义和基本运算算法及其性能分析。本章堆栈算法思想较为简单,所以能较好掌握。
第五章主要介绍顺序存储和链接存储方法下的两种队列、顺序(循环)队列和链队列的数据结构、基本运算及其性能分析以及应用。顺序队列(重点是循环队列)和链队列的概念、数据类型描述、数据结构和基本运算算法及其性能分析等。本章同堆栈有点类似,算法思想较为简单,所以能较好掌握;但难点重在循环队列队空、队满的判断条件问题。第六章“特殊矩阵、广义表及其应用”将学习数组、稀疏矩阵和广义表的基本概念,几种特殊矩阵的存储结构及其基本运算,在此基础上学习特殊矩阵的计算算法与广义表应用等相关问题。本章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。
第七章“二叉树及其应用”的知识结构主要是:非线性结构数据二叉树的定义、性质、逻辑结构、存储结构及其各种基本运算算法,包括二叉树的建立、遍历、线索化等算法。在此基础上,介绍二叉树的一些应用问题,包括哈夫曼编码问题、(平衡)二叉排序树问题和堆排序问题等。
第八章“树和森林及其应用”介绍树和森林的数据结构、基本算法及其性能分析,树和森林与二叉树之间的转换算法等,在此基础上介绍树的应用---b-树,应用b-树来实现数据元素的动态查找。本章基本掌握树和森林的概念和性质、数据结构、树的基本算法及性能分析,树和二叉树间的转换及其算法,并用应用b-树来实现数据元素的动态查找未能掌握好。
第九章“散列结构及其应用”是逻辑结构“集合型”的数据元素在散列存储方法下的数据结构及其应用知识内容。主要介绍散列函数的概念、散列结构的概念、散列存储结构的概念---散列表、散列函数和散列表中解决冲突的处理方法---开放定址法、链地址法以及散列表的基本算法及其性能分析。本章概念较为多,所以掌握不太好。
第十章“图及其应用”是逻辑结构为“图形”的数据结构及其应用知识内容,主要介绍图的定义和基础知识,图的2种存储结构。图的基本算法以及图的典型应用问题(最小生成树、最短路径、拓扑排序和关键路径等)。
二、对各知识点的掌握情况。
我对各知识点的掌握情况总结如下:
第一章不太难,能基本掌握。但关系全书的时间性能分析有些未能全部掌握。第二章本章重点和难点在查找和排序问题的算法思想上,6种排序方法的性能比较。本章未掌握的为希尔排序、快速排序、归并排序的时间复杂度分析。第三章,对链表掌握还好,对其数据结构进行了分析,有循环链表,掌握的不是很好,对其中一些用法不熟练。第四章堆栈,本章堆栈算法思想较为简单,所以能较好掌握,但表达式计算问题未掌握好的。第五章的循环队列队空、队满的判断条件问题掌握的不是很好。第六章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。第七章对二叉树掌握较好,其概念,存储,遍历有很好的掌握。就是对二叉排序树有点生疏,它的生成算法不是很会。第八章树树与二叉树之间的转换,森林与二叉树的转换算法思想基本掌握。第九章散列的一些知识,没有深入学习,大概了解了散列存储结构散列表,散列函数,冲突的处理方法。第十章了解了图的逆邻接表的存储结构,关键路径求解算法未能掌握好,不能灵活运用图的不同数据结构和遍历算法解决复杂的应用问题。
三、学习体会。
通过学习数据结构与算法,让我对程序有了新的认识,也有了更深的理解。同时,也让我认识到,不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的,所以,第一遍看课本要将概念熟记于心,然后构建知识框架。并且,对算法的学习是学习数据结构的关键。在第二遍看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。对算法的应用上,学习算法的目的是利用算法解决实际问题。会写课本上已有的算法之后,可以借其思想进行扩展,逐步提高编程能力。
四、对课程教学的建议。
1、感觉上课时的气氛不是很好,虽然大部分人都在听,可是效果不是很好。所以希望老师能在授课中间能穿插一些活跃课堂氛围的话题,可以是大家都非常关心的一些内容,这样既让大家能在思考之余有一个放松,也能够提高学生的学习积极性和学习效率。
2、学习的积极性很重要,有时候我们花了很长时间去写实验报告,也很认真的去理解去掌握,可是最后实验报告可能就只得了一个c,抄的人反而得a,这样的话很容易打击学生的积极性,在后面的实验报告中没动力再去认真写。所以希望老师能在这方面有所调整。
3、虽然讲课的时间很紧,但是还是希望老师能在讲述知识点的时候能运用实际的调试程序来给我们讲解,这样的话能让我们对这些内容有更深刻的印象和理解。
数据结构与算法篇七
一、基本信息。
课程编号:e1132107课程类别:学科基础课必修课适用层次:本科。
二、教学目的。
数据结构与算法课程设计不仅是数据结构与算法课程的实践教学环节,而且是一门综合性实验项目。通过这个实验,培养学生综合运用数据结构基本知识和程序设计基本知识,解决实际问题,提高程序设计的能力和团队协作精神。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
1.学生通过实践掌握线性表、树、图等数据结构的存储结构及算法实现;2.培养学生利用数据结构知识解决实际问题的能力;3.使学生初步具备查阅资料、分析设计、上机实现和书写科技报告的能力。
三、基本要求。
1.指导教师要在选题、设计、上机实现等诸环节上投入精力,加强指导、讨论和答疑的力度。尤其在选题上,要充分考虑学生目前所具有的知识水平、掌握的开发工具、以及综合设计能力的现状,使题目取材合理、大小适中、难易适度,使学生在完成设计工作后,能有所收获。2.参加课程设计的学生要珍惜机会、勤奋工作、勇于创新、勇于探索、勇于实践,虚心向指导教师请教,向同学学习,独立完成设计任务。
3.学生需保质、保量、保时间进度地提交规范的课程设计报告,审查由指导教师负责。
四、教学内容。
1.主要内容:应用所掌握的线性表、树、图等数据结构知识解决实际问题。2.软件开发工具:c/c++、java。
3.课程设计题目:指导教师拟定(参考题目见附录1)。
4.具体步骤:指导教师拟定设计题目,学生研究具体问题、进行需求分析、选择合适的数据结构、设计算法、编写并调试代码、书写文档材料、提交设计报告,最后,由指导教师验收并评定成绩。
5.设计内容及时间安排:第1-3天,选定题目,明确题目要求、确定数据结构、设计算法,并分析算法复杂度;第4-8天,编写程序、调试程序、测试程序;第9-10天,撰写设计报告,准备答辩(上机演示,回答教师提问)。6.设计报告书写要求:按照软件开发规范的要求书写设计报告(参见附录三报告书写格式);要求报告层次结构清晰、图表完整、语言通顺、字迹工整。7.验收要求:1)运行所设计的程序;2)回答有关问题;3)提交课程设计报告(打印或手写在实习报告册上);4)提交软盘(源程序)。(鼓励学生创新。对内容有创新者,成绩评定将适当提高)。
五、考核方法。
学习成绩的评定方式:考查。
课程设计成绩评定=平时出勤(20%)+设计报告(40%)+答辩(40%)通过设计答辩方式,并结合学生的动手能力,独立分析解决问题的能力和创新精神,总结报告和答辩水平以及学习态度综合考评。成绩分为优、良、中、及格和不及格五等。
六、教材与参考资料1.建议教材:
2.建议参考书目:
附录一。
参考题目(可分若干组,每个学生选择其中一个题目)。
1.商厦家电库存管理2.排序算法的时间比较。
16.文字统计系统—文字研究助手17.修道士野人问题18.考试问题。
19.计算机辅助考核系统20.学籍管理系统。
注:学生可以自选题目或选择指导老师拟定的题目。
附录二。
开发步骤。
1.分析题目的要求、目的;2.选择适当的数据结构;
3.抽象数据类型的设计;4.抽象数据类型的实现;5.编写代码、上机调试;6.总结验收、评价。
附录三报告书写格式。
1.问题描述。
题目内容、基本要求2.需求分析。
软件的基本功能、输入/输出形式、测试数据要求3.概要设计。
所需的adt及作用、主程序流程及模块调用关系4.详细设计。
编码与调试过程中遇到的问题及解决的办法,还存在哪些没有解决的问题?6.使用说明。
简要说明程序运行操作步骤7.测试结果。
8.课程设计心得体会。
数据结构与算法篇八
课程名称:
学生学号:
所属院部:
(理工类)。
学生姓名:
指导教师:——20学年第学期。
金陵科技学院教务处制。
实验报告书写要求。
实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用a4的纸张。
实验报告书写说明。
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。
填写注意事项。
(1)细致观察,及时、准确、如实记录。(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明。
实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求。
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:顺序表实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验1顺序表。
一、实验目的和要求。
掌握顺序表的定位、插入、删除等操作。
二、实验仪器和设备。
vc6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)编写程序建立一个顺序表,并逐个输出顺序表中所有数据元素的值。编写主函数测试结果。
(2)编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号从0开始编号);如果不存在,返回-1。编写主函数测试结果。(3)在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。
解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将新结点x插入到i位置。
(4)删除顺序表中所有等于x的数据元素。
2、选做题。
(5)已知两个顺序表a和b按元素值递增有序排列,要求写一算法实现将a和b归并成一个按元素值递减有序排列的顺序表(允许表中含有值相同的元素)。
程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:单链表实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验2单链表。
一、实验目的和要求。
1、实验目的。
掌握单链表的定位、插入、删除等操作。
2、实验要求。
(1)注意链表的空间是动态分配的,某结点不用之后要及时进行物理删除,以便释放其内存空间。
(2)链表不能实现直接定位,一定注意指针的保存,防止丢失。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)编写程序建立一个单链表,并逐个输出单链表中所有数据元素。(2)在递增有序的单链表中插入一个新结点x,保持单链表的有序性。
解题思路:首先查找插入的位置然后进行插入操作;从第一个结点开始找到第一个大于该新结点值的结点即为插入位置;然后在找到的此结点之前插入新结点;注意保留插入位置之前结点的指针才能完成插入操作。
(3)编写实现带头结点单链表就地逆置的子函数,并编写主函数测试结果。
2、选做题。
已知指针la和lb分别指向两个无头结点单链表的首元结点。要求编一算法实现,从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中第j个元素之前。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:堆栈和队列实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验3堆栈和队列。
一、实验目的和要求。
(1)掌握应用栈解决问题的方法。(2)掌握利用栈进行表达式求和的算法。
(3)掌握队列的存储结构及基本操作实现,并能在相应的应用问题中正确选用它们。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)判断一个算术表达式中开括号和闭括号是否配对。(2)测试“汉诺塔”问题。
(3)假设称正读和反读都相同的字符序列为”回文”,试写一个算法判别读入的一个以’@’为结束符的字符序列是否是“回文”。
2、选做题。
在顺序存储结构上实现输出受限的双端循环队列的入列和出列算法。设每个元素表示一个待处理的作业,元素值表示作业的预计时间。入队列采取简化的短作业优先原则,若一个新提交的作业的预计执行时间小于队头和队尾作业的平均时间,则插入在队头,否则插入在队尾。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:串实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验4串。
一、实验目的和要求。
掌握串的存储及应用。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)编写输出字符串s中值等于字符ch的第一个字符的函数,并用主函数测试结果。
(2)编写输出字符串s中值等于字符ch的所有字符的函数,并用主函数测试结果。
解题思路:可以将第一题程序改进成一个子函数,在本题中循环调用。(3)设字符串采用单字符的链式存储结构,编程删除串s从位置i开始长度为k的子串。
2、选做题。
假设以链结构表示串,编写算法实现将串s插入到串t中某个字符之后,若串t中不存在这个字符,则将串s联接在串t的末尾。
提示:为提高程序的通用性,插入位置字符应设计为从键盘输入。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:二叉树实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验5二叉树。
一、实验目的和要求。
(1)掌握二叉树的生成,以及前、中、后序遍历算法。(2)掌握应用二叉树递归遍历思想解决问题的方法。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)建立一棵二叉树。对此树进行前序遍历、中序遍历及后序遍历,输出遍历序列。
(2)在第一题基础上,求二叉树中叶结点的个数。(3)在第一题基础上,求二叉树中结点总数。(4)在第一题基础上,求二叉树的深度。
2、选做题。
已知一棵完全二叉树存于顺序表sa中,[1…]存储结点的值。试编写算法由此顺序存储结构建立该二叉树的二叉链表。
解题思路:根据完全二叉树顺序存储的性质来确定二叉树的父子关系即“还原”了二叉树,之后再按照二叉树二叉链表的构造方法进行建立。完全二叉树顺序存储的一个重要性质为,第i个结点的左孩子是编号为2i的结点,第i个结点的右孩子是编号为2i+1的结点。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:图实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验6图。
一、实验目的和要求。
(1)熟练掌握图的基本概念、构造及其存储结构。
(2)熟练掌握对图的深度优先搜索遍历和广度优先搜索遍历的算法。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)构造一个无向图(用邻接矩阵表示存储结构)。
(2)对上面所构造的无向图,进行深度优先遍历和广度优先遍历,输出遍历序列。
2、选做题。
采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法。简单路径是指其顶点序列中不含有重复顶点的路径。提示:两个顶点及k值均作为参数给出。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:排序实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验7排序。
一、实验目的和要求。
(1)熟练掌握希尔排序、堆排序、直接插入排序、起泡排序、快速排序、直接选择排序、归并排序和基数排序的基本概念。
(2)掌握以上各种排序的算法。区分以上不同排序的优、缺点。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
用随机数产生100000个待排序数据元素的关键字值。测试下列各排序函数的机器实际执行时间(至少测试两个):直接插入排序、希尔排序(增量为4,2,1)、冒泡排序、快速排序、直接选择排序、二路归并排序、堆排序和基于链式队列的基数排序。
2、选做题。
假设含n个记录的序列中,其所有关键字为值介于v和w之间的整数,且其中很多关键字的值是相同的。则可按如下方法排序:另设数组number[v…w],令number[i]统计关键字为整数i的纪录个数,然后按number重排序列以达到有序。试编写算法实现上述排序方法,并讨论此种方法的优缺点。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
实验项目名称:查找实验学时:2同组学生姓名:实验地点:实验日期:实验成绩:批改教师:批改时间:
实验8查找。
一、实验目的和要求。
(1)掌握顺序表查找、有序表查找、索引顺序表查找的各种算法。(2)掌握哈希表设计。
二、实验仪器和设备。
visualc++6.0。
三、实验内容与过程(含程序清单及流程图)。
1、必做题。
(1)在一个递增有序的线性表中利用二分查找法查找数据元素x。
2、选做题。
(2)构造一个哈希表,哈希函数采用除留余数法,哈希冲突解决方法采用链地址法。设计一个测试程序进行测试。
提示:构造哈希表只是完成查找的第一步,大家应该掌握在哈希表上进行查找的过程,可以试着编程序实现。程序清单:
四、实验结果与分析(程序运行结果及其分析)。
五、实验体会(遇到问题及解决办法,编程后的心得体会)。
-->。
-->。
-->。
-->
数据结构与算法篇九
为了顺利完成实验教学任务,确保人身、设备的安全,培养严谨、踏实、实事求是的科学作风和爱护国家财产的优良品质,特制定以下实验规则:
1、实验前必须充分预习,完成指定的预习任务。预习要求如下:
(1)认真阅读指导书,进行必要的设计与计算。(2)熟悉实验内容。
(3)预先复习,并按要求编写程序。(4)未完成预习任务者不得进入实验室。
2、遵守以下纪律:
(1)在实验室不得做和实验无关的事情。
(2)进行任课老师指定内容以外的实验,必须经指导教师同意。(3)遵守纪律,不迟到。
(4)保持实验室内安静、整洁,爱护公物,不许乱写乱画。
实验环境。
本实验在386以上的微机上进行,运行环境为vc6.0。
实验报告要求。
1、实验题目2.实验目的3.实验环境。
4.实验内容与完成情况(可以附上自主设计的源程序)5.出现的问题及对问题的解决方案6.实验思考:(学生对本次实验的收获的总结)。
实验一单链表。
(一)一、实验目的。
掌握线性表的链式存储结构及其基本操作。
二、预习要求。
1、看懂书上的算法,深入理解链表的物理存储模式和逻辑模式。
2、根据要求,编写程序准备上机调试。
三、实验内容。
实现一个简单的学生信息管理系统,该系统的功能有:
1、利用单链表建立学生基本信息表。
2、浏览每个学生的信息。
3、根据学号查询某个学生的基本信息。
4、添加学生信息到单链表中。
5、删除一个学生的信息。
四、实现提示。
设计结点的结构体类型,包括学生的学号、姓名、年龄、性别;要求设计一个简单的菜单界面,根据需要选择所要进行的操作;构造函数,每一个函数实现上述的一个功能。
实验二单链表。
(二)一、实验目的。
掌握线性表的链式存储结构及其基本操作。
二、预习要求。
1、看懂书上的算法,深入理解链表的物理存储模式和逻辑模式。
2、根据要求,编写程序准备上机调试。
三、实验内容。
1、实现单链表的就地逆置。
2、建立两个非递减有序单链表,然后合并成一个非递减链表。
3、建立两个非递减有序单链表,然后合并成一个非递增链表。
4、编写一个主函数,调试上述算法。
四、选做题、思考题。
1、如何用带表头结点的单链表作为多项式的存储表示,实现两个多项式的相加。
2、约毖夫环的实现。
3、如何利用文件实现学生信息的存取。
实验三栈。
一、实验目的。
深入了解并掌握栈的特性及其在实际中的应用;熟练掌握栈的算法实现;运用栈操作求解实际问题。
二、预习要求。
1、看懂书上的算法,深入理解栈的特性和存储结构,以便在实际问题背景下灵活运用。
2、根据要求,编写程序准备上机调试。
三、实验内容。
利用栈实现数据的分类,要求当输入为偶数时进栈1,当输入为奇数时进栈2,最后分别从栈1和栈2输出偶数和奇数序列。
四、实现提示。
1、开辟一个连续的存储空间,实现两个栈顺序存储空间的共享;分别在两端设置栈顶指针,并按要求实现栈操作。
2、采用顺序存储实现栈的初始化、入栈、出栈操作。
五、选做题、思考题。
1、两栈空间共享时,栈满的条件是什么?
2、为停车场编制进行管理的模拟程序(习题集p96,2.1)。
3、编写程序,利用栈实现表达式求值。
实验四二叉树。
一、实验目的。
通过实践掌握二叉树的存储结构和遍历思想;掌握二叉树的常见算法的程序实现。
二、预习要求。
二叉树的三种遍历方法。
三、实验内容。
1、输入字符序列,建立二叉链表。
2、利用栈,编写非递归算法,编程实现二叉树的中序遍历。
3、求二叉树的叶子结点个数。
4、在主函数中设计一个简单的菜单,分别调试上述算法。
四、选做题、思考题。
1、如何实现二叉树的后序遍历(非递归)。
2、如何求二叉树的高度。
实验五最短路径(旅游景点导游咨询模拟)。
一、实验目的。
利用图的最短路径原理为用户提供路径咨询,掌握求最短路径的算法并编程实现。
二、预习要求。
学习了解图的存储结构,掌握求最短路径的两种算法。
三、实验内容。
设计一个旅游景点导游模拟程序,为来访的客人提供景点最短路径的信息查询服务,任意选取n城市,构成一个有向带权图,图中顶点表示城市,边上的权值表示两点间的距离,根据用户指定的始点和终点输出相应的最短路径。
四、实现提示。
咨询以用户和计算机的对话方式进行,由用户输入起始点和终点,输出信息:最短路径是多少?并指出所经过的城市。存储结构可选用邻接矩阵。
五、选做题、思考题。
1.如何实现对城市信息进行编辑(如:添加或删除)的功能。
2.用邻接表作存储结构,求一指定景点出发,到其余各景点的最短路径。
实验六内部排序。
一、实验目的。
直观感受算法的关键字比较次数和关键字移动次数。
二、预习要求。
1、常见的排序算法(插入排序、交换排序、选择排序、归并排序、基数排序等)的思想、特点及其适用条件。
2、根据要求,编写程序准备上机调试。
三、实验内容。
1、对直接插入排序和简单选择排序算法进行关键字比较次数和关键字移动次数的比较。
2、利用链式存储结构,编写程序,实现直接插入排序和冒泡排序。
四、实现提示。
测试数据可以为几组典型的数据:正序、逆序、乱序。
五、选做题、思考题。
1、快速排序算法的非递归实现。
2、结合实验,理解针对不同待排元素的特点而选择不同排序方法的重要性。
3、如何对本实验进行时间、空间的复杂度分析。
数据结构与算法篇十
计算机技术已成为现代化发展的重要支柱和标志,并逐步渗透到人类生活的各个领域。随着计算机硬件的发展,对计算机软件的发展也提出了越来越高的要求。由于软件的核心是算法,而算法实际上是对加工数据过程的描述,所以研究数据结构对提高编程能力和设计高性能的算法是至关重要的。
非数值计算问题的数学模型不再是传统的数学方程问题,而是诸如表、树、图之类的数据结构。因此,简单地说,数据结构是一门研究非数值计算的程序设计问题的学科,主要研究数据的逻辑结构、存储结构和算法。
一、教学目的与要求---了解数据的逻辑结构和物理结构;
教学要求在每章教学内容给出,大体上为三个层次:了解、掌握和熟练掌握。他们的含义大致为:了解是正确理解概念,掌握是学会所学知识,熟练掌握就是运用所学知识解决实际问题。
教学目的为:了解算法对于程序设计的重要性;学习掌握基本数据结构的描述与实现方法,熟练掌握典型数据结构及其应用算法的设计。了解算法分析方法。
二、教学重点与难点--数据结构中基本概念和术语,算法描述和分析方法。
1、链表插入、删除运算的算法。算法时间复杂度。
2、后缀表达式的算法,数制的换算。
利用本章的基本知识设计相关的应用问题。
3、循环队列的特点及判断溢出的条件。
利用队列的特点设计相关的应用问题。
4、串的模式匹配运算算法。
5、二叉树遍历算法的设计。
利用二叉树遍历算法,解决简单应用问题哈夫曼树的算法。
6、图的遍历。
最小生成树。
最短路径。
7、二叉排序树查找。
平衡树二叉树。
8、堆排序。
快速排序归并排序。
四、教学内容、目标与学时分配。
教学内容教学目标课时分配。
1、绪论。
逻辑结构与存储结构。
算法和算法分析。
2、线性表。
线性表的定义与运算。
线性表的顺序存储。
线性表的链式存储。
3、栈。
栈的定义与运算。
栈存储和实现。
栈的应用举例。
4、队列。
队列的定义与基本运算。
队列的存储与实现。
队列的应用举例。
5、串。
串的定义与基本运算。
串的表示与实现。
串的基本运算。
6、树和二叉树。
树的定义和术语。
二叉树树的基本概念和术语遍历二叉数和线索二叉树。
二叉树的转换。
二叉树的应用。
哈夫曼树及其应用。
7、图。
图的定义和术语。
图的存储结构。
图的遍历算法。
图的连通性。
8、查找。
查找的基本概念与静态查找动态查找。
哈希表。
了解。
了解。
掌握。
熟练掌握顺序表存储地址的计算。
掌握单链表的结构特点和基本运算。
掌握双链表的结构特点和基本运算。
掌握栈的定义与运算。
掌握栈的存储与实现。
熟练掌握栈的各种实际应用。
掌握队列的定义与基本运算。
熟练掌握队列的存储与实现。
掌握循环队列的特征和基本运算。
了解串的逻辑结构。
掌握串的存储结构。
熟练掌握串的基本运算。
了解。
了解二叉树。
熟练掌握二叉树定义和存储结构。
了解二叉树的遍历算法。
掌握。
掌握哈夫曼的建立及编码。
了解。
了解。
熟练掌握。
熟练掌握。
了解。
熟练掌握。
了解哈希表与哈希方法。
4学时。
1学时。
1学时。
2学时。
8学时。
2学时。
2学时。
4学时。
8学时。
2学时。
2学时。
4学时。
6学时。
2学时。
2学时。
2学时。
6学时。
2学时。
2学时。
2学时。
12学时。
2学时。
2学时。
2学时。
2学时。
2学时。
2学时。
8学时。
2学时。
2学时。
2学时。
2学时。
8学时。
4学时。
2学时。
2学时。
9、排序。
12学时插入排序。
熟练掌握基本思想。
3学时快速排序。
了解各种内部排序方法和特点。
3学时选择排序。
掌握。
2学时各种排序方法比较。
掌握。
2学时。
实验内容实验目标课时分配算法编程实验:
1、用指针方式编写程序复习c(c++)语言指针、结构体等的用法。
2、对单链表进行遍历。
链表的描述与操作实现。
3、栈及其操作。
描述方法及操作。
4、编写串子系统1串的特点及顺序定长存储、操作、查找。
5、编写串子系统2串的特点及顺序定长存储、操作、查找。
6、编写树子系统1二叉树的特点及存储方式、创建、显示、遍历等。
7、编写树子系统2二叉树的特点及存储方式、创建、显示、遍历等。
8、图子系统。
图的邻接矩阵的存储、遍历、广度/深度优先搜索。
9、查找子系统。
理解查找基本算法、平均查找长度、静态、动态查找等。
五、考试范围与题型。
1、考试范围与分数比例。
1)绪论。
12%2)线性表。
17%3)栈。
7%4)队列。
6%5)串。
4%6)树和二叉树。
14%7)图。
15%8)查找。
4%9)排序。
21%。
2、考试题型与分数比例。
1)名词解释。
18%2)判断对错。
16%3)填空。
16%4)单项选择。
18%5)应用。
32%。
六、教材与参考资料。
1、教材:实用数据结构基础(谭浩强)中国铁道出版社。
2、参考资料:数据结构(严蔚敏)清华大学出版社。
(撰写人:
审核人:2学时2学时2学时2学时2学时2学时2学时2学时2学时)。
数据结构与算法篇十一
谈到计算机方面的专业课程,我觉得数据结构算是一门必不可少的课了,它是计算机从业和研究人员了解、开发及最大程度的利用计算机硬件的一种工具。数据结构与算法分析是两门紧密联系的课程,算法要靠好的数据结构来实现,二者的关系是密不可分的,谈到算法不得不讲数据结构,谈数据结构也不可避免的要了解算法,好的算法一定有一个好的数据结构,很多算法实际上是对某种数据结构实行的一种变换,研究算法也就是研究在实行变换过程中数据的动态性质。这两门课程分别是我在大二和研一的时候学的,因为它们密切的联系,这里将其放在一起总结如下。
什么是数据结构呢?研究数据的逻辑结构和存储结构(物理结构)以及它们之间的关系,且为该结构定义相应的运算设计相应的算法。这里的数据是指可输入到计算机能被程序处理的符号的集合。其中,数据的逻辑结构是指数据之间逻辑关系的描述,逻辑结构的分类有线性结构、树形结构和图结构。数据的存储结构是指数据在计算机中存储结构,也称为物理结构,它有4类基本的存储映射方法:1.顺序的方法;2.链接的方法;3.索引的方法;4.散列的方法。在程序设计语言中,数据结构直接反映在数据类型上,比如一个整型变量就是一个节点,根据类型给他分配内存单元。抽象数据类型:一组值以及在这些值上定义的操作集合,它是描述数据结构的一种理论工具,其特点是把数据结构作为独立于应用程序的一种抽象代数结构。
线性表结构:由一系列元素组成的有序的序列,除了第一个元素和最后一个元素外,每个元素都只有一个直接前趋和直接后继,元素的个数称为线性表的长度。它的存储方式有顺序存储和链式存储。顺序存储方式它的优点是存储单元是连续的,适合快速访问元素内容,链表的特点是动态申请内存空间,并通过指针来链接结点,按照线性表的前驱关系把一个个结点链接起来,这样可以动态地根据需要分配内存空间,经常用于插入新结点或删除节点的需要,链表还可以根据结点中指针个数分为单链表、双链表、循环链表等。在线性表结构中有两类特别的线性表:栈和队列。栈是一种限制访问端口的线性表,常称为后进先出表。正是这种特殊的性质使得栈的用途非常广泛,比如在计算表达式的值时处理运算符的先后次序,另外一个大的用处就是递归了,hanoi塔就是最典型的用了递归的思想,在算法中,也有很多运用递归思想的例子。队列也属于限制访问点的线性表,它的特点就是加入和删除元素都只能在队列的一端进行,即队列首出,队列尾进,最大的特点是先来先服务,先进先出。因为这个特点,队列常被用作消息缓冲器。
在算法设计中,顺序表主要用于检索,而利用栈中的递归思想在算法中则应用非常广泛,如递归排序,分治算法等。
树结构:是一种非常重要的非线性数据结构,它是由一个根结点和若干叶结点组成的树状结构,除了根结点每个结点只能有一个父节点,可以有若干子结点,若干个树结构还可以构成森林,树的存储结构也分为顺序存储和链式存储,最典型的是左孩子右兄弟法。在树结构中比较重要的算法就是周游(遍历)树,有先根次序、后根次序以及中根次序。树结构中有几类非常重要的特殊树结构,如二叉树,b树,b+树等,其中,二叉树应用最为广泛。
二叉树:是指每个结点最多有两个子结点的树结构,具体细分,根据叶子结点的特性可分为满二叉树、完全二叉树等。二叉树的遍历也分为深度优先和广度优先。另外,二叉树有几条非常重要的性质,这也使得它的应用非常广泛。
在算法设计中,典型的利用树的深度优先遍历的算法是回溯法,而典型的广度优先搜索算法是分枝定界法。
图:是一种较线性表和树更为复杂的数据结构。一般来讲,数据的逻辑结构可表示为结点的有穷集合k和k上的一个关系r,如果对k中结点相对于r的前驱、后继个数加以限制,则可以分别定义线性结构、树形结构和图结构,即:
图结构:不限制前驱的个数,亦不限制后继的个数,反映一种网状关系。
通常用g=(v,e)代表一个图,其中v是顶点集,e是边集。图分为有向图和无向图,图的存储方式有邻接表和邻接矩阵法。和树类似的,图中也需要周游,同样有深度优先搜索和广度优先搜索,而比树的周游要更复杂,也更重要。在这一块中,有两种比较典型的求最短路径和最小支撑树的算法需要注意,它们分别是dijkstra算法和prim算法。另外需要注意的是图的连通性。
在算法设计中,典型的用到图论的算法有贪心算法和动态规划算法。
(1)输入:有零个或多个由外部提供的量作为算法的输入。(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰的,无歧义的。(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
我们研究一个算法或者评价一个算法主要是通过估计该算法的复杂性,包括时间复杂性和空间复杂性。空间复杂性是指使用该算法的程序在运行时需要占用多少内存空间,具体包括指令空间、数据空间和环境栈空间。时间复杂性是指执行该程序所需要的时间量级,通常是估算的时间,包括编译时间和运行时间。同时评价一个算法的好坏还要看其时间复杂性和空间复杂性随着输入规模的增长趋势,一般能接受的最好是线性增长。在算法设计这本书中,每介绍一个算法都会分析其算法复杂度,由此可看出它的重要性。
首先,从递归的分治算法开始。分治算法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归的解这些子问题,然后将各个子问题的解合并得到原问题的解。该算法的主要应用有大整数乘法,矩阵乘法、合并排序等。可以大大降低算法的时间复杂度,但使用递归栈可能增加程序的空间规模。
动态规划算法和贪心算法:与分治算法类似,动态规划的基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治算法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是相互独立的。动态规划算法适用于解最优化问题。通常可按以下4个步骤:
(1)找出最优解的性质,并刻画其结构特征。(2)递归的定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
动态规划算法的基本要素是最优子结构性质和子问题重叠性质。
最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
子问题重叠性质。子问题重叠性质是指在用递归演算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
另外一点要素是备忘录方法,它作为动态规划算法的变形,用表格保存已解决问题的答案,在下次需要解此子问题时,只要简单查看子问题的解答,而不必重新计算。与动态规划不同的是备忘录方法的递归是自顶向下的,而动态规划则是自底向上的。
动态规划算法设计策略典型的应用案例有:矩阵连乘、最大字段和、流水作业调度等。有时满足动态规划条件的问题可以有更好的算法,比如贪心算法。贪心算法即总是做出在当前看来是最好的选择。也就是说贪心算法并不从整体最优上加以考虑,它所做的总是做出的选择只是在某种意义上的局部最优。这种启发式的策略并不能总是奏效,然而对某些特定的问题确能达到预期目的。比如活动安排的例子。
贪心算法的基本要素主要有贪心选择性质和最优子结构性质。所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法与动态规划的主要区别,它们的共同点是都要求问题具有最优子结构性质。
贪心算法的典型案列是:活动安排、最优装载问题、最短路径和最优生成树问题。回溯法和分枝定界法:回溯法有“通用的解题法”之称。用它可以系统的搜索一个问题的所有解或任一解。它在问题的解空间树中,按深度优先策略,从根节点出发搜索解空间树。其算法框架包含递归回溯和迭代回溯,两个特别的解空间树为子集树和排列树。典型的回溯法的案例有:批处理作业调度、图的m着色、旅行售货员问题、0-1背包问题等。
分枝定界法类似于回溯法,也是在问题的解空间上搜索问题解的算法。一般情况下,分治定界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间中满足约束条件的所有的解,而分枝定界法的求解目标则是找出满足约束条件的一个解,或是满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。由于求解目标不同,导致分支定界法与回溯法对解空间的搜索方式也不相同。回溯法以深度优先的方式搜索解空间,而分枝定界法则以广度优先或以最小耗费优先的方式搜索解空间。
另外,在算法分析中一定要提的是np问题。首先需要介绍p(polynomial,多项式)问题.p问题是可以在多项式时间内被确定机(通常意义的计算机)解决的问题。np(non-deterministicpolynomial,非确定多项式)问题,是指可以在多项式时间内被非确定机(他可以猜,他总是能猜到最能满足你需要的那种选择,如果你让他解决n皇后问题,他只要猜n次就能完成----每次都是那么幸运)解决的问题.这里有一个著名的问题----千禧难题之首,是说p问题是否等于np问题,也即是否所有在非确定机上多项式可解的问题都能在确定机上用多项式时间求解。
np完全(npcomplete,npc)问题是指这样一类np问题,所有的np问题都可以用多项式时间划归到他们中的一个。所以显然np完全的问题具有如下性质:它可以在多项式时间内求解,当且仅当所有的其他的np-完全问题也可以在多项式时间内求解。这样一来,只要我们找到一个npc问题的多项式解,所有的np问题都可以多项式时间内划归成这个npc问题,再用多项式时间解决,这样np就等于p了。
小结一下,在算法设计这么课中学了这么几大类典型的算法,里面也涉及到具体的应用案例,但我觉得学算法的目的远不是学会这几种固定的特殊问题的解法而已,事实上领会这些巧妙算法背后的思想然后学会迁移到其他新的问题中去才是领会了算法设计的精髓。

一键复制