算法及数据结构
文章平均质量分 92
经典算法及数据结构学习
BoringError
字节跳动后端工程师 | 持续学习,保持敬畏
展开
-
Java基础(5)-散列表与HashMap那点事
文章目录一. 散列表概述1.1 散列表是什么1.2 散列表的实现形式二. 散列函数三. 哈希冲突与解决方案3.1.拉链法3.2. 开放定址法四. 载荷因子五. HashMap 概述5.1.HashMap的简介5.2.HashMap的继承关系5.3 HashMap API六. 底层基本实现6.1 数组 + 链表6.2 两个重要参数:初始容量和加载因子6.3 hash(Object ...原创 2019-08-22 21:49:19 · 379 阅读 · 0 评论 -
数据结构(7)-红黑树
红黑树Red-Black Tree(简称R-B Tree)是一种二叉树类的数据结构,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。原创 2018-10-19 22:15:01 · 295 阅读 · 0 评论 -
数据结构(5)-双端链表
双端链表是一种特殊的链表,它和普通链表的差别在于,双端列表的链头不止含有对下一个结点的引用,还含有对链尾结点的引用, 所以双端链表可以对链头和链尾进行插入查找。由于前面已经详细地写过链表常用方法的实现,这里就不在赘述。原创 2018-10-10 20:02:42 · 397 阅读 · 0 评论 -
数据结构(4)-链表(2)
上文讲到了链表基础构造以及链表的insertFirst和deleteFirst方法,但是这两个方法只能查询到链头和删除链头,而不能针对链表中的某个节点进行操作,所以本文主要讲解操作链表LinkList的其他两个重要的方法:find方法和delete方法。原创 2018-10-09 16:22:17 · 324 阅读 · 0 评论 -
数据结构(6)-二叉搜索树
二叉树和队列、链表等一样,都是常用的数据结构。前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。但是二叉树的出现很好地解决了这些问题。原创 2018-10-17 22:32:25 · 415 阅读 · 0 评论 -
数据结构(2)-队列
队列结构的特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。原创 2018-10-06 14:48:42 · 327 阅读 · 0 评论 -
数据结构(1)-栈
栈(`stack`),是一种常见的数据结构;大部分的微处理器运用了栈的基本体系结构,当调用一个方法时,把它的返回地址和参数压入栈,当方法结束返回时,那些数据就出栈。这里涉及到的栈的特性,即`先进后出`的特性。原创 2018-10-06 00:23:26 · 308 阅读 · 0 评论 -
数据结构(8)-二叉堆
文章目录一、基本概念二、二叉堆表示法2.1、确定节点位置2.2、计算堆高度三、大顶堆的算法3.1、由下至上的堆有序化3.2、由上至下的堆有序化3.3、如何理解大顶堆的上浮和下沉四、算法具体实现二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。...原创 2019-05-18 15:41:32 · 823 阅读 · 0 评论 -
数据结构(9)-优先队列
文章目录一、基本操作二、Java代码实现本文的优先队列基于大顶堆实现:数据结构(8)-二叉堆优先队列是一种用来维护一组元素构成的结合S的数据结构,其中每个元素都有一个关键字key,元素之间的比较都是通过key来比较的。优先队列包括最大优先队列和最小优先队列,优先队列的应用比较广泛,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行,并且也可以...原创 2019-05-18 15:55:00 · 384 阅读 · 0 评论 -
数据结构(3)-链表(1)
代码实现public class QuickSort extends BaseUtil { public static void quickSort(String[] array, int left, int right) { //判断是否满足递归的条件 if (left >= right) { return; ...原创 2019-03-30 23:02:17 · 262 阅读 · 0 评论 -
数据结构(10)-TrieTree(字典树)的实现
Let’s Look Look What’s TrieTree!1.1 什么是TrieTreeTrieTree又被称为字典树/单词查找树/前缀树,常用来做大量的词频分析以及排序大量字符串,是哈希树的一种变种形式,它最大的特点就是每一个节点中只存放字符串的一个字符,而树的一条边即该字符串或者是其前缀,这样的特性使得字典树被广泛地应用于海量字符串处理程序中.1.2 TrieTree的实现...原创 2019-09-05 22:43:21 · 417 阅读 · 0 评论 -
数据结构(11)-UnionFind(并查集)的实现与优化
文章目录1.1.什么是并查集1.2.并查集的实现1.3.优化1:数量优化1.4.优化2:高度优化1.5.优化3:路径压缩优化今天来看看并查集的实现与优化~- ( ゜- ゜)つロ1.1.什么是并查集并查集这种数据结构的出现是为了解决一类被称为动态连通的问题:所谓的动态连通问题是指在一组可能相互连接也可能相互没有连接的对象中,判断给定的两个对象是否联通的一类问题。在并查集中需要对外提供两...原创 2019-09-09 17:50:04 · 436 阅读 · 1 评论 -
图论基础入门
文章目录一.图论与图1.什么是图论2.什么是图3.经典图论问题和应用1.经典问题2.应用4.经典图论算法二.图的分类1.无向图2.有向图3.无权图4.带权图5.稀疏图6.稠密图与完全图三.图的连通性1.连通性2.带环边与平行边四.图的表示1.邻接矩阵2.邻接表五.图的基本算法0.基本代码框架1.深度优先遍历2.求解连通量3.判断两个顶点是否连通4.寻找连通路径6.广度优先遍历7.寻找最短路径一....原创 2020-03-03 15:37:59 · 1030 阅读 · 0 评论 -
最小生成树问题与Prim、Kruskal算法
文章目录一.带权图基础1.什么是带权图2.如何实现3.Java代码实现二.最小生成树与切分定理1.最小生成树(Min Span Tree,MST)2.切分定理三.Prim算法1.Lazy Prim算法1.算法思路2.代码实现3.时空复杂度2.Direct Prim算法四.Kruskal算法1.算法思路2.代码实现3.时空复杂度一.带权图基础1.什么是带权图带权图指的是顶点之间的不仅有连接关系...原创 2020-03-06 21:14:18 · 506 阅读 · 0 评论 -
算法学习笔记(2)-选择排序
选择排序(Select Sort)的思想是,在比较开始前将最小值假定为第一个数,在每轮循环的比较中找出最小的那个数,将其放到数组的前面。Java代码:public class SelectSort { public static void main(String[] args) { int[] array = {7,5,3,8,4,1,3,61,13,31,11,3};...原创 2018-06-24 21:34:27 · 248 阅读 · 0 评论 -
算法学习笔记(3)-二分查找
二分查找法(binary search)是一种思想,当需要在一段有序的数据中(升序或者降序)中查找某个数据时,如在一个形如1,2,3,4,···,99,100的数组中判断60是否存在,最简单的方式就是遍历判断原创 2018-10-04 21:25:25 · 369 阅读 · 0 评论 -
算法学习笔记(5)-堆排序
希尔排序算法(ShellSort)由计算机科学家Donald L.Shell与1959年发现,该算法基于插入排序,但是增加了一个特殊的实现机制,使得希尔排序算法能大大地优于插入排序算法。依赖于这个特殊的实现机制,使得希尔排序对多达几千的数据项的排序来说性能良好,其时间复杂度为O(N(logN)^2)。原创 2018-10-13 19:02:12 · 364 阅读 · 0 评论 -
算法学习笔记(6)-希尔排序
希尔排序的是一种改进版的插入排序,它的思想是确定一个大的步长h,以此步长为间隔通过插入排序去制造一个间隔h的有序数组,并且在每轮之后减少步长,当步长为1时完成普通的插入排序时间复杂度: 不同的序列时间复杂度会不一样代码实现public class ShellSort { public static void main(String[] args) { S...原创 2019-03-30 22:59:57 · 1124 阅读 · 0 评论 -
算法学习笔记(7)-桶排序
文章目录一、推荐阅读二、Java实现三、桶排序的优缺点桶排序是一种简单快速的排序,它在小数据范围内的排序速度可以堪比快排,它的缺点是需要产生额外的空间复杂度(或许这是常用的排序算法里空间复杂度最高的一个排序算法了),用空间来换取时间。一、推荐阅读这里推荐两篇文章,感觉蛮好的,特别是的第二篇文章最简单的排序-桶排序桶排序Java实现它的实现思路大致如下:二、Java实...原创 2019-04-01 18:00:41 · 1118 阅读 · 0 评论 -
算法学习笔记(8)-归并排序
文章目录一、分治法思想二、Java代码实现2.1、自顶向下的归并排序2.2、自底向上的归并排序三、改进3.1、数据量小3.2、左右数组已经完全排好序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"...原创 2019-05-15 13:41:39 · 305 阅读 · 0 评论 -
算法学习笔记(4)-快速排序
快速排序是图灵奖得主 C. R. A. Hoare 于 1960 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。原创 2018-10-09 00:00:50 · 2524 阅读 · 0 评论 -
算法学习笔记(9)-回溯算法与八皇后问题
回溯算法也叫试探搜索算法,它是一种类似于暴力枚举的搜索方法, 但是不同的是在回溯的过程中存在剪枝和状态的自转化,所以对于暴力枚举类问题,往往选择使用回溯算法,以达到优化时间和空间的目的一.用回溯算法解决问题的一般步骤1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。2 、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。3 、以深度优先的方式搜索解空...原创 2019-08-24 16:25:31 · 490 阅读 · 0 评论 -
算法学习笔记(10)-缓存淘汰算法LRU
文章目录1.1 何谓LRU算法1.2 如何实现1.3 为何不直接使用HashMap作为LRU底层结构今日心情美丽,让咱们看看传说中的LRU算法是怎么一回事1.1 何谓LRU算法LRU算法指的是Least Recently Used,即最近最少使用算法,也被称作缓存淘汰算法/页面置换算法,LRU算法的基本原则是如果一个数据最近很少被访问到,那么之后也应该很少被访问到;如果一个数据最近经常被...原创 2019-09-05 13:05:33 · 342 阅读 · 0 评论 -
算法学习笔记(1)-冒泡排序
简介:冒泡排序(Bubble Sort)是最为直观和易懂的排序算法之一,它的思想是前后比较,若前者大于后者就把前者和后者交换位置,就像一个重量大的泡泡一样,慢慢地浮至其他轻的泡泡之下。 Java代码: //冒泡排序,普通版本,平均时间复杂度n^2,在数组排完前面几轮已经有序后仍会继续 //排序,故在数组有序时时间复杂度仍为n^2 public static v...原创 2018-06-24 20:29:08 · 800 阅读 · 0 评论