数据结构与算法基础
文章平均质量分 73
如我般骄傲
学习
展开
-
位运算学习
一、位运算基础一.原码原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:[+1] = 0000 0001[-1] = 1000 0001如果改成十六位二进制:[+1] =0000 0000 0000 0001[-1] =1000 0000 0000 0001第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111]即[-127 , 127]二.反码对于正数而言,反码原创 2022-03-21 15:15:27 · 352 阅读 · 0 评论 -
Java基础-Java中的集合框架
一、Java集合框架基础接口一.CollectionCollection使集合框架的基础接口之一,一个集合代表一组对象,这些对象即为集合的元素。Java平台不提供这个接口的任何直接实现。二.Set一个不包含重复元素的集合三.List一个可以包含重复元组的集合四.MapMap是一个将key映射到value的对象,一个Map不能包含重复的Key,每个Key只能映射一个Value五.Queue队列结构的实现六.Iterable基础接口,可以通过for-each语法进行遍历。二、List的原创 2021-11-18 23:50:20 · 4085 阅读 · 0 评论 -
大顶堆和小顶堆
PriorityQueue(优先队列)是一个基于优先级堆的无界优先级队列,底层实现是一棵完全二叉树不允许使用 null 元素不允许插入不可比较的对象,会导致 ClassCastException。优先级队列是无界的,但是有一个内部容量,默认容量为11,控制着用于存储队列元素的数组大小。它通常至少等于队列的大小。随着不断向优先级队列添加元素,其容量会自动增加PriorityQueue 线程不安全,想线程安全用 PriorityBlockingQueue 类实现小顶堆PriorityQueue原创 2021-09-15 15:27:49 · 218 阅读 · 0 评论 -
数据结构与算法之美-101|动态规划
一、初识动态规划动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。一.0-1 背包问题对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢?1、递归树假设背包的最大承载重量是 9。有 5 个不同的物品,每个物品的重量分别是 2,2,4,6,3。回溯求解过程,用递归树画出来,就是下面这个样子:这个递归树的意思是,对于同一节点,左侧表示不加入,右侧表示加入。F(0原创 2021-06-08 17:17:16 · 352 阅读 · 0 评论 -
数据结构与算法之美-100|贪心算法
一、如何理解贪心算法一.案例假设有一个可以容纳 100kg 物品的背包,可以装各种物品。有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,如何选择在背包中装哪些豆子?每种豆子又该装多少呢?这个问题很简单,只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、绿豆、红豆、青豆、黄豆,所以,我们可以往背包里装 20kg 黑豆、30kg 绿豆、50kg 红豆。二.什么情况下可以使用贪心算法1、第一步,当看到这类问题的时候,首先原创 2021-05-20 14:50:06 · 213 阅读 · 1 评论 -
数据结构与算法之美-20 |字符串匹配
一、BF 算法(Brute Force,暴力匹配)就是暴力循环查找,虽然复杂度比较高,但是却是经常使用的算法。第一,实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长。而且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以就停止了,不需要把 m 个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。第二,朴素字符串匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也原创 2021-03-18 14:26:22 · 619 阅读 · 0 评论 -
数据结构与算法之美-19 |深度和广度优先搜索
一、什么是搜索算法算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。二、无向图的实现大佬写的public class Graph { // 无向图 private int原创 2021-03-18 10:32:09 · 170 阅读 · 0 评论 -
数据结构与算法之美-18 |图
一、图(Graph)和树比起来,图是一种更加复杂的非线性表结构。树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。图中的一个顶点可以与任意其他顶点建立连接关系。这种建立的关系叫做边(edge),一个顶点和其他顶点有多少连线,我们称之为度(degree)。图有好几种,无向图(双向箭头),有向图(单向箭头),加权图(带有权重)…二、图的存储方式一.邻接矩阵存储(Adjacency Matrix)这张图刚开始学习的人可能会一脸懵逼,我越觉得这张图有一些不恰当的地方,比如不应该用数字表原创 2021-03-04 14:44:02 · 140 阅读 · 2 评论 -
数据结构与算法之美-17 |堆和堆排序
一、堆(Heap)堆是一种特殊的树,只要满足这两点,它就是一个堆。堆是一个完全二叉树;堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。一.什么是完全平衡二叉树复习一下编号 2 的二叉树中,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点,这种二叉树就叫做满二叉树。编号 3 的二叉树中,若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这种二叉树叫做完全二叉树,如果一棵二叉树是原创 2021-03-03 10:55:25 · 538 阅读 · 0 评论 -
数据结构与算法之美-16 |递归树
一、什么是递归树递归的思想是将大问题分解为小问题来求解,然后再将小问题分解为小小问题。这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止。原创 2021-03-03 10:41:01 · 247 阅读 · 1 评论 -
数据结构与算法之美-15 |红黑树
一、什么是“平衡二叉查找树”平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。完全二叉树、满二叉树都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。二、红黑树红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST)。原创 2021-02-27 14:56:01 · 506 阅读 · 2 评论 -
数据结构与算法之美-14 |树和二叉树
一、树(Tree)一.什么是树树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。二.树的结构图下图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。把没有父节点的节点叫做根节点,也就是图中的节点 E。我们把没有子节点的节点叫做叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点。关于“树原创 2021-02-26 16:10:10 · 193 阅读 · 0 评论 -
数据结构与算法之美-13 |哈希算法
一、什么是哈希算法?哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。一个好的哈希算法应该满足的点从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;哈希算法的执行效率要尽量高效,针对较长的文本,也能快速原创 2021-02-25 17:34:37 · 178 阅读 · 0 评论 -
数据结构与算法之美-12 |散列表(哈希表)
一、散列思想散列表的英文叫“Hash Table”,散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。散列表用的就是数组支持按照下标随机访问的时候,时间复杂度是 O(1) 的特性。通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当按照键值查询元素时,用同样的散列函数,将键值转化数组下标,从对应的数组下标的位置取数据。二、散列函数散列函数,顾名思义,它是一个函数。我们可以把它定义成 hash(原创 2021-02-24 17:35:55 · 362 阅读 · 0 评论 -
数据结构与算法之美-11 |跳表
一、什么是跳表二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,还想使用二分查找,只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表(Skip list)。二、如何理解跳表对于一个单链表来讲,即便链表中存储的数据是有序的,如果要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)。那怎么来提高查找效率呢?如果像图中那样,对链表建立一级“索引”,查找起来是不是就会更快一些呢?每两个结点原创 2021-02-24 10:36:24 · 176 阅读 · 0 评论 -
数据结构与算法之美-10 |二分查找
一、二分查找的思想二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。二分查找的效率非常之高,时间复杂度为O(log(N)),这是一个相当惊人的时间复杂度。二、二分查找的递归和非递归实现一.递归实现二.非递归实现三、二分查找的易错点四、二分查找的局限性一.二分查找依赖的是顺序表结构二.二分查找针对的是有序数据三.数据量太小不适合二分查找四.数据量太大也不适合二分查找五原创 2021-02-23 18:56:37 · 230 阅读 · 0 评论 -
数据结构与算法之美-09 |排序优化
一、如何选择合适的排序算法如果对小规模数据进行排序,可以选择时间复杂度是 O(n2) 的算法;如果对大规模数据进行排序,时间复杂度是 O(nlogn) 的算法更加高效。所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度是 O(nlogn) 的排序算法来实现排序函数。实际上使用归并排序的情况其实并不多。快排在最坏情况下的时间复杂度是 O(n2),而归并排序可以做到平均情况、最坏情况下的时间复杂度都是 O(nlogn),但是归并排序并不是原地排序算法,空间复杂度是 O(n)。所以,粗略点、夸张点讲,如原创 2021-02-23 18:40:31 · 125 阅读 · 0 评论 -
数据结构与算法之美-08 |排序
一、什么是排序所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。二、怎么分析一个排序算法一.排序算法的执行效率1、最好情况,最坏情况,平均情况时间复杂度分析为什么要区分这三种时间复杂度呢?第一,有些排序算法会区分,为了好对比,所以最好都做一下区分。第二,对于要排序的数据,有的接近有序,有的完全无序。有序度不同的数据,对于排序的执行时间肯定是有影响的,要知道排序算法在不同数据下的性能表现。2、时间复杂度的系数、常数原创 2021-02-15 21:54:33 · 524 阅读 · 3 评论 -
数据结构与算法之美-07 |递归
一、什么是递归递归是一个思想,总结为以下两点一.将一个问题拆解为几个子问题(拆分后的子问题和原问题除了规模不同其他思路相同)何为子问题?子问题就是数据规模更小的问题。二.找出问题的终止条件把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。二、举例站在一个台阶之上,往下走,一步可以走1个台阶,也可以走2个台阶,有多少种走法。f(1) = 1;f(2) = 2;f(n) = f(n-1)+f(n-2)...原创 2021-02-15 21:28:25 · 219 阅读 · 0 评论 -
数据结构与算法之美-06 |队列
一、什么是队列?队列是一种“操作受限”的线性表,只允许在一端插入和另一端输出。队列和栈都是操作受限的线性表,区别在于栈是一头操作的,先进后出,后进先出,队列是尾部进入,头部输出。队列的概念很好理解,基本操作也很容易掌握。作为一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列 Disruptor、Linux 环形缓存,都用到了循环并发队列;Java concurr原创 2021-02-15 19:48:23 · 190 阅读 · 0 评论 -
数据结构与算法之美-05 |栈
一、什么是栈?栈是一种“操作受限”的线性表,只允许在一端插入和删除数据,后进者先出,先进者后出。无论是数组或者是链表都可以实现栈的功能,栈只是一种特性的数据结构,可以理解为封装好的数组或者是封装好的链表。当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。二、实现栈栈的主要操作是入栈和出栈,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。实际上,栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表原创 2021-02-03 18:38:19 · 162 阅读 · 2 评论 -
数据结构与算法之美-04 |链表
一、定义 链表是一种线性表数据结构; 从底层存储结构上看,链表不需要一整块连续的存储空间,而是通过“指针”将一组零散的内存块串联起来使用; 链表中的每个内存块被称为链表的“结点”,每个结点除了要存储数据外,还需要记录上(下)一个结点的地址。原创 2021-02-03 10:06:30 · 158 阅读 · 0 评论 -
数据结构与算法之美-03 |数组
一、定义数组(Array)**是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。**数组长度一旦声明,不可改变不可追加,根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。原创 2021-02-02 20:11:29 · 281 阅读 · 0 评论 -
数据结构与算法之美-02|复杂度分析(重点)
一、概述一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。2.掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本原创 2021-01-27 11:00:51 · 367 阅读 · 0 评论 -
数据结构与算法汇总
数据结构与算法之美目录原创 2021-01-27 10:55:08 · 284 阅读 · 0 评论