算法与数据结构

数据结构复习————递归与栈

拈花ヽ惹草 提交于 2019-12-07 04:43:39
递归的定义: 若一个对象部分的包括它自己,或用它自己给自己定义,则称这个对象是递归的,递归也可定义为,在一个过程中直接或间接的调用自己,则这个过程也是递归的。 能采用递归算法的问题的特征: 当一个问题具有以下三个特征时,就可以用递归算法。 1)大问题能分解成若干个子问; 2)子问题或是一个定值(直接解),或是与大问题具有相同性质的问题仅仅是规模比大问题小,即被定义项在定义中应具有更小的尺度; 3)子问题在最小尺度上有直接解,即分解过程能最终能结束(递归有结束条件)。 举个列子,比方说求n!(n为自然数)。正常人为的求解可能是1x2x3x—(n-1)xn。但这个问题可以分为两种情况考虑: (1)当n=0时,n!=1 (2)当n>0时,n!=nx(n-1)! 再对照上述的三个条件,n!分为一个子问题n(为一个定值),和另一个规模比n!小的问题(n-1)!满足1),2)两个条件。再者(n-1)!可以继续分:(n-1)!=(n-1)x(n-2)!=(n-1)x(n-2)x(n-3)!=—,—x2x1!。而1!就等于1,所以子问题在最小尺度上有直接解,满足条件3)。其递归函数如下所示: int fact( int n){ if (n== 0 ) /*递归结束条件*/ return 1 ; else return (n*fact(n- 1 )); } 递归与栈的关系: 那么就产生问题呢

数据结构 算法(Algorithm)

谁都会走 提交于 2019-12-06 19:16:45
算法(Algorithm)    一个有限指令集    接受一些输入(有些情况下不需要输入)    产生输出    一定在有限步骤之后终止    每一条指令必须    有充分明确的目标,不可以有歧义    计算机能处理的范围之内    描述应不依赖于任何一种计算机语言以及具体的实现手段    例子:    void SelectionSort(int List[],int N)    {/*将N个整数List[0]...List[N-1]进行非递减排序*/    for( i = 0;i < N; i++){    Minposition = ScanForMin(list,i,N-1)    从Lsit[i]到List[N-1]中找最小元,并将其位置赋给MinPosition;    Swap(List[i],List[MinPostion]);    将未排序部分的最小元换到有序部分的最后位置;    }    }    抽象-    List到底是数组还是链表(虽然看上去很像数组)?    Swap用函数还是用宏去实现?    什么是好的算法    空间复杂度S(n)--根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。    时间复杂度T(n)-

《数据结构与面向对象程序设计》实验9报告

半腔热情 提交于 2019-12-06 16:27:19
学号 20182329 2019-2020-1 《数据结构与面向对象程序设计》实验9报告 课程:《程序设计与数据结构》 班级: 1823 姓名: 李一卓 学号:20182329 实验教师:王志强 实验日期:2019年12月3日 必修/选修: 必修 1.实验内容 实现二叉排序树,并学会编写删除、添加、插入,还有二叉排序树的遍历 学习图的有关知识,了解有向图和无向图的区别, 学习带权图,学会计算带权图的算法,最佳的算法。 学习图的各种遍历,比如深度优先遍历和广度优先遍历。 学习生成最小树的方法 学会生成图的邻接矩阵的方法,还有计算每个节点的出度入度方法实现 学会每个图的计算度的方法,还有不通过遍历进行的。 完成有向图的单源最短路径求解(迪杰斯特拉算法)。 2. 实验过程及结果 初始化:根据屏幕提示,初始化无向图和有向图(可用邻接矩阵,也可用邻接表),图需要自己定义(顶点个数、边个数,建议先在草稿纸上画出图,然后再输入顶点和边数),我首先根据自己的邻接矩阵实现图。 初始化: public Graph(List<Vertex> vertexs, int[][] edges) { this.vertexs = vertexs; this.topVertexs=new ArrayList<GRAPGAPI.Vertex>(); this.edges = edges; this.minTree

redis六种基本数据结构

天大地大妈咪最大 提交于 2019-12-06 15:18:43
1.sds(simple dynamic string)简单动态字符串 12345 struct sdshdr { int len; //buf中已占用空间的长度 int free; //buf中剩余可用空间的长度 char buf[]; //初始化sds分配的数据空间,而且是柔性数组(Flexible array member)} 定义: sds.h定义了字符串的已使用的长度,剩余空间,已经初始化分配的空间大小 sds.c定义了内存申请、回收策略 预分配策略,字符串修改后。如果表头len小于1M,则扩容len相同的空间。free和len大小相同。否则扩容固定大小为1M的空间。 回收策略,惰性空间释放,当要缩短字符串时并不是立即释放全部空间,而是修改头文档len的长度,待之后使用。 优点: 时间复杂度为O(1) 因为表头存放字符串len,可以根据长度直接获取整个字符串 杜绝缓冲区溢出 C语言中使用strcat进行字符串拼接,如果没分配足够的空间就会导致缓冲区溢出。Redis会先判断len长度,自动扩容满足空间需要。 兼容C部分函数 使用字符串/0结尾与C语言相同 二进制安全性 支持存放图片,视频二进制文档。传统字符串当遇到/0就结束了,所以不能存放图片视频二进制文档 2.链表 12345678 typedef struct listNode{ //前置节点 struct

1.数据结构与算法概论

梦想的初衷 提交于 2019-12-06 14:14:11
1.数据结构 1.1引入 为什么要学习数据结构? 随着计算机的不断发展,计算机处理的数据不再是单纯的 数值数据 ,而更多的是 非数值数据 。 如果仅在程序设计上花费功夫,而不去考虑数据的组织,那么,对大量的数据处理将会十分低效, 有时甚至无法进行。( 程序=数据结构+算法 ) 1.2数据结构的定义 数据结构(data structure):一种在计算机上能有效 储存 、 组织 、 使用资料 的方法。 数据的逻辑结构(数据之间的内在联系) 数据的储存结构(数据的储存方式) 数据的运算集合(定义在数据的逻辑结构之上,具体实现依赖于数据的储存结构) 数据结构讨论的是数据的 逻辑结构 、 储存方式 以及 相关操作 。 1.3常见的数据结构 栈(Stack) 队列(Queue) 数组(Array) 链表(Linked list) 数(Tree) 图(graph) 堆(heap) 散列表(hash table) 2.算法 2.1算法的定义 算法(algorithm):适用于 计算机实现 的解决问题的方法。 算法的5个特征 有限性:算法的执行必须在有限步内结束。 确定性:算法的每一个步骤必须是确定的、无二义性的。 输入:算法可以有0或多个输入。 输出:算法有一定的输出结果 可行性:算法中的运算都必须是可以实现的。 2.2算法的时间和空间复杂度 算法的时间复杂度(Time complexity

数据结构与算法2.1_MOOC笔记

限于喜欢 提交于 2019-12-06 13:45:25
2.1线性表 简称表,是零个或多个元素的有穷序列 表目:表中的元素 索引(下标):i称为ki的下标 表的长度:所含元素个数n 空表:长度为0(n=0) 特点:操作灵活,其长度可以增长、缩短 适用于小规模数据 线性结构 为前驱/后继关系,有反对称性和传递性 有一个唯一的开始节点,没有前驱,有一个唯一的直接后继 有一个唯一的终止节点,有一个唯一的直接前驱,没有后继 其它节点皆称为内部节点,每一个内部节点都有一个唯一的直接前驱,也有一个唯一的直接后继 <ai,ai+1>ai是ai+1的前驱,ai+1是ai的后继 特点: 均匀性:元素必定具有相同的数据类型和长度 有序性:各元素之间的相对位置是线性的 按复杂程度划分 简单的:线性表、栈、队列、散列表 高级的:广义表、多维数组、文件...... 按访问方式划分 直接访问型(Direct Access):根据下标访问(数组) 顺序访问型(Sequential Access):顺序查找(链表) 目录索引型(Directory Access):有效索引(字典,散链) 按操作划分 线性表 所有表目都是同一类型节点的线性表 不限操作形式 根据存储的不同分为:顺序表,链表 栈(LIFO,Last In First Out) 插入和删除操作都限制在表的同一端进行 队列(FIFO,First In First Out) 插入操作在表的一段,删除操作在另一端

数据结构算法基础

我与影子孤独终老i 提交于 2019-12-06 12:09:05
算法是一个逐步的过程,它定义了一组指令,这些指令按特定顺序执行以获得所需的输出。算法通常独立于底层语言创建,即算法可以用一种以上的编程语言实现。 从数据结构的角度来看,以下是一些重要的算法类别 - 搜索 - 搜索数据结构中的项目的算法。 排序 - 按 特定顺序对项目进行 排序的 算法。 插入 - 在数据结构中插入项的算法。 更新 - 更新数据结构中现有项目的算法。 删除 - 从数据结构中删除现有项目的算法。 算法的特征 并非所有过程都可以称为算法。算法应具有以下特征 - 明确 - 算法应清晰明确。 它的每个步骤(或阶段)及其输入/输出应该是清楚的,并且必须只有一个含义。 输入 - 算法应具有0个或更多明确定义的输入。 输出 - 算法应具有1个或多个明确定义的输出,并且应与所需的输出匹配。 有限性 - 算法必须在有限数量的步骤之后终止。 可行性 - 利用现有资源应该可行。 独立 - 算法应具有逐步指导,这应该独立于任何编程代码。 如何编写算法? 编写算法没有明确定义的标准。相反,它是问题和资源依赖的。永远不会编写算法来支持特定的编程代码。 我们知道所有编程语言都共享基本代码结构,如循环(do,for,while),流控制(if-else)等。这些常用结构可用于编写算法。 我们一步一步地编写算法,但情况并非总是如此。算法编写是一个过程,在问题域定义明确后执行。也就是说

数据结构绪论

耗尽温柔 提交于 2019-12-06 11:43:32
一、基本概念 数据:是指所有能输入到计算机中并被计算机程序处理的符号的总称,是计算机加工的“原料”。 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据项:一个数据元素可由多个数据项组成。数据项是数据的不可分割的最小单位。 关键字:能识别一个或多个数据元素的数据项。若能起唯一识别作用,则称之为 “主” 关键字,否则称之为 “次” 关键字。 数据对象:是性质相同的数据元素的集合,是数据的一个子集。 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。 四类基本结构: 集合:数据元素间除“同属于一个集合”外,无其它关系。 线性结构:数据元素间存在一个对一个的关系。 树形结构:数据元素间存在一个对多个的关系。 图形结构:数据元素间存在多个对多个的关系。 逻辑结构 :对数据元素之间存在的逻辑关系的描述。可以用一个数据元素的集合和定义在此集合上的若干关系表示。 物理结构/存储结构 :数据逻辑结构在计算机中的表示和实现。包含数据元素的映象和关系的映象。 数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构。 顺序存储结构:把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。通常顺序存储结构是借助于语言的数组来描述的。 链式存储结构:不要求逻辑上相邻的结点物理上也相邻

大话数据结构笔记——第二章 数据结构绪论

痞子三分冷 提交于 2019-12-06 11:00:50
第二章 算法 算法 是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法(Algorithm)这个单词最早出现在波斯数学家阿勒·花刺子密在公元825年(相当于中国的唐朝时期)所写的《印度数字算术》中。 2.1 算法的特性 算法具有5个基本特性:输入、输出、有穷性、确定性和可行性。 2.1.1 输入输出 算法具有零个或多个 输入 。 算法至少有一个或多个 输出 。 2.1.2 有穷性 算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。 2.2.3 确定性 算法的每一步骤都具有确定的含义。 2.2.4可行性 算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。 2.2 算法设计的要求 2.2.1 正确性 算法的 正确性 是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。 分为 四个层次 (层次4验证复杂,代价较高,一般情况下以层次3为判断算法是否正确的标准): 1.算法程序没有语法错误。 2.算法程序对于合法的输入数据能够产生满足要求的输出结果。 3.算法程序对于非法输入数据恩能够得出满足规格说明的结果。 4.算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。 2.2.2 可读性 算法设计的另一个目的是为了便于阅读

数据结构和算法之——算法复杂度分析

末鹿安然 提交于 2019-12-06 10:59:01
1. 何为数据结构?何为算法? 简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上;栈是先进后出,队列是先进先出。 而算法则是对这些数据的操作方法,比如数据的插入、查找、删除、排序等。 二者相辅相成,互为一体,数据结构为算法服务,而算法要在指定数据结构上进行操作。 2. 复杂度分析? 学习数据结构和算法的目的是为了在实际应用的时候更加优化地利用内存,提高程序运行效率,而复杂度分析则是给我们提供一个衡量代码质量好坏的标准。 如果我们在不运行程序的情况下就可以定性知道代码的内存占用和时间消耗,这将会给我们提供一个当前程序的总体评估和未来的改进方向。 直接运行程序就可以知道算法的执行时间和占用内存,但这个过程往往会受到运行环境和数据规模的影响,因此,我们需要一个不用进行具体测试就可以粗略估计算法执行效率的方法,这就是复杂度分析。 3. 时间复杂度 3.1 大 O 复杂度表示法 int cal(int n) { int sum = 0; int i = 1; for (; i <= n; ++i) { sum = sum + i; } return sum; } 我们假设每行代码的运行时间为 t,则第一二行代码需要时间为 2 * t,第三四行代码需要时间为 2n * t,总时间为 (2n+2) * t