算法与数据结构

数据结构之树

时光怂恿深爱的人放手 提交于 2019-12-14 07:26:28
数据结构之树(含代码) 树的基本概念 子树的个数没有限制,但它们一定是互不相交的 树的结点包含一个数据元素及若干指向其子树的分支;结点拥有的子树数称为结点的度;度为0的结点称为叶结点或终端结点;度不为0的结点称为非终端结点或分支结点;除根结点之外,分支结点也称为内部结点;树的度是树内各结点的度的最大值。 结点的层次从根开始定义起;树中结点的最大层次称为树的深度或高度; 如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树 双亲表示法 每个结点都有data和left,right,data是数据,存储结点的数据信息;而lef,rig是指针,存储该结点的双亲在数组中的下标;根结点没有双亲,所以指针域为-1; 二叉树 二叉树是n个结点的有限集合,该集合或者为空集,或者由一个根结点和两棵互不相交的、分别成为根结点的左子树和右子树的二叉树组成 二叉树的特点: 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点 左子树和右子树是有顺序的,次序不能任意颠倒 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上 特点: 叶子只能出现在最下一层 非叶子结点的度一定是2 在同样深度的二叉树中,满二叉树的结点个数最多,子树最多 完全二叉树

Summary 2019.12.13

断了今生、忘了曾经 提交于 2019-12-13 21:13:17
程序设计语言 FORTRAN:第一个广泛应用于科学计算的高级语言。其大部分代码都可直接使用硬件结构实现,因此执行效率高。 ALOGOL:有严格的文档规则(使用BNF描述),是一个分程序结构的语言。每个分程序由BEGIN…END括起来,说明其范围及名字作用域。分程序结构的主要优点是可以非常有效地使用存储器。 COBOL:面向事务处理的高级语言,将数据的描述从具体的计算机平台上剥离出来。 PASCAL:最早是为了教学的目的开发而成的,它拥有一些相当紧凑的机制,使其语言的表达能力十分强。它引入了数据结构、过程等重要概念。 C:是20世纪70年代发展起来的通用程序设计语言,提供了指针、数组、结构、联合等新的数据类型。它通过指针可以完成地址操作能力,因此是一种较低级的语言,能够编写出高效的程序。UNIX系统本身,以及其中大量的应用程序都是C编写的。 C++:是在C语言的基础上发展起来的,主要增加了类的功能,使其成为面向对象的程序设计语言。 Java:其是 “一次编写,到处运行”的平台无关性的面向对象语言。其最大的特点是一种半解释型语言,编译程序先将源程序(java后缀名)编译为字节码文件(class后缀名),然后再由Java虚拟机(JVM)解释这些中间代码。 C#:它是C++与Java的一种设计理念的结合,与Java类似,先编译成MSIL中间代码,然后由CLR来负责编译执行

数据结构和算法

橙三吉。 提交于 2019-12-13 06:54:16
/* 数据结构和算法: 目的: 1 操作数据 -> 更精确/更方便/增删改查 2 项目工程越大,数据结构越复杂,越需要良好数据结构、规范编码、清晰注释、 具体业务: 复杂事物/流程 -抽象- 数据结构/算法 1 基本操作: 增删改查、读取/保存/传输。 2 评判标准: 空间复杂度、时间复杂度 1 不变的流程可以通过不变的数据结构和算法构来模拟和处理数据,但具体的业务逻辑自己实现。 2 数据结构与算法: 通用的可以做成,容器算法模型,不通用的只能自己编写,如回调函数。 3 线性数据结构: list string vector map hash (stck queue) 设计一个数据模型:测试数据 -> 添加/浏览/修改/删除/读写通过,基本成功。 排序: 数据: 1 数据存储结构和数据尽量不变 2 数据显示过程进行排序 判断:已知数量、未知数量末尾设NULL 设计某种数据结构 (1) 存储麻烦: 按照某种规则存储 (2) 使用方便: 按照某种规则快速定位和操作。 最优解决方案:针对不同的业务选择不同的数据结构、框架、架构。 */ 来源: https://www.cnblogs.com/huafan/p/12032912.html

深入浅出HashMap的设计与优化

空扰寡人 提交于 2019-12-13 00:50:09
一:常用的数据结构 众所周知, ArrayList 是基于数组的数据结构实现的,LinkedList 是基于链表的数据结构实现的,而 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构。 数组: 采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表: 一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素)组成,结点可以在运行时动态生成。每个结点都包含“存储数据单元的数据域”和“存储下一个结点地址的指针域”这两个部分。由于链表不用必须按顺序存储,所以链表在插入的时候可以达到 O(1) 的复杂度,但查找一个结点或者访问特定编号的结点需要 O(n) 的时间。 哈希表: 根据关键码值(Key value)直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组就叫做哈希表。 树: 由 n(n≥1)个有限结点组成的一个具有层次关系的集合,就像是一棵倒挂的树。 二:HashMap 的实现结构 了解完数据结构后,我们再来看下 HashMap 的实现结构。作为最常用的 Map 类,它是基于哈希表实现的,继承了 AbstractMap

数据结构与算法---动态数组(2)顺序栈ArrayStack、双端栈ArrayStackDoubleEnd

99封情书 提交于 2019-12-12 07:28:54
栈的顺序存储结构 a.栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表 我们把允许插入和删除的一端称为栈顶,另一端称为栈底 栈又称为后进先出的线性表 定义中说的时在线性表的表尾进行插入和删除,这里 表尾是栈顶 栈的插入操作,叫做进栈,也称压栈,入栈 栈的删除操作,叫做出栈,也称弹栈 b.栈的接口定义 成员变量,成员函数 我们可以将顺序表看成时栈的一个成员变量 c.接口的实现 接口的实现我们都可以基于顺序表来实现,直接调用顺序表的方法 双端栈的顺序存储结构 是指将一个线性表的两端当作栈底分别经行入栈和出栈操作 双端栈的内部变量 因为双端栈需要在两端都可以进行操作,所以简单的顺序表就已经不能实现它了,我们则需要重写他的底层实现 成员变量 成员函数 获取栈中所有有效元素的个数 1.当前栈分为左右两个部分,我们想要获取栈中全部的有效个数,则需要分别获取左右两边的有效元素个数 2.左边有效元素个数就是栈底位置+1(lefttop+1) 3.右边有效元素个数为数组的长度-右端顶的位置(data.length-righttop) 3.将左右两个有效元素个数相加,则为栈中所有有效元素的个数 判断栈是否为空 我们继续将他从左右两边分开判断 1.判断左栈是否为空 lefttop=-1; 2.判断右栈是否为空righttop=data.length; 3.如果左右两边同时为空,则栈为空,否则就不为空

数据结构与算法简记--二叉树

十年热恋 提交于 2019-12-11 18:45:06
二叉树(Binary Tree) 树 根节点、父节点、兄弟节点、叶子节点 高度、深度、层的概念 二叉树 顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点,并不要求都要有二个节点,有的只有左节点,有的只有右节点 满二叉树 图中编号2的二叉树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫作满二叉树 完全二叉树 图中编号3的二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫作完全二叉树 如何表示(或者存储)一棵二叉树? 链式存储法 顺序存储法 基于数组 如果节点 X 存储在数组中下标为 i 的位置, 下标为 2 * i 的位置存储的就是左子节点, 下标为 2 * i + 1 的位置存储的就是右子节点。 反过来,下标为 i/2 的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为 1 的位置),这样就可以通过下标计算,把整棵树都串起来。 适用于完全二叉树 ,如果是非完全二叉树会浪费空间; 堆就是完全二叉树,且常使用数组存储数据 二叉树的遍历 前序遍历--访问顺序: 父节点 --》左子节点--》右子节点 中序遍历--访问顺序:左子节点--》 父节点 --》右子节点 后序遍历--访问顺序

数据结构之时间复杂度的计算

…衆ロ難τιáo~ 提交于 2019-12-11 02:22:20
计算过程: 用常数1取代运行时间中的所有加法常数。 在修改后的运行次数函数中,只保留最高阶项。 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。 推导示例 1、常数阶 首先顺序结构的时间复杂度。下面这个算法,是利用高斯定理计算1,2,……n个数的和。 int sum = 0, n = 100; /*执行一次*/ sum = (1 + n) * n / 2; /*执行一次*/ printf("%d",sum); /*执行一次*/ 这个算法的运行次数函数是f (n) =3。 根据我们推导大0阶的方法, 第一步就是把常数项3 改为1。 在保留最高阶项时发现,它根本没有最高阶项 所以这个算法的时间复杂度为0(1)。 2、线性阶 线性阶的循环结构会复杂很多。要确定某个算法的阶次,我们常常需要确定某个特定语句或某个语句集运行的次数。因此,我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。 下面这段代码,它的循环的时间复杂度为O(n), 因为循环体中的代码须要执行n次。 int i; for(i = 0; i < n; i++){ /*时间复杂度为O(1)的程序步骤序列*/ } 3、对数阶 今天某位18级同学请教我的这个问题,促使我写了这篇博客。 public class TS { public static void main(String[] args)

数据结构——串

夙愿已清 提交于 2019-12-10 05:19:20
数据结构——串(知识点整理) 1.串类型的定义 1.串(或字符串)是由零个或多个字符组成的有限序列 2.C语言中处理串的两种方法:字符数组和字符指针 3. 空串 是长度为零的串,而 空格串 是一个或多个空格组成的串 4. 串中任意个 连续 子序列称为该串的子串,空串是任意串的子串,而任意串是其自身的子串 5. 串相等 :长度相等、对应位置的字符相等 6. 串与一般线性表的区别: ①串的数据对象约束为字符集 ②线性表大多以‘单个元素’为操作对象,而串通常以‘串的整体或串的一部分’为操作对象 7.串的抽象数据类型定义 2.串的表示和实现 1. 定长顺序存储 :用一组地址连续的存储单元存储串值的字符序列 C语言中以’\0’表示串值的终结,此时串长为隐含值,不便于操作 //串的定长顺序存储表示 # define MAXSTRLEN 255 typedef unsigned char SString [ MAXSTRLEN + 1 ] ; //0号单元存放串的长度 串联接的算法 Status Contat ( SString & T , SString S1 , SString S2 ) { //用T返回由S1和S2联接而成的新串,若未截断,返回TRUE,否则返回FALSE if ( S1 [ 0 ] ) + S2 [ 0 ] <= MAXSTRLEN ) { //未截断 T [ 1. .

数据结构与算法(十)---跳表的实现

余生长醉 提交于 2019-12-09 22:40:46
一、概述 什么是跳表 跳表怎么实现 二、跳表 1. 跳表的定义和实现意义 我们知道二分查找法的前提是有序数组,那么有没有类似的让链表也证婚词类似"二分"查找的算法,那就是 跳表 了:它支持快速的插入、删除、查找操作,实现方式没有红黑树那么复杂,甚至可以代替它。Redis的有序集合就是使用跳表实现的, 链表的随机访问数据的时间复杂度是O(n),我们在链表的基础上,每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作 索引 或 索引层 。图中的 down 表示 down 指针,指向下一级结点。 假如我们要差早16这个元素,我们通过第一级索引进行遍历,当到达13是,发现下一索引元素的值为17,那么16就应该在13和17之间,然后从索引层的13利用down指针,查找到原始链表的13,开始往后遍历得到需要查找的元素,原来需要对遍历10个,现在只需要6个节点;效率提高了;**如果在第一级索引上,在提取一层索引,会怎样呢? 这里直接查找1-64个元素,体验下效率: 查找效率从62次到了11次,这就是跳表。 2. 跳表的时间复杂度 普通链表的时间复杂度是O(N),怎么计算跳表的时间复杂度呢? 每两个结点会抽出一个结点作为上一级索引的结点,那第一级索引的结点个数大约就是 n/2,第二级索引的结点个数大约就是 n/4,第三级索引的结点个数大约就是 n/8,依次类推,也就是说,第 k

复习备考数据结构与算法(三)——树的递归

情到浓时终转凉″ 提交于 2019-12-09 21:54:26
数据结构与算法复习总结(二) 写在前面 今天计划的是上午复习好树和二叉树然后实现一下基本算法,晚上用来学习vue的,可是计划赶不上变化,我之前学习落了太多,一复习感觉好多问题需要解决,然后我理解的比较慢得慢慢思考我才能想清楚,唉,我这脑子我也没办法!以前因为 连山哥哥 (我们数据结构老师啦)总是布置太多作业,又多又难,能不激起我这个18岁的花季少女的叛逆心理嘛,我简直抗拒到……嘤嘤嘤~ 现在自己学习感觉好多了,看着课本顺眼多了。为了应试,老师说树的递归一定会考,划重点!!行吧,我看!我学! 一、树和二叉树的归纳 二、二叉树的一些递归算法 二叉树的先序遍历 二叉树的中序遍历 二叉树的后序遍历 计算二叉树的深度 统计二叉树的节点个数 统计二叉树的叶子节点个数 判断两棵二叉树是否相等 # include <stdio.h> # include <stdlib.h> # include <malloc.h> # include <iostream> using namespace std ; typedef char TElemType ; typedef struct BiTNode { TElemType data ; struct BiTNode * lchild , * rchild ; } BiTNode , * BiTree ; void CreatBiTree (