数据结构与算法
主要结合搜啊I些基本常用的数据结构和算法,基于Java语言实现。
编程芝士
字节跳动后端工程师,测控专业转程序员,努力努力,为了家人和蝈蝈!
展开
-
【数据结构】红黑树
二叉查找树(1)左子树上所有节点的值均小于或等于它的根结点的值。(2)右子树上所有节点的值均大于或等于它的根结点的值。(3)子树也要遵循上面的规则二叉查找树可能出现的问题如果我们在刚刚开始的时候有三个节点,然后依次插入7,6, 5,4。我们看会发生什么情况:这样极端的情况下一个二叉搜索树可能退化成一个链表,在插入和查找的时候效率就会很低。平衡二叉树(AVL)从任何一个节点出发,左右子树深度之差的绝对值不超过1。红黑树红黑树是一种自平衡二叉查找树,它的统计性能要好于平衡二叉树(AVL转载 2020-06-11 21:47:36 · 358 阅读 · 0 评论 -
【排序】桶排序
简介桶排序也是时间复杂度仅为 O(n) 的一种排序方法,它假设输入数据服从均匀分布,我们将数据分别放入到 n 个桶内,先对桶内数据进行排序,然后遍历桶依次取出桶中的元素即可完成排序。原理图例如输入数据:21,8,6,11,36,50,27,42,0,12。然后分别放入对应的桶内排序,最后依次遍历桶取出元素即可完成排序。分析桶排序中很重要的一步就是桶的设定了,我们必须根据输入元素的情况,选择一个恰当的 “getBucketIndex” 算法,使得输入元素能够正确的放入对应的桶内,且保证输入数据能转载 2020-06-06 20:59:06 · 350 阅读 · 0 评论 -
【算法学习】算法的时间复杂度与空间复杂度
时间复杂度1.时间频度一个算法执行所耗费的时间,从理论上来说是不能计算出来的,必须通过上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。2.时间复杂度...原创 2019-10-24 22:38:59 · 306 阅读 · 0 评论 -
【算法学习】 常见排序算法总结(java)
【算法学习】冒泡法排序【算法学习】 选择排序算法【算法学习】 插入排序算法【算法学习】 希尔排序算法【算法学习】 快速排序算法【算法学习】 归并排序算法【算法学习】 基数排序算法【算法学习】 堆排序算法稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操...原创 2019-08-22 10:36:30 · 877 阅读 · 0 评论 -
【算法学习】 希尔排序算法
插入排序算法存在的问题直接插入排序在在本身数量比较少的时候情况下效率很高,对于大规模乱序数组,其效率不是很理想,因为它只会交换相邻的元素,因此元素智能一点一点的移动到目标位置。例如,如果最小的元素恰好在数组的另一端,那么就需要N-1次移动才能将它移动到争取的位置。希尔排序是插入排序的一种更高效率的实现,对插入排序进行了改进。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序基...原创 2019-08-22 10:15:29 · 267 阅读 · 0 评论 -
【算法学习】 堆排序算法
完全二叉树:在一个满二叉树中,在最下层从最右侧起,去掉相邻的若干叶子结点,得到的二叉树称为完全二叉树。堆其实就是一棵完全二叉树。大顶堆堆顶元素(即第一个元素)为最大项,并且二叉树的父结点都大于子结点。小顶堆堆顶元素为最小项,并且二叉树的父结点都小于子结点。堆排序堆排序就是利用堆进行排序的算法,它的基本思想是,将待排序的序列构成一个大顶堆。此时整个序列的最大值就是堆顶...原创 2019-08-21 23:05:12 · 282 阅读 · 0 评论 -
【算法学习】 基数排序算法
基数排序是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。将数组中的所有数按位进行分类,由于每一位数的大小都在0~9之间,因此创建下标为0~9的十个数组,根据需要对数进行存储。图解:例如对{12 45 3 15 61 154 242 58 46 9}进行排序的步骤如下:第一轮,建立10个桶,也就是数组,将数组中的数依次取出,按照个位数字的不同依次放入不同的桶中:...原创 2019-08-20 19:28:10 · 360 阅读 · 0 评论 -
【算法学习】 归并排序算法
基本思想要将一个数组进行排序,可以先把它分成两半分别进行排序,再对这两个数组同样的道理来处理,再对这两个数组同样的道理来处理...直到不能再往下分,然后将结果合并起来,组成一个有序的数组。该算法采用分治的思想,先分后治,且各层分治递归可以同时进行。假设初始序列含有n个元素,则可以看成是n个有序的子序列,每个序列只有一个元素,然后两两归并,...,如此重复下去,知道得到一个长度为n的有序序列...原创 2019-08-20 14:30:51 · 508 阅读 · 0 评论 -
【算法学习】 快速排序算法
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,实现简单,而且效率高,适合于各种输入数据,它是处理大数据最快的排序算法之一了。快速排序令人瞩目的特点就是它是原地排序(排序过程中不申请多余的存储空间),且将长度为N的数组排序所需要的时间和NlogN成正比...原创 2019-08-19 10:03:03 · 511 阅读 · 0 评论 -
【算法学习】 插入排序算法
插入法排序和我春节回家时间和朋友玩斗地主的时候抓扑克的方式有点像:将每一个元素以插入的方式寻找该元素的适当位置,以达到排序的目的。把n个元素的数组看成一个有序表和无序表,从无序表中拿一个元素到有序表,检查有序表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。实现public class Insertion{ ...原创 2019-08-18 17:25:36 · 204 阅读 · 0 评论 -
【算法学习】 选择排序算法
原理选择排序算法是一种比较简单容易理解的排序算法,其原理如下:首先找到n个元素的数组当中最小的那个元素,其次,将它和数组中的第一个元素进行位置交换。再次,从剩下的n-1个元素当中找到最小的元素,将它与数组的第二个元素交换位置,以此类推,直到将整个数组进行排序。实现public class Selection{ public static void main(Strin...原创 2019-08-18 14:59:41 · 243 阅读 · 0 评论 -
【数据结构学习】二叉树遍历的代码实现
二叉链表结点首先对二叉链表的结点进行定义:public class Node { Object value; //结点值 Node leftChild; //左子树的引用 Node rightChild;//右子树的引用 //构造方法 public Node(Object value, Node leftChild, Node rightChild) { supe...原创 2019-08-13 14:41:39 · 843 阅读 · 0 评论 -
【数据结构学习】树与二叉树基本概念
树的概念树是N(N>=0)个结点的有限集,如图所示是一个简单的树:当N=0时为空树。结点分类结点拥有的子树的数目称为结点的度。度为0的结点称为叶子结点或者终端结点;树内各结点的度的最大值称为树的度。结点的层次和树的深度结点的层次从跟开始定义,层次树为1的结点是根节点。如果将树中结点的各个子树看成从左到右是有次序的,不能互换的,则称该树为有序树,否则称为...原创 2019-07-25 21:58:30 · 1389 阅读 · 0 评论 -
【数据结构学习】哈希表
数据结构中由数组和链表来实现对数据的存储,他们各有特点。 (1) 数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。 (2) 链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。 那么,我们能不能结合数组和链表的优点(即查询快,增删效率也高)呢? 答案就是“哈希表”。 哈希表的本质就是“数组+链表”。什么是...原创 2019-06-05 10:11:09 · 570 阅读 · 0 评论 -
【算法学习】二分法查找
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败...原创 2019-05-22 19:27:58 · 237 阅读 · 3 评论 -
【算法学习】冒泡法排序
冒泡排序是最常用的排序算法,在本科的时候就学过一次。算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3. 针对...原创 2019-05-22 18:56:57 · 234 阅读 · 0 评论 -
【数据结构学习】基本概念
什么是数据结构百度百科:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。维基百科:In computer science, a data structure is a data organization, management and storage format that enables efficient access and modi...原创 2019-02-27 22:56:33 · 239 阅读 · 0 评论 -
【数据结构学习】链表
将从下面4部分进行介绍首先介绍链表是什么,然后介绍为什么定义链表,接着是链表的分类,最后简单介绍一下链表结点的插入与删除方法。1.链表是什么首先,在介绍链表之前,我们先介绍一下什么是顺序存储结构。我们知道数据在计算机中的存储就像货物在仓库中的存储一样,不但占用一定的空间,还要有一个标示存储位置的地址。计算机通过该地址找到这个数据。那么顺序存储结构,就是在存储空间中,以一块连续的内...原创 2018-10-23 21:43:04 · 259 阅读 · 0 评论 -
【数据结构】 图的深度优先与广度优先遍历
所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历深度优先遍历图的深度优先搜索(Depth First Search) ,简称DFS。它的具体思想就像在家里找钥匙的时候,无论从哪一个房间开始都可以,比如说卧室,然后从房间的一个角开始,将房间仔仔细细,犄角旮旯都照一遍,不妨做任何死角,然后再寻找下...原创 2019-09-03 20:59:11 · 761 阅读 · 0 评论 -
【数据结构学习】 二叉搜索树
引入给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。解决方法分析:使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. 数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添...原创 2019-08-28 19:29:54 · 246 阅读 · 0 评论 -
【数据结构】 线索化二叉树
引入将序列{1,3,6,8,10,14}构建成一个二叉树:如果按照链表进行存放该二叉树,我们可以看一下其空间存储:我们现在体长节约型社会,对待程序也不例外,能不浪费的时间或者空间,都应该考虑节省。我们从上图可以看出,有许多的空指针域没有使用,造成了资源的浪费,应该要想办法利用起来。那么看看这样的空指针域有多少个呢,对于一个有n个结点的二叉链表,每个结点有左孩子和右孩子两...原创 2019-08-28 21:50:04 · 431 阅读 · 0 评论 -
【数据结构】 平衡二叉数(AVL树)
案例给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.问题分析:左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢 1)解决方案:平衡二叉树(AVL) 定义平衡二叉树也叫平衡二叉搜索树(Self-bala...原创 2019-08-30 23:02:41 · 316 阅读 · 0 评论 -
【数据结构学习】 赫夫曼树
引入在日常生活中,对于一些比较大的文件,我们进行邮件或者微信发送的时候总是喜欢压缩一下,这样除了可以节省下来很多空间,还有很重要的一点,就是我们可以在网络上以压缩的形式传输大量数据,使得存储和保存十分的高效。那么压缩时如何做到的呢?简单的说,就是把要压缩的文本进行重新编码,以减少不必要的空间。尽管现在最新技术在编码上已经很好很强大,但是这里介绍的是最基本的数据压缩编码方式---赫夫曼树。...原创 2019-08-25 10:34:08 · 224 阅读 · 0 评论 -
【数据结构】 队列
队列概念队列也是一种受限制的线性表,是只允许在一端进行插入,另一端进行删除的操作。允许插入的一端被称为队尾,允许删除的一端称为队头,栈遵循先进先出的原则。就像排队一样,过来一个人就要排到队尾,而进去车厢一个人肯定从队头开始。队的插入操作,叫做入队,队的删除操作,叫做出队。循环队列循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在...原创 2019-08-16 21:59:53 · 729 阅读 · 1 评论 -
【数据结构】 栈
栈的概念栈是一种受限制的线性表,是只能在表尾进行插入和删除操作。在我们日常生活中,一些软件的撤回功能,每次撤回到上一步,还有浏览器的后退键也是和栈的原理大同小异。允许插入和删除的一端被称为栈顶,另一端被称为栈底,栈遵循后进先出的原则。栈的插入操作,叫做入栈,栈的删除操作,叫做出栈。栈的应用--四则运动表达式求值使用逆波兰表示法:从左向右开始扫描中缀表达式;遇到数...原创 2019-08-16 11:36:47 · 735 阅读 · 0 评论 -
【数据结构学习】二叉树的遍历方法及实现
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。将整个二叉树看作三部分:根、左子树、右子树。如果规定先遍历左子树,再遍历右子树,那么根据根的遍历顺序就有三种遍历的方式: 前序 根 左子树 右子树 中序 左子树 根 ...原创 2019-07-26 21:26:00 · 715 阅读 · 0 评论 -
【算法学习】 赫夫曼编码
赫夫曼编码原理假设两台计算机之间需要传输一串字符串:i like like likejava do you like a java1.统计个字符出现的次数:d:1y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5空格:92.按照上面字符出现的次数创建一个赫夫曼树,次数作为权值:3. 然后根据赫夫曼树,给各个字符规定编码,向左的路径为0,向右的编...原创 2019-08-28 11:19:17 · 465 阅读 · 0 评论 -
【算法】 AOV网与AOE网
AOV网我们把施工过程、生产流程、软件开发、教学安排等都当成一个项目工程来对待,所有的工程都可以分为若干个“活动”的子工程。有很多场景对顺序有严格的要求,比如说建造一栋大楼必须先找好施工人员,购买各种材料和准备好各种器械之后才能开始盖楼。或者是拍电影必须先找好演员和各种负责人之后才能开拍。类似这样的场景我们称为AOV网。在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系...原创 2019-09-11 09:19:07 · 6348 阅读 · 0 评论 -
【算法】 最小生成树---Prim算法
最小生成树假设你是移动公司的电气施工的工程师,目前需要为一个镇的7个村庄铺设网络线路做设计,村子之间的位置以及直线距离已经在图上画 出,其中ABCDEFG分别代表那7个村庄,领导要求你必须用最小的成本完成线路铺设,使线路可以到达所有的村庄。这种架线问题的本质就是最小生成树问题,最小生成树(Minimum Cost Spanning Tree),简称MST。定义:1)给定一个带...原创 2019-09-09 22:02:00 · 808 阅读 · 3 评论 -
【算法】 字符串匹配问题 --- KMP算法
问题描述假如有两个字符串,判断一个字符串是否包含在另一个字符串里面。例如字符串str1的内容为CEABCDDEABCDEF另一个字符串str2的内容为ABCDE字符串2包含在字符串1里面,那么就返回true,否则返回false。暴力匹配暴力匹配的思路比较简单,好理解一点:假设现在str1匹配到 i 位置,子串str2匹配到 j 位置,则有:1)如果当前字符匹配成功...原创 2019-09-07 10:35:06 · 458 阅读 · 0 评论 -
【算法】 动态规划算法
问题背包问题:有一个背包,容量为4磅 , 现有如下物品: 物品 重量 价格 吉他(G) 1 1500 音响(S) 4 3000 电脑(L) 3 200...原创 2019-09-06 08:54:12 · 299 阅读 · 0 评论 -
【数据结构】 图的概念
图中的一些概念在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。在图中的数据元素,称之为顶点,边有时也称为链接。图的边可以有方向,所有边有方向的图称作有向图,这条边称为有向边,也叫做弧。无向边用小括号“()”表示,有向边用尖括号“<>”表示。 树中可以没有结点称为空树,但是在图结构中不允许...原创 2019-09-02 20:51:50 · 582 阅读 · 0 评论