算法与数据结构

数据结构与算法(树)

≡放荡痞女 提交于 2020-02-03 22:24:42
首语 疫情严重,需要多多注意,做好防范!戴口罩,勤洗手。献上→ 新型冠状病毒感染防护手册 ! 树 树(Tree)是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 结点的度 结点拥有的子树数称为结点的度。度为0的节点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点。树的度是树内各节点的度的最大值。 层次与深度 结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第一层,则其子树的根就在l+1层。其双亲在同一层的结点互为堂兄弟。显然图中的D、E、F是堂兄弟,而G、H、I、J也是。树中结点的最大层次称为树的深度(Depth)或高度,当前树的深度为4。 有序与无序树 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。 森林 森林(Forest)是m(m≥0)棵互不相交的树的集合。 树的存储结构 简单的顺序存储不能满足树的实现。 结合顺序存储和链式存储来实现。 三种表示方法 1、双亲表示法 在每个结点中,附设一个指示器指示其双亲结点到链表中的位置。 2

山东大学——数据结构实验全集

白昼怎懂夜的黑 提交于 2020-02-03 21:55:41
感悟数据结构的实验真的很重要,感觉实验做的好一般都能得高分,所以大家做完正式实验后尽量做一下补充实验有好处。时间和精力有限,我只是整理了正式实验的,好了上干货。 1.实验一 递归练习 1)要求: (我只是完善逻辑,并没有关于输入输出格式的代码。) 2)逻辑 以四个数为例:全排列数为24,只以一为开头的有6种 1.2.3.4为第一个。 1.2.4.3 1.3.2.4 1.3.4.2 1.4.3.2 1.4.2.3 每当长度等于4时就输出结果,递归地将位置交换 for (int i = start; i < end; ++i) { swap(list[start],list[i]); permutation(list,start+1,end); swap(list[start],list[i]); } 3)代码: //输出方法 void system(int list[],int end){ for (int i = 0; i < end ; ++i) { cout<<list[i]; if(i!=end-1){ cout<<","; } } cout<<endl; } //实现方法 void permutation(int list[],int start,int end){ if(start == end){ system(list,end); } else{ for (int i

算法与数据结构2

时光总嘲笑我的痴心妄想 提交于 2020-02-03 13:47:28
算法与数据结构02-线性查找和二分查找(队列和栈) 线性查找 :顺序查找,速度较慢 package com . kele ; import java . sql . SQLOutput ; import java . util . Arrays ; /**队列: 先进先出 * @author 12402 */ public class MyQueue { private int [ ] arr ; public MyQueue ( ) { arr = new int [ 0 ] ; } // 往队列中添加元素 public void add ( int target ) { int [ ] newArr = new int [ arr . length + 1 ] ; for ( int i = 0 ; i < arr . length ; i ++ ) { newArr [ i ] = arr [ i ] ; } newArr [ newArr . length - 1 ] = target ; arr = newArr ; } // 展示队列元素 public void show ( ) { System . out . println ( Arrays . toString ( arr ) ) ; } // 取出最先静茹的元素 public int pop ( ) { int

数据结构之HashMap详解(一)

醉酒当歌 提交于 2020-02-03 07:30:03
在之前有一篇博客介绍了HashMap, 数据结构之Hash表(哈希表) 现在对之前的内容做一个补充。 说HashMap之前,看下数组: 数组的优点在于查找速度快,每个区域都是紧挨着的,并且有下标,可以根据下标快速找到要查找的元素。 缺点:增删麻烦,如果在第二个元素后面再添加个元素的话,那么就需要重新建一个数组,填入对应的信息。 链表:每个内存除了存放自身的元素外,还保留下个内存区域的地址, 优点:插入新元素方便,只需要将指针指向新元素,新元素指向原来的下一个指针即可。 缺点:查找速度慢。链表不像数组那样有下标,链表查找元素只能从head结点开始,一个一个向下找。 而散列表则是综合了两者优点于一身的结构: 上面是数组,数组每个区域内是链表。 说到散列表,就应当说哈希,没有哈希,散列表就无法寻址找数据, 哈希 哈希:Hash也称散列、哈希,对应的英文都是Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash特点: 1、hash值不可以反向推导出原始的数据 2、输入的数据的微小变化会得到完全不同的hash值,相同的数据可以得到相同的值。 3、哈希算法的执行效率要高效 4、hash算法的冲突概率要小 hash原理是将输入空间的值映射成hash空间内

数据结构之DFS与BFS实现

六眼飞鱼酱① 提交于 2020-02-03 04:41:53
本文主要包括以下内容 邻接矩阵实现无向图的BFS与DFS 邻接表实现无向图的BFS与DFS 理论介绍 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为”宽度优先搜索”或”横向优先搜索”,简称BFS。 它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。 换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。 邻接矩阵实现无向图的BFS与DFS /** *

数据结构与算法题目集(中文)6-9 二叉树的遍历 (25分)

烂漫一生 提交于 2020-02-03 01:04:39
1.题目链接 https://pintia.cn/problem-sets/15/problems/732 2.题目分析 1.void InorderTraversal( BinTree BT );中序遍历,即“根,左,右” 先输出根节点,再递归进入左节点,之后再递归进入右节点 2.void PreorderTraversal( BinTree BT ); 先序遍历,即“左,跟,右”先递归进入左节点,之后返回一层输出根节点,再递归进入右节点 3.void PostorderTraversal( BinTree BT );后序遍历,即“左,右,跟”先不断递归进入左节点,再分别递归入右节点,之后输出根节点 4.void LevelorderTraversal( BinTree BT );层序遍历,即一层一层从上往下从左往右输出节点 层序遍历具体的实现方法: 声明一个binTree[100]数组,使用head、last两个指针; 首先将根节点输出,并将last指针++,接着将根节点的左、右节点放到数组中进行缓存,同时使last指针++; 下一次再将左节点输出,同时将左节点的左、右节点存入数组,last++,右节点同理; 最后当head与last值相等的时候,表示到达最右下方节点,输出结束。 3.代码 void InorderTraversal( BinTree BT ) { if(BT=

算法与数据结构之稀疏数组

半世苍凉 提交于 2020-02-03 00:48:34
欢迎查看我的博客: https://Mr00wang.github.io 学习笔记 算法与数据结构之稀疏数组 稀疏数组 一、介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,也可以理解为压缩数组。 稀疏数组的处理方法: 记录数组一共有几行几列,有多少个不同的值。 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。 二、实例 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数 整体思路分析: 首先需要将二维数组转换为稀疏数组,然后再将稀疏数组写入到磁盘文件中 通过磁盘文件读取稀疏数组,然后再转换为原来数组 二维数组转稀疏数组的思路: 遍历原始的二维数组,得到有效数据的个数sum 根据sum就可以创建稀疏数组 spareArray = int [sum+1] [3] 将二维数组的有效数据存入到稀疏数组 稀疏数组转原始数组的思路: 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二位数组,比如上面的array = int [11] [11] 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可 三、代码实现 public class SparseArray { public static void main ( String [ ] args ) { /

关于开发知识的一些总结

纵饮孤独 提交于 2020-02-02 22:33:20
软件开发工程师这个叫法注意了开发是与工程打交道的。那么前端开发也不例外。 软件开发工程也可以是在互联网世界上的建筑作业。 前端开发搞得是前端工程。那么类比现实世界的建筑工程类型,前端有哪些工程类型呢?又有哪些分类标准呢? 根据采用的框架有Vue项目工程、Reactjs项目工程以及传统工程(不采用框架)。 根据工程化的脚手架分webpack工程、gulp工程、rollup工程等。 还可以分出移动端工程和pc端工程;甚至于nodejs工程、Nuxt工程、小程序工程。 那么这些都熟悉吗? 最近重新温习了数据结构和算法。 既然数组是一种数据结构,那么JavaScript的基本数据类型:undefined、null、Boolean、Number、String,复合数据类型Array和Object也是数据结构。 一般的业务中只是应用这些最简单且常用的数据类型就能搞定了。随着业务复杂度增加有必要学习更复杂的数据结构类型和算法。 而数据结构和算法是所有高级开发语言的核心。 我认为只有对开发的产品感兴趣才能真正带动开发,转变为对开发感兴趣。所以选择从事哪个行业很重要。 来源: https://www.cnblogs.com/zhensg123/p/12253785.html

我的算法学习之路

柔情痞子 提交于 2020-02-02 14:36:21
我的算法学习之路 关于 严格来说,本文题目应该是 我的数据结构和算法学习之路 ,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如 算法导论 指的实际上是 数据结构和算法导论 ),所以我认为本文题目是合理的。 原文链接: http://zh.lucida.me/blog/on-learning-algorithms/ 原文作者: Lucida 这篇文章讲了什么? 我这些年学习数据结构和算法的总结。 一些不错的算法书籍和教程。 算法的重要性。 初学 第一次接触数据结构是在大二下学期的数据结构课程。然而这门课程并没有让我入门——当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾——反正最后考试划个重点也能过,于是这门整个计算机专业本科最重要的课程就被傻逼的我直接忽略过去了。 直到大三我才反应过来以后还要找工作——而且大二的折腾证明了我并没有什么商业才能,以后还是得靠码代码混饭吃,我当时惊恐的发现自己对编程序几乎一无所知,于是我给自己制订了一个类似于建国初期五年计划的读书成长计划,其中包括C语言基础、数据结构以及计算机网络等方面的书籍。 读书计划的第一步是选择书籍,我曾向当时我觉得很牛的"学长"和"大神"请教应该读哪些算法书籍,"学长"们均推荐算法导论,还有几个"大神"推荐计算机程序设计艺术(现在我疑心他们是否翻过这些书),草草的翻了下这两本书发现实在看不懂

算法与数据结构一:基本概念

a 夏天 提交于 2020-02-02 10:51:31
程序 = 数据结构 + 算法 一、算法的五个特性 算法(algorithm)是解决特定问题求解步骤的描述,在计算机中表现为有限的操作序列。 输入(Input):算法必须有输入量,用以刻画算法的初始条件(特殊情况也可以没有输入量,这时算法本身定义了初始状态); 输出(Output):算法应有一个或以上输出量,输出量是算法计算的结果。没有输出的算法毫无意义。 明确性(Definiteness):算法的描述必须无歧义,以保证算法的实际执行结果是精确地匹配要求或期望,通常要求实际运行结果是确定的。 有限性(Finiteness):算法必须在有限个步骤内完成任务。 有效性(Effectiveness):算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现(又称可行性)。 二、数据结构 指相互之间存在一种或多种特定关系的数据元素的集合用计算机存储、组织数据的方式。数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 2.1 逻辑结构 逻辑结构(logical structure) 是指在数据中数据元素之间的相互关系。数据元素之间存在不同的逻辑关系构成了以下4种结构类型。 (1)集合结构:集合的数据元素没有其他关系,仅仅是因为他们挤在一个被称作“集合”的盒子里。 (2)线性结构:线性的数据元素结构关系是一对一的,并且是一种先后的次序,就像a-b-c-d-e-f-g····