数据结构

Java数据结构与算法3 链表

心已入冬 提交于 2020-02-17 01:42:08
链表思想 链表是以节点的方式进行存储 每个节点包含两个域:data+next:指向下一个节点 链表的各个节点并不一定是连续存储的 链表分为带头节点的链表和不带头节点的链表,根据实际需求来选择 我们以水浒英雄好汉的排名来解释链表结构在Java中的实现 class HeroNode { int id ; String name ; Hero next ; } 每个英雄节点包含一个id,一个姓名(data域) 和指向下一个节点的引用next. 单链表-英雄好汉 现在我们有一个需求,就是向单链表中添加多个英雄好汉的节点。 添加节点思想:先创建一个head头节点,表示单链表的头 (case 1)每添加一个节点,添加到单链表的最后 找到最后一个节点,将最后节点的next指向 新的节点 (case 2)按排名添加到链表对应位置,如果该位置已经被占用,则返回错误信息 通过辅助节点找到新添加的节点的位置(遍历) 新的节点.next = temp.next temp.next = 新的节点 遍历链表思想:通过一个辅助变量来遍历整个单链表 删除节点思想:先找到要删除节点的前一个节点temp,temp.next = temp.next.next; 被删除的节点将不会有其他引用指向,会被垃圾回收。 查找单链表中倒数第K个节点(新浪) 1)编写一个方法,接受head参数+k参数 2)先遍历整个列表

数据结构(集合)学习之Set

。_饼干妹妹 提交于 2020-02-16 21:59:48
集合 框架关系图: Collection接口下面有三个子接口:List、Set、Queue。此篇是关于Set<E>的简单学习总结。 Set: Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中(可以存空元素)。常见的子类:HashSet、TreeSet、LinkedHashSet。 1、HashSet(无序,不可重复): 底层实际上是一个无序,不可重复的HashMap,源代码如下: 1 private transient HashMap<E,Object> map; 2 /** 3 * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has 4 * default initial capacity (16) and load factor (0.75). 5 *(默认初始容量是16,加载因子是0.75,元素个数超过16*0.75就扩容) 6 */ 7 public HashSet() { 8 map = new HashMap<>(); 9 } 10 public HashSet(Collection<? extends E> c) { 11 map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1,

【数据结构】二叉树的概念及实现

流过昼夜 提交于 2020-02-16 21:33:07
二叉树的定义: 二叉树T一个有穷的节点集合,这个集合可以为空,若不为空,则它由根节点和一个称为左子树TL 和 右子树TR的两个完全不相交的二叉树组成。 二叉树的顺序存储分析: 完全二叉树: 若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有节点都连续集中在最左边,这就是完全二叉树 满二叉树: 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。满二叉树一定是完全二叉树,不同的是最后一层的所有节点都有两个字节点。 对于一个完全二叉树如何用顺序存储实现呢? 我们可以对完全二叉树进行从上到下,从左到右编号,然后以编号为下标将节点的值依次放入一个数组中,这时候下标之间的规律们可以反映二叉树的层次关系(比如根据双亲节点的下标,找到其左孩子和右孩子的下标): N个节点的完全二叉树的节点父子关系: (1)非根节点,序号(i >1)父节点的序号为i/2; (2)节点的序号为i,左孩子的序号为2 * i; (3)节点的序号为i,右孩子的序号为2 * i + 1; 而对于非完全二叉树也可以用顺序存储的方法实现,空出来的节点序号为0;但是这样会浪费大量的存储空间; 二叉树的链式存储及实现: # define Elemtype char # define Btree_Node STDataType typedef struct Btree_Node { /

数据结构相关基础(软考必知)

馋奶兔 提交于 2020-02-16 21:28:04
基本结构:顺序,选择,循环 算法复杂度 - 特定输入法有关 链表存储,插入,删除效率最高 前序:中左右;中序:左中右;后序:左右中 顺序结构一定是连续的,链式结构不一定连续。 对象:标识唯一,分类,多态,封装,模块独立,标识唯一 一个字节二进制位数为8 ASDL非对称数字用户环路,ISP互联网服务提供商,TCP传输控制协定。 栈支持子程序调用。 数据库应用系统核心问题:数据库设计。 编译:高级语言到低级语言等价编译。 算法有穷性:运算时间有限 E-R图转换为关系表:逻辑设计阶段 代码编写阶段可进行:单元测试。 数据库管理系统:系统软件。 字节越长,计算机处理速度越快。 系统总线:数据,地址,控制。 需求分析:解决软件做什么。 cpu主频,内核工作的时钟频率 计算机执行速度:MIPS 编译程序:高级,可执行 避免:goto语言泛滥。 软件测试:单元,集成,确认,系统。 需求阶段:编写规格说明书,获取需求分析。 计算机指令:算数运算,逻辑运算。 冯若依曼:二进制,存储程序 对象主要特征:抽象,继承,封装,多态 结构化方法需求工具: 数据流图,数据字典。判断树,判定表; 2n节点完全二叉树,叶子节点为n; 黑盒测试依据(程序外部功能)设计测试用例根据(软件要完成的功能); 每经过一次元素交换会产生新的逆序:快速排序。 与总线位数相同的部件,CPU 数据库系统分为:层次,网状,关系。

为什么说InnoDB必须要有主键并且推荐使用自增整型主键呢?

落爺英雄遲暮 提交于 2020-02-16 20:37:22
1.InnoDB存储引擎的数据结构必须需要一个主键才可以组织起来,如果用户使用InnoDB存储引擎建立表的时候,没有指定主键,则Mysql会自动的帮你找到一个合适的唯一索引作为主键,若找不到符合条件唯一索引条件的字段时,会生成类似于ROW_ID的虚拟列充当该InnoDB表的主键; 2.整型的存储比字段类型要小,而且应为是InnoDB存储引擎使用的是B+Tree数据结构,在进行查询数据是需要对每个元素进行比较,而整型的对比效率是高于其他数据结构的,字符串等。 来源: CSDN 作者: 社交恐惧的岛主 链接: https://blog.csdn.net/a1_HelloWord/article/details/104341349

java基础学习——24、容器

杀马特。学长 韩版系。学妹 提交于 2020-02-16 20:34:35
Java中有一些对象被称为 容器 (container )。容器中可以包含多个对象,每个对象称为容器中的一个元素。容器是用对象封装的 数据结构(data structure)。 充满梦想的容器 不同的数据结构有不同的组织元素的方式,也可以有不同的操作。根据具体实施的不同,数据结构的操作效率也各有差别。Java中的容器也是这样。我们要选择适当的容器,以应对变化的需求。 (关于数据结构更多的内容,可参考 纸上谈兵: 算法与数据结构 ) 数组 数组(array)是最常见的数据结构。数组是相同类型元素的有序集合,并有固定的大小(可容纳固定数目的元素)。数组可以根据 下标(index)来随机存取(random access)元素。在内存中,数组通常是一段连续的存储单元。 Java支持数组这一数据结构。我们需要说明每个数组的类型和大小。如下: public class Test { public static void main(String[] args) { Human[] persons = new Human[2]; // array size 2 persons[0] = new Human(160); persons[1] = new Human(170); int[] a = {1, 2, 3, 7, 9}; // array size 5 System.out.println

一、redis简介

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-16 20:17:03
什么是 redis ? logo Remote Dictionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为基于 内存 的数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 redis的优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 redis与其他存储不同 Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径

【数据结构】二叉搜索树的概念和常见操作

独自空忆成欢 提交于 2020-02-16 19:36:00
什么是二叉搜索树? 我们把一般的查找操作分为两类,静态查找和动态查找。在静态查找中有一种很快的查找方法(二分查找时间复杂度为O( log(n) )。它之所以可以将时间复杂度降的这么低,是因为在查找之前对数据进行了顺序的排序。在查找时查找的顺序是固定的,是一个判定树一样的结构。把一个线性的查找过程转换成了一个类似树的查找过程。查找效率就是树的高度。从此我们得到启示:在查找时为什么不能把数据直接用二叉树的结构存储。比起线性结构树的动态性更强,它的插入删除操作更加方便。这样就形成了二叉搜索树。 二叉搜索树定义 : 一颗二叉树,它可以为空,如果不为空,满足下边的性质: (1)非空左子树的所有节点的值,都小于根节点的值。 (2)非空右子树的所有节点的值,都大于根节点的值。 (3)左右子树都是二叉搜索树。 这样在查找的时候,从根节点找,如果小于去左子树找,如果大于去右子树找。 二叉搜索树的常见操作: //从二叉搜索树中找到元素data,并返回该节点的地址,如果找不到返回NULL; Binary_Tree * Find ( Binary_Tree * BST , Elementype data ) ; //从搜索二叉树中BST中,找到最小值data并返回该节点的地址(如果树为空,返回NULL) Binary_Tree * Find_Min ( Binary_Tree * BST ) ; /

数据结构(集合)学习之List

北城余情 提交于 2020-02-16 18:39:36
集合 框架关系图: Collection接口下面有三个子接口:List、Set、Queue。此篇是关于List<E>的简单学习总结。 List(有序、可重复): List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。 List常用的子类:ArrayList。(面试常问的:Vector、ArrayList、LinkedList之间的区别)。 ArrayList: public class ArrayList<E> extends AbstractList<E> implements List<E> (继承AbstractList类,实现List接口) 方法摘要(标黄为常用方法) Modifier and Type 方法 描述 void add ​(int index, E element) 在此列表中的指定位置插入指定的元素。 boolean add ​( E e) 将指定的元素追加到此列表的末尾。 boolean addAll ​(int index, Collection <? extends E > c) 将指定集合中的所有元素插入到此列表中,从指定的位置开始。 boolean addAll ​( Collection <?

【数据结构】树

我的未来我决定 提交于 2020-02-16 18:28:58
树 客观世界中许多事物存在层次关系 eg:人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率 查找(Searching):给定某个关键字K,从集合R中找出关键字与K相同的记录 静态查找:集合中记录是固定的 没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的 除查找,还可能发生查找和删除 静态查找 顺序查找 typedef struct LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int SequentialSearch(List Tb1, ElementType K){ int i; Tb1->Element[0]=K;//哨兵!这样可以减少判断 for(i=Tb1->Length;Tb1->Element[i]!=K;i--); return i; } 二分查找 Binary Search O(log(n)) 假设n个数据元素的关键字满足有序 \(k_1<k_2<k_3<...<k_n\) ,并且是连续存放(数组),那么可以进行二分查找。 typedef LNode *List; struct LNode{ ElementType Element[MAXSIZE]; int Length; } int BinarySearch(List PtrL