算法与数据结构

数据结构——树的相关概念

强颜欢笑 提交于 2020-03-21 12:58:05
平衡二叉树和二叉查找树 至多有两个子节点的树成为二叉树 1)平衡二叉树 1)树的左右高度差不能超过1. 2)任何往下递归的左子树和右子树,必须符合第一条性质 3)没有任何节点的空树或只有跟节点的树也是平衡二叉树 树的节点Node是key value的形式。因为key可能不连续,甚至不是整数,所以我们没办法使用数组来表示,这个时候我们就可以用二叉查找树来实现 2)二叉查找树 树如其名,二叉查找树非常擅长数据查找。 二叉查找树额外增加了如下要求:它的左子树上所有节点的值都小于它,而它的右子树上所有节点的值都大于它。 查找的过程从树的根节点开始,沿着简单的判断向下走,小于节点值的往左边走,大于节点值的往右边走,直到找到目标数据或者到达叶子节点还未找到。 通常设计Node节点来表示key value这样的数据对 二叉查找树的insert package bobo.algo; // 二分搜索树 // 由于Key需要能够进行比较,所以需要extends Comparable<Key> public class BST<Key extends Comparable<Key>, Value> { // 树中的节点为私有的类, 外界不需要了解二分搜索树节点的具体实现 private class Node { private Key key; private Value value; private

Java数据结构与算法-栈和队列

主宰稳场 提交于 2020-03-21 12:46:39
   (摘录加总结)------   栈和队列不属于基础的数据结构,它们都属于线性表。 一、栈   对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构。按照“先进后出”的原则进行存储数据。先进的元素在栈底,后进的元素在栈顶。需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。比较常规的说明是:栈底固定,而栈顶浮动;栈中元素个数为零时称为 空栈 。插入一般称为 进栈(PUSH) ,删除则称为 退栈(POP) 。   栈的实现结构包括 顺序结构实现 和 链式结构实现 。前者依据的是 数组 ,后者是 链表 。    (1)利用数组实现栈    下面这个是一个基本的实现:①在Stack底层设置了一个int数组,当然可以使用泛型来指代不同的数据类型。最大容量和栈顶位置。特别需要注意的是在初始化时也看出来,一般在初始化的时候top位置设置为-1,这是利于后面在压入数据的时候数组的第一位是array[0],并且maxSize最大容量和数组的length是一致的。②top表示这个数组的当前的没有被设置元素的第一个位置的标志位是多少,首先要判断是否小于maxSize-1,因为是从-1开始的,并且每次判断都是++top,是先自增的处理,示意如下,假如初始化了一个容量为3的数组:   ③当压栈完成的时候自然top的索引值已经变成了数组最高项的值的大小

java中常用的数据结构--Collection接口及其子类

青春壹個敷衍的年華 提交于 2020-03-21 03:49:29
   java中有几种常用的数据结构,主要分为Collection和map两个主要接口 (接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。  一、集合和数组的区别 二、Collection集合和Map集合 三、Collection接口 1、定义 public interface Collection<E> extends Iterable<E> {} 它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。 Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。 2、Collection集合的API 四、List 1、定义:    List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。 public interface List<E> extends Collection<E> {} 2、List接口的实现类 (1)ArrayList:底层数据结构是 数组

数据结构:第一章学习小结

泪湿孤枕 提交于 2020-03-20 23:32:59
心得体会:初学第一章数据结构时,看着新老知识交替着出现,我感到熟悉又陌生,好在书上对数据结构与算法进行了详细的说明,老师也以视频的方式对其进行了归纳总结,我才逐渐感觉摸到了这门学科的门把手。 本学期的目标:希望在大致掌握数据结构的内容后,我能够结合所学知识对以前及以后使用c++或其他语言敲下的代码进行分析与优化,充分运用所学知识,牢固记忆,加深思考。 目前存在的困难:缺乏纸质教材,还不太适应在电子教材上记笔记和注释,因上下滑动的操作导致记忆点也有些模糊 下一阶段的努力目标:在家中也要自律,做到课前预习,课后及时完成作业,并将每节课学习的内容以思维导图的方式做笔记,牢固知识点。 来源: https://www.cnblogs.com/csy1/p/12535543.html

[翻译]C#数据结构与算法 – 第五章栈与队列(Part 1)

情到浓时终转凉″ 提交于 2020-03-20 03:42:09
第 5 章 栈与队列 以列表组织数据是很自然的方式。之前我们使用Array与ArrayList将数据作为列表组织。虽然这些数据结构帮助我们将数据以一种适合处理的格式组织,但没有一种结构提供了一种真实的抽象来实际地设计与实现问题的解决方案。 栈与队列是两种面向列表数据结构,其提供了易于理解的抽象。栈中的数据添加与移除都是由列表的一端进行,而队列中的数据由列表的一端添加并由列表的另一端移除。栈在编程语言的实现中广泛使用,从表达式评估到函数调用等一切问题。队列用于处理操作系统进程的优先级调用及模拟显示世界中事件的发生,如银行的收银台及大楼中的电梯操作。 C#提供了两个类来使用这两个数据结构:Stack类与Queue类。我们将讨论怎样使用这些类然后看一下本章中一些实际的例子。 栈,栈的实现与STACK 类 栈是最常使用的数据结构,就像我们刚刚提到的那样。我们将栈定义为一个项目的列表,其仅可以由列表的尾部访问,这个尾部我们称为栈的顶部。一个栈的标准模式就像一个自助餐厅的一摞餐盘。盘子总是由一摞的顶部被取走,当洗碗工或服务生把盘子放回时,仍然是放回顶部。栈是一种被称作后进先出(LIFO)的数据结构。 栈操作 栈的两个最主要操作是向栈添加项与由栈中移除项。Push操作向栈中添加一个项,Pop操作由栈中移除一个项。图5.1展示了这些操作。 另一个在栈上完成的主要操作是查看顶部元素

数据结构

强颜欢笑 提交于 2020-03-18 14:06:20
1. 几个景点算法: 1.  修路问题:最小生成树(加权值)+ 普利姆 2. 最短路径:图+弗洛伊德算法 3. 汉诺塔: 分支的算法 4. 八皇后:回朔法、 5. 丢手帕 : 约瑟夫问题 2. 线性结构 与非线性结构 1.线性结构 :数据元素之间存在一对一的线性关系 顺序存储结构 , 链式存储结构 (数组,队列,链表和栈) 2 . 非线性结构:(二维数组,多维数组,广义表,树结构,图结构) 3. 稀疏数组 因为该数组中记录了很多值是默认值0,记录了很多没有意义的数据 -》 稀疏数组 代码实现原始二维数组与稀疏数组之间的转化 import org.junit.Test; public class XiShuJuZhen { //创建一个原始的二维数组 11*11 @Test public void testArray() { int[][] charArray = new int[11][11]; //0表示没有棋子,1 表示黑子 2表示蓝子 charArray[1][2] = 1; charArray[2][3] = 2; charArray[4][5] = 2; System.out.println("输出原始的二维数组"); for (int[] is : charArray) { for (int is2 : is) { System.out.print("\t"+is2);

数据结构与算法(2)数组

半城伤御伤魂 提交于 2020-03-18 06:59:31
数组 一、什么是数组? 数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组具有相同类型的数据。 线性表 线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。而与它对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,非线性表中,数据之间并不是简单的前后关系。 连续的内存空间和相同类型的数据 数组正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。 寻址公式 a[i]_address = base_address + i * data_type_size base_address为内存块的首地址 i为数组中元素所在 data_type_size表示数组中每个元素的大小 低效的“插入”和“删除” 插入操作 如果在数组末尾插入元素就不需要移动数据,这时的时间复制度为O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次向后移动一位,所以最坏的时间复制度为O(n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复制度为(1+2+...n)/n=O(n)。 如果数组是有序的,如果要将某个数据插入到第k个位置

数据结构与算法作业——合并两个有序链表

对着背影说爱祢 提交于 2020-03-17 22:41:32
题目:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题算法: class Solution { public : ListNode * mergeTwoLists ( ListNode * l1 , ListNode * l2 ) { if ( ! l1 ) return l2 ; if ( ! l2 ) return l1 ; if ( l1 -> val < l2 -> val ) { l1 -> next = mergeTwoLists ( l1 -> next , l2 ) ; return l1 ; } else { l2 -> next = mergeTwoLists ( l1 , l2 -> next ) ; return l2 ; } } } ; 结果: 来源: CSDN 作者: SuperF? 链接: https://blog.csdn.net/weixin_46338672/article/details/104825766

数据结构与算法9-排序1

北城余情 提交于 2020-03-17 22:39:49
本篇文章讲解冒泡、插入、选择排序。 1.衡量排序算法执行效率(不太用的到) 时间复杂度 时间复杂度的系数、常数、低阶 比较次数和交换(或移动)次数 2.一些前提概念 上述使用稳定排序算法的例子蛮实用的。 3.冒泡排序 平均时间复杂度呢?—— 使用有序度、逆序度 满有序度 = n*(n-1)/2 逆序度 = 满有序度 - 有序度 最坏情况的逆序度是 n*(n-1)/2,所以算平均是 n*(n-1)/4,所以平均时间复杂度为O(n^2)。 4.插入排序(就是打扑克牌,所以很常用) 上述关于逆序度的trick,了解一下即可。 5.选择排序(就是选苹果) 6.为什么插入排序更受欢迎 7.小结 8.扩展 冒泡排序 动图:https://pic1.zhimg.com/v2-1543c0b97237bb55063e033959706ca0_b.webp 插入排序 动图:https://pic2.zhimg.com/v2-f87ad7d8ad54379dd81f02fcf9b91f49_b.webp 选择排序 动图:https://pic1.zhimg.com/v2-f20b8898585b3ca03843d93ce2c35a68_b.webp 来源: CSDN 作者: Xu_Wave 链接: https://blog.csdn.net/qq_22795223/article/details

C语言数据结构-绪论

瘦欲@ 提交于 2020-03-16 06:29:37
目录 1.数据结构的起源 2.基本概念和术语 3.逻辑结构与物理结构 4.抽象数据类型 @(数据结构绪论) 1.数据结构的起源 ==数据结构==是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的关系和操作等相关问题的学科。 1968年,美国的高德纳(Donald E.Knuth)的《计算机程序设计艺术》第一卷《基本语法》中,较系统地阐述了数据的逻辑结构和存储结构及其操作,开创了数据结构的课程体系。同年(1968年),数据结构作为一门独立的课程,在计算机科学的学位课程中开始出现。 程序设计 = 数据结构 + 算法 2.基本概念和术语 ==数据==:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据不仅仅包括整型、实型等 数值类型 ,还包括字符及声音、图像、视频等 非数值类型 它是计算机程序加工的“原料”。例如,一个利用数值分析方法解代数方程的程序,其处理对象是整数和实数。一个编译程序或文字处理程序的处理对象是字符串。 数据,其实就是 符号 ,并且具备两个前提 可以输入到计算机中。 能被计算机程序处理。 数值类型可以进行数值计算。 字符类型需要进行非数值的处理。而声音、图像、视频等是通过编码的手段变成字符数据来处理的。 ==数据元素==:是组成数据的、有一定意义的 基本单位 ,在计算机中通常作为整体处理。也被称为 记录 。