数据结构和算法
Master.Jiang
这个作者很懒,什么都没留下…
展开
-
求最大连续和的几种方法
本文内容参考《算法竞赛入门经典第2版》220~223页Q:给出一个长度为nnn的序列A1,A2,A3,⋯ ,AnA_{1},A_{2},A_{3},\cdots,A_{n}A1,A2,A3,⋯,An,求最大连续和。换句话说,要求找到1≤i≤j≤n1\leq i\leq j \leq n1≤i≤j≤n,使得Ai+Ai+1+⋯+AjA_{i}+A_{i+1}+\cdots+A_{j}Ai+Ai+1+⋯+Aj尽量大。方法一:暴力枚举,时间复杂度O(n3)O(n^{3})O(n3)ans=A[原创 2020-10-15 09:35:14 · 841 阅读 · 0 评论 -
按行遍历和按列遍历哪一个更快一些?
如有错误欢迎指正!今天(9月7日)上午《计算机操作系统》课上老师提出一个问题:按行遍历和按列遍历哪一个运行时间更短一些?我周围的同学大部分认为按行遍历更快一些,可能是受到C语言写for循环时习惯于先循环行再循环列的影响。之前看过一篇文章,里面提到了按行遍历和按列遍历哪个快取决于使用的语言类型,同时,在做深圳杯大作业的时候,通过查阅资料偶然发现了MATLAB中优化代码运行时间的其中一个方法是for循环要用按列遍历。下面用程序检验一下。v1:C语言版本,分别输出不同大小矩阵、不同遍历方式下的运行时间。原创 2020-09-16 22:31:02 · 3857 阅读 · 1 评论 -
数据结构与算法(按目录缩进的形式输出二叉树)
假设二叉树的数据元素为字符,采用二叉链式存储结构。二叉树ADT实现的大部分代码已经给出,其中二叉树采用完全前序序列创建。请补充一个二叉树的输出函数,要求按目录缩进的形式输出一棵二叉树,同时要输出目录的层次。层次占2位、元素占1位,间隔4个位置(即共占7个位置)。 注意:答案区只写指定补充的函数代码,其他给定的代码不允许重写、修改和提交!例如:有如右图的二叉树输入:ABD@@E@@C@F@@输出: 1A 2B 3D原创 2020-06-10 16:14:56 · 1644 阅读 · 1 评论 -
数据结构与算法(以前序顺序输出二叉树各个结点的高度)
假设二叉树的数据元素为字符,采用二叉链式存储结构。二叉树ADT实现的大部分代码已经给出,其中采用完全前序序列创建二叉树。请补充写出下列两个操作函数。 注意: 答案区只写出两个函数,其他代码不允许修改和重写、提交!(1)计算以某结点为根的二叉树的高度;(2)以前序顺序输出各个元素结点为根的子树的高度;例如:有如右图的二叉树输入:ABD@@E@@C@F@@输出:Height(A)=3Height(B)=2Height(D)=1Height(E)=1Height(C)=2Heigh原创 2020-06-10 16:11:10 · 631 阅读 · 0 评论 -
数据结构与算法(贪心策略的应用:活动安排问题)
假设有n个活动的集合E={a1,a2,…,an},其每个活动都要求使用同一资源(如某个设备、教室、场地等),而在同一时间内只允许一个活动使用这一资源。每个活动都有一个要求使用该资源的起止时间si,fi,且si<fi。如果选择了活动ai,则它在半开的时间区间[si,fi)内占有资源。两个活动ai,aj称为是相容的,当且仅当它们的时间区间[si,fi)和[sj,fj)不相交,即si>=fj 或 sj >=fi。现要求在所给定的活动集中选出最大的相容活动子集。(提示:贪心策略)主函数已经给出原创 2020-06-10 16:04:21 · 744 阅读 · 0 评论 -
数据结构与算法(分治策略)
分治策略是算法设计的重要策略之一,该策略的基本思想是把问题进行分解成一些子问题,通过子问题的求解完成对原问题的求解。其关键是分解和合并,好的分解或合并方法才会产生高效的分治算法。分治策略设计出的算法最常见的就是递归算法。但是如果在分解时,分解出的子问题有很多是重复的,那么这样的分治(递归)算法求解问题的效率就非常低。例如斐波那契数问题,如果采用递归求解,算法效率非常低:O( 2^n )。而如果采用递推求解(动态规划自底向上求解),算法效率非常高:O(n)。现在请你编写程序,统计计算一个斐波那契数时分解出原创 2020-06-10 15:59:35 · 495 阅读 · 0 评论 -
数据结构和算法(图结构)
假设无向、非加权图的数据元素为字符,采用邻接表存储结构。图的创建、存储结构输出等大部分操作的实现代码操作已经给出,请分别补充写出操作插入边、删除边的实现函数代码。有关说明:(1)插入边, int Insert_Edge(g,vi,vj)输入:图g,要插入边的两个顶点元素vi,vj;输出:返回插入的状态(成功、错误:边顶点不存在、错误:边重复),根据不同的状态会输出:Error:Vertex does not exist! 或Error:Edge repetition! 或Edge原创 2020-06-10 15:55:46 · 734 阅读 · 0 评论 -
优先队列ADT的实现
优先队列是一种特殊的队列,基于二叉堆实现,在插入、删除元素上具有较好的算法性能。由于二叉堆的高度为logN,故在插入、删除元素时最多调整logN次,时间复杂度为O(logN)。给出优先队列ADT的代码,其中priority_judge为优先级判断,一般来说,在插入操作时,优先级较高的应往堆顶调整,优先级低的应该往堆底调整。在调整元素时,为了排除常数的影响,首先将要调整的目标元素备份,然后依次将要调整的元素与该元素比较,具体来说,在插入元素时,我们采用的是上滤的思想,因此在调整过程中,从堆底比较子节点与父节原创 2020-05-19 21:54:52 · 796 阅读 · 0 评论 -
数据结构与算法:图ADT的基本实现
假设图结构具有n个元素(顶点,n不大于500),数据元素为字符,如果是加权图,权值为整数。请编码实现图ADT。存储结构的选择: 1: 邻接矩阵 2: 邻接表执行的操作:1:创建图2:输出图的存储结构(邻接矩阵或邻接表,格式见后面说明)3:计算各个顶点的度(有向图时,分为入度和出度)4:深度遍历(需要输入遍历开始顶点)5:广度遍历(需要输入遍历开始顶点)0:退出注:(1)图的类型分为4种,1:无向,不加权2:有向,不加权3:无向,加权4:有向,加权(2)边用一对顶点元素原创 2020-05-18 00:05:42 · 2152 阅读 · 0 评论 -
数据结构与算法:二叉树的建立和输出
问题描述:假设二叉树的元素为字符,采用二叉链式存储。请编写算法完成:(1)已知二叉树的中序和后序遍历序列,创建二叉树;(2)实现二叉树的分层输出;输入有三行:第一行,一个整数n,是二叉树中的元素(结点)个数;第二行,二叉树的中序遍历序列第三行,二叉树的后序遍历序列输出:如果二叉树为空,则输出“Binary tree is empty!”如果二叉树不空,则二叉树有几层则输出几行:...原创 2020-05-05 23:20:20 · 1222 阅读 · 0 评论 -
数据结构与算法:算术表达式的语义二叉树
一个算术表达式的计算语义可以用二叉树唯一的表示出来。假设算术表达式的语义二叉树已经给出,请编码实现算术表达式的中缀形式(保持计算语义)的输出,并计算出该表达式的值。要求:1)使用二叉树的完全前序序列建立表达式的语义二叉树,空子树用符号@表示;2)算术运算符包括:+, -, * , / ; 运算量只考虑单数字字符(1位整数)3 ) 输出时用括号该表优先级;4) 如果结果有小数,小数点后...原创 2020-05-05 23:18:18 · 1061 阅读 · 0 评论 -
数据结构与算法:二叉树ADT的二叉链式实现
假设二叉数的数据元素为字符,采用二叉链式存储结构。请编码实现二叉树ADT,其中包括创建二叉树、遍历二叉树(深度、广度)、求二叉树的深度(高度)、计算二叉树的元素个数、计算二叉树的叶子数、二叉树的格式输出等。根据输入的符号,执行相应的操作。如下:C:创建二叉树,创建成功输出 “Created success!”。要求实现两种创建算法。输入数字“1" ,是根据完全前序序列创建二叉树,#表示空结点(...原创 2020-05-05 23:15:34 · 662 阅读 · 0 评论 -
数据结构与算法:堆栈ADT实现及应用
假设栈ADT的数据元素为整数,栈ADT的实现采用顺序存储结构。现要用栈来辅助完成任意非负十进制整数到Base(Base不大于35)进制的转换。部分代码已经给出,请补充完善栈溢出处理函数和主函数。 注意:只提交需要补充的函数,其他代码不允许自己重写和修改。栈溢出处理函数overflowProcess:当栈满时,将栈的空间在原来基础上扩大1倍。主函数: 输入一个非负十进制整数n及要转换的进制Ba...原创 2020-04-29 14:20:02 · 1028 阅读 · 1 评论 -
数据结构与算法:线性表ADT实现
假设线性表ADT的数据元素类型为正整数,采用带头结点的单链式存储结构。线性表ADT实现的大部分代码已经给出,请补充写出类的两个成员函数insert和reverse。 注意:只需提交需要补充的函数代码,其他代码不能自己重写和修改。insert函数:在元素值从小到大有序的线性表中插入一个元素,仍然保持有序。reverse函数:实现线性表元素的倒置,即将线性表中数据元素的顺序反转。线性表元素输入...原创 2020-04-29 14:14:50 · 1835 阅读 · 0 评论 -
数据结构与算法:稀疏矩阵ADT的实现
在现实应用中,一些规模很大的特殊矩阵具有重要的地位。特殊矩阵可以采用二维数组存储,简单直接(顺序存储方式保持了矩阵中元素之间的二维线性关系),矩阵操作的算法都很简单,但是其空间的利用率很低(因为重复元素或零元素比较多)。 稀疏矩阵就是一种应用很广泛的特殊的矩阵,在实现稀疏矩阵ADT时通常采用“压缩”存储方案,即把只存储稀疏矩阵的非零元素,把稀疏矩阵抽象成为一个以三元组(行,列,值)为数据元素的线性...原创 2020-04-20 00:00:48 · 834 阅读 · 0 评论 -
栈ADT应用:中缀表达式求值
表达式求值是进行数据处理的最基本操作。请编写程序完成一个简单算术表达式的求值。要求如下:(1) 运算符包括:+、-、*、-、^(乘方)、括号(2)运算量为数值常量,根据自己的能力可以对运算量做不同的约束,例如1位整数、多位整数、实数等(会有不同的测试用例);输入:一行,即表达式,以“=”结束。例如:5*(8-3)+6/5=输出:一行,即表达式的值。结果值为整数时输出为整数,如果有小数时...原创 2020-04-08 00:40:07 · 400 阅读 · 0 评论 -
栈ADT应用:对称符号匹配判断
输入一行符号,以#结束,判断其中的对称符号是否匹配。对称符号包括:{ } 、 [ ] 、 ( )、 < >输出分为以下几种情况:(1)对称符号都匹配,输出 “ right. “(2) 如果处理到最后出现了失配,则输出两行:第一行:Matching failure.第二行:loss of right character $$ … 其中"$$ “… 是按嵌套顺序对应的右匹配...原创 2020-04-08 00:39:49 · 242 阅读 · 0 评论 -
数据结构与算法实验:一元多项式的基本运算
实验目的:掌握用线性表实现一元多项式的基本运算。实验内容:使用链式存储实现一元多项式的加法、减法、乘法和求导。即:C(x)= A(x)+B(x);C(x)= A(x)-B(x) C(x)= A(x)*B(x) C(x)= A’(x)菜单:1)C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入,遇到系数为0则停止。例如:输入 :1 2 3 4 5 6 7 8...原创 2020-04-06 10:58:38 · 2737 阅读 · 3 评论 -
数据结构和算法——线性表(链式存储)
线性表是最常见和常用的ADT。假设线性表的元素为整数,请基于单链式存储结构实现线性表ADT。基本功能包括:(1)建立线性表;输入有两行:第一行一个整数,是输入元素的结束标志,例如0,则在输入结束时输入0,就表示输入结束了。第二行是线性表的各个元素,最后一个是结束标志。(2)插入:输入两个整数,即元素插入的位置和元素值(3)删除:输入一个整数,即要删除的元素值(4)搜索:输入一个整...原创 2020-04-06 10:56:52 · 958 阅读 · 0 评论 -
数据结构和算法——线性表(顺序存储)
线性表是最常见和常用的ADT。假设线性表的元素为整数,请基于顺序存储结构实现线性表ADT。基本功能包括:(1)建立线性表;输入有两行,第一行是一个整数n,线性表的长度; 第二行是n和数据元素(2)插入:输入两个整数,即元素插入的位置和元素值(3)删除:输入一个整数,即要删除的元素(4)搜索:输入一个整数,即搜索元素的值(5)输出:输出线性表的各个元素,空格分开。(6)集合的...原创 2020-04-06 10:56:34 · 497 阅读 · 0 评论 -
常见的存储结构及其优缺点
逻辑关系映射到物理存储的映射方式有4种:顺序、链式、索引、哈希,相应地就产生了四种存储结构:顺序存储结构、链式存储结构、索引存储结构、哈希存储结构。顺序存储特点:存储空间的地址连续,数据元素依次存放;利用物理相邻表示(存储)逻辑关系。优点:存储密度大;可以随机访问,在O(1)内查询、修改元素。缺点:表示关系能力弱;维护关系困难(逻辑关系发生变化,物理上难同步),在O(n)内插入和删除数据...原创 2020-03-24 01:29:47 · 11118 阅读 · 0 评论 -
链表类(数据结构与算法练习题)
链表类的定义和部分成员函数实现已经给出。请根据main函数中的调用,补充输出和删除两个成员函数。输入时,根据endtag确定是否结束输入;删除时,位置是从0开始;注意:输入的顺序跟存放的顺序以及输出的顺序是相反的。//***************************************************************************************...原创 2020-03-08 17:39:33 · 510 阅读 · 0 评论