算法与数据结构

数据结构--循环队列

匿名 (未验证) 提交于 2019-12-02 23:56:01
一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着, 队列 中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n)。 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等。 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front等于rear时,此队列不是还剩一个元素,而是空队列。 对于队列 最好的方法是使用链表实现 ,因为对于数组来说,队列可能会出现下面这种情况: 假设是长度为5的数组,初始状态,空队列如所示,front与 rear指针均指向下标为0的位置。然后入队a1、a2、a3、a4, front指针依然指向下标为0位置,而rear指针指向下标为4的位置。 出队a1、a2,则front指针指向下标为2的位置,rear不变,如下图所示,再入队a5,此时front指针不变,rear指针移动到数组之外。嗯?数组之外,那将是哪里? 问题还不止于此。假设这个队列的总个数不超过5个,但目前如果接着入队的话,因数组末尾元素已经占用,再向后加,就会产生数组越界的错误,可实际上

数据结构--哈夫曼树

匿名 (未验证) 提交于 2019-12-02 23:56:01
Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (01) 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 (02) 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。 (03) 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1* 100 + 2*5 0 + 3* 20 + 3* 10 = 100 + 100 + 60 + 30 =290。 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度

1.数据结构与算法简介

匿名 (未验证) 提交于 2019-12-02 23:49:02
例题:(问题规模) 如果a+b+c = 1000, 且a^2 + b^2 = c^2(a,b,c为自然数),如何求出所有a, b, c可能的组合? import time # def condition_solution(): # start_time = time.time() # for a in range(1001): # for b in range(1001): # for c in range(1001): # if 1000 == a + b + c and a*a + b*b == c*c: # print("a, b, c: %d, %d, %d" % (a, b, c)) # end_time = time.time() # cost = end_time - start_time # pri# nt("cost: %f" % cost) # def condition_solution (): start_time = time . time () for a in range ( 1001 ): for b in range ( 1001 ): c = 1000 - a - b if 1000 == a + b + c and a * a + b * b == c * c : print ( "a, b, c: %d, %d, %d" % ( a , b

数据结构与算法目录

匿名 (未验证) 提交于 2019-12-02 23:43:01
1.数据结构&算法的引言+时间复杂度 2.python数据结构的性能分析 3.基本数据结构-栈 4.基本数据结构-队列 5.队列的应用案例-烫手的山芋 6.基本数据结构-双端队列(Deque) 7.Deque的应用案例-回文检查 8.基本数据结构-顺序表和链表 9算法之顺序,二分,hash查找 10.排序 11.二叉树 重点中的重点:单链表 重点题目:下列哪些是数据结构:列表,元组,字典, 字符串不是 1.链表是一种数据结构:节点和链表(抽象的数据结构) 思考:如何 封装 节点?2个基本属性写在构造方法中 链表数据结构的封装:-节点(Node):class Node():   def __init__(self,item):   self.item=item     self.next=None链表(Link):class Link():   def __init__(self):   self._head=None   链表:(1)存储第一个节点的属性head    (2)将每个节点串联起来   next用来指向下一个节点 每个节点:包括三个部分,其中包括一个数据块和left和right 目的:对数据进行组织和串联 二叉树基本概念:(1)根节点(2)左叶子节点(3)有叶子节点(4)子树 链表代码: 链表数据结构的封装: -节点(Node): class Node():   

数据结构与算法之单链表

匿名 (未验证) 提交于 2019-12-02 23:42:01
数据结构与算法之单链表 Ŀ¼ 单链表介绍 单链表的应用实例 代码演示 1. 单链表介绍 链表是有序的列表,但它在内存中的存储如下 小结: 链表是以节点的方式来存储,是链式存储 每个节点包含data域,next域:指向下一个节点 如图:发现链表的各个节点不一样连续存储 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 2. 单链表的应用实例 使用带head头的单向链表实现一水浒英雄排行榜管理完成对英雄人物的增删改查操作。 第一种方法在添加英雄时,直接添加到链表的尾部 思路分析示意图: 第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示) 思路的分析示意图. 修改节点功能 ˼· 先找到该节点,通过遍历 temp.name=newHeroNode.name ;temp.nickname=newHeroNode.nickname 删除节点 思路分析的示意图: 3. 代码演示 package com . linkedList ; public class SingleLinkedListDemo { public static void main ( String [ ] args ) { // 进行测试 // 先创建节点 HeroNode hero1 = new HeroNode ( 1 , "宋江" , "及时雨" ) ;

数据结构与算法――线性表(链式描述)

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:欢迎交流学习,如需转载,请注明出处~~~ https://blog.csdn.net/qq_39141406/article/details/90487636 概述 链表特点: 1、元素在内存中位置随机(数组元素的地址是数学公式决定的) 2、每个元素有一个明确的“链”指向线性表的下一个元素 链表分类: 1、单向链表:x.firstNode指向链表首节点,当x.firstNode=NULL时为空表,最后节点的链指针为NULL; 2、单向循环链表:最后节点的链指针指向第一个节点; 3、双向链表:两个指针域next和previous,最后节点的next指针为NULL,首节点的previous指针为NULL; 4、双向循环链表:首节点的previous指向尾节点,尾节点的next指针指向首节点。 注:以上分类均默认没有头结点,如果引入头结点,每个链表(包括空表)都至少包括一个节点(头结点) 单向链表性质与实现 1、单向链表 一个线性表的链式描述 链表的删除操作 两个步骤: (1)找到第二个节点 (2)把第二个节点和第四个节点链接起来 链表的插入操作 两个步骤: (1)找到索引为index-1的节点 (2)改变前后节点的指针 2、C++语言实现 2.1 结构chainNode 存储数据成员和指针: template < class T > struct chainNode { //

数据结构与算法入门---数据结构类型

匿名 (未验证) 提交于 2019-12-02 23:32:01
数据的逻辑结构   数据的逻辑结构指数据元素之间的逻辑哦关系(和实现无关)      分类一:线性结构和非线性结构      线性结构:有且只有一个开始结点和一个终端节点,并且所有节点都最多只有一个直接前继和一个直接后继。     线性表就是一个典型的线性结构,它有四个基本特征:     1.集合中必存在唯一的一个“第一个元素”     3.除最后元素之外,其他的数据元素均有唯一一个的“后继”     4.除第一元素之外,其他的数据元素均有唯一一个的“前驱”          相对应线性结构,非线性结构的逻辑特征是一个节点元素可能对应多个直接前继和多个直接后继,常见的有树(二叉树等)、图(网等)            树:例如linux的文件系统等    分类二: 集合结构 线性结构 树状结构 网状结构   逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网状结构   表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现   集合结构:三个特征:1.确定性2.唯一性3.无序性,该结构的数据元素间的关系是“属于同一集合”,别无其他关系。因为集合中元素的关系很弱,数据结构中不对该结构进行研究   线性结构:数据元素之间存在一对一的关系   树状结构:除了一个数据元素(元素01)以外每个数据元素有且仅有一个直接前驱元素,但是可以有多个直接后继元素

【软考】【软件设计师】【知识模块】【第3章:数据结构】

感情迁移 提交于 2019-12-02 23:25:51
第三章:数据结构: 数据结构是程序设计的重要基础 学会数据结构的目的:   学会从问题出发,分析和研究计算机加工的数据的特性,   以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法;   【对于一个数据结构,需要考虑三个因素:逻辑结构、存储结构、运算方法(操作方法)】   为提高利用计算机解决问题的效率服务;   数据结构是指:数据元素的集合及元素间的相互关系和构造方法。     元素间的相互关系:数据的逻辑结构     元素间关系的存储:存储结构(或称之为 物理结构)        数据结构的分类:     线性结构     非线性结构       又分为树结构、图结构;       数据结构是算法设计的基础。   线性结构:线性结构主要用于 对客观世界中具有单一前驱和后继的数据关系进行描述。     线性表       按照存储方式分类:         采用顺序存储:用一组地址连续的存储的存储单元 依次存储线性表中的数据元素,           现象:逻辑上相邻的两个元素,在物理位置上也相邻。           优点:可以随机存取表中的元素,即可以对数据随机访问。           缺点:插入和删除需要移动其他元素;(有时的移动量挺大)           特点:              各个结点的空间应该需要事先分配完毕,后续不论是否有数据

01、数据结构与算法入门

匿名 (未验证) 提交于 2019-12-02 23:06:17
数据结构与算法(java) 1. 数据结构入门 1.1 常见的数据结构与操作 数据结构体系图 1.2 基本概念 1.3 逻辑结构 1.3.1 线性结构与非线性结构 线性结构 非线性结构 1.3.2 集合、线性、树状与网络 1.4 存储结构 1.4.1 顺序存储结构 1.4.2 链式存储结构 1.4.3 索引存储结构 1.4.4 散列存储结构 1.5 举例 1.6 总结 2. 算法入门 2.1 概述 2.2 时间复杂度 2.2.1 定义 2.2.2 表示时间复杂度 2.2.3 计算时间复杂度 2.2.4 常用时间复杂度的级别 2.3 空间复杂度 2.3.1 定义 2.3.2 举例 例1 例2

数据结构-二叉树遍历

匿名 (未验证) 提交于 2019-12-02 22:59:29
这篇博文主要是研究二叉树遍历的递归与非递归算法,有兴趣的小伙伴可以了解下! 二叉树的递归遍历(深度优先遍历) 先来张图,看看各结点遍历时的情况: 二叉树深度优先遍历总结( 分别为第一次,第二次,第三次进入某个结点 ): 先序遍历:先访问根结点,然后先序遍历左子树,最后先序遍历右子树; 根->左->右 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树; 左->根->右 后续遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点; 左->右->根 递归遍历内部有系统栈,其作用: 1.保护现场(类似存档) 2.恢复现场(类似读档) 递归遍历代码比较简单,先、中、后序遍历递归代码基本相似,总代码: void r(BTNode *p) { if (p != NULL) { //第一次进入-先序 r(p->lchild); //第二次进入-中序 r(p->rchild); //第三次进入-后序 } } 先序遍历递归函数: void r(BTNode *p) { if (p != NULL) { visit(p); r(p->lChild); r(p->rChild); } } 二叉树的非递归遍历(深度优先遍历) 须知:需要自定制辅助栈 1.先序遍历非递归: 1).利用辅助栈将根节点入栈,出栈操作,访问该节点,将其右、左孩子分别入栈(每次访问节点后,对其左、右孩子需要做一个检测