![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
从基础的线性表(数组、链表),到常用的树结构,和图相关一些入门算法。
老周(重庆)
一个撸了10年代码的老鸟
展开
-
数据结构和算法之十一:BitMap和布隆过滤器
数据结构之bitmap和布隆过滤器bitmap问题:100个数,取值范围在0-2亿,如何快速的判断一个数是否在这100个数中?思路1:开一个数组,数值对应数组的下标,对存在的100个数进行标记,比如设置为1;这样,查找一个数是否存在时,直接通过数组下面获取对应的值,判断是否为1即可。这个思路非常简单高效,就是有一个问题,因为取值范围0-2亿,开个两个亿的空间数组有点不大科学,而且如果内存有限制的话,还开不出来。思路2:既然我只是对存在的数做一个标记,那么用一个二进制位就可以了吧,0表示不存在,1表原创 2020-05-27 11:38:12 · 527 阅读 · 0 评论 -
数据结构和算法之十:堆树
数据结构树论之堆树堆树,作为二叉树中的一个重要成员,常用于优先队列、TOPK等问题中。在上一文中,我们使用优先队列非常方便的构建出了赫夫曼树,那么你知道优先队列是怎么实现的呢?堆树长啥样子,我们先画个图认识一下:(这是大顶堆)首先,堆树是一颗完全二叉树(完全二叉树的定义你应该还知道吧),同时满足每个父亲节点的值都大于其孩子节点。(每个父亲节点的值都大于其孩子节点的话,就叫小顶堆,为了简化,本文都用大顶堆来举例)既然堆树是一个完全二叉树,那么我们就可以使用数组来存储,左孩子的下标是父亲节点的2倍,原创 2020-05-27 11:36:08 · 652 阅读 · 0 评论 -
数据结构和算法之九:赫夫曼树
数据结构树论之赫夫曼树本文,我们来讨论一个用于压缩、加密等场景的赫夫曼编码,而赫夫曼编码通过赫夫曼树生成出来。假如有一个字符串“abcdeaaaaa”,请问如何用最小的存储空间来保存?在不压缩的情况下, java中char类型用两个字节表示,那么上面这个串的话得用20个字节才能装下。我们知道,计算机底层都是二进制的,对于上面这个字符串,我们发现不同的字符为5个,因此可以使用3个位来编码,3个位的编码空间为8,从而节省存储空间:比如a:000, b:001,c:010, d:011, e:100那原创 2020-05-27 11:28:36 · 513 阅读 · 0 评论 -
数据结构和算法之八:B+树
数据结构树论之B+树上一文中,我们详细了解了二叉树,以及一些特殊的二叉树(搜索树、平衡树、红黑树)的原理,本文重点来说明在MYSQL中用于索引的B+树。如果仅仅是在内存中进行操作,那么红黑树是完全能够满足我们的要求的,但是如果数据量到达非常庞大的量级,比如几千万上亿时,我们是很难将数据全部load到内存中,构建出红黑树来直接查询,那么必定会将大量数据存放到磁盘上,在查询时通过磁盘I/O来完成。我们假设现在有1000万数据,如果用红黑树来处理的话,那么树高估计在23-24层,如果1000万数据都在内存中原创 2020-05-27 11:23:47 · 768 阅读 · 0 评论 -
数据结构和算法之七:二叉树
数据结构树论之二叉树本篇文章,详细学习一下二叉树相关知识。首先,简单的理解一下树的一下基本概念:结点:树里面的元素。父子关系:结点之间相连的边子树:当结点大于1时,其余的结点分为的互不相交的集合称为子树度:一个结点拥有的子树数量称为结点的度叶子:度为0的结点孩子:结点的子树的根称为孩子结点双亲:和孩子结点对应兄弟:同一个双亲结点森林:由N个互不相交的树构成深林画个图示意一下:除了最后一个不是树(是图),其他的都是树,可以看到,树其实是包含链表结构的。另外在树结构里面,还有几个重原创 2020-05-27 11:18:59 · 791 阅读 · 0 评论 -
数据结构和算法之六:贪婪和动规算法
算法理论之贪婪算法和动态规划本篇文章,简单的介绍一下贪婪算法和动态规划,因本人是算法渣渣,因此权当大家看个热闹。贪婪算法一个简单的问题:公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束时间,你怎么样安排才能使安排最多场次的会议?大家先花两分钟,脑海里面梳理一下解题思路。思路1:优先安排会议时间最短的能不能行?比如时间是8-12点,会议1是9点半到10点半(1个小时),会议2从8点到10点(2个小时),会议3从10点到11点30分(1.5个小时),此时如果优先安排最短原创 2020-05-27 11:06:36 · 284 阅读 · 0 评论 -
数据结构和算法之五:排序算法二
数据结构基础之排序算法二学习算法,排序算法当然是不能少的,这次我们来学习一下基础的选择排序,冒泡排序,以及大名鼎鼎的快速排序。选择排序选择排序,非常好理解,就是找最小的数放到第一位,然后从第二个数开始找最小的数,放到第二个位置,然后从第三个数开始找最小的数,放到第三个位置… 。每次找最小的数,就是选择最小的数,这就是选择的含义。看个图就明白了第一次,找到最小的数字1,放到第一个位置上(当然原来在第一个位置的元素就交换到原来数字1的位置上了);第二次,从第二个位置也就是6开始,找到最小的数字2,放原创 2020-05-27 11:01:48 · 139 阅读 · 0 评论 -
数据结构和算法之四:排序算法一
数据结构基础之排序算法一学习算法,排序算法当然是不能少的,这次我们来学习一下基础的插入排序,对插入优化的希尔排序,以及用得最多的归并排序。插入排序插入排序,顾名思义,就是通过插入来排序,简单来说,将一个序列划分为两部分,一部分是已经排好序的,一部分是未排序的。每次从未排序的中拿一个数出来,在有序的那部分去比较,找到位置插入。想象打扑克,拿到手里面的牌已经排好序了,未拿的牌是无序的,每次拿一张牌,在手上已经排好序的牌中,找个位置插入进去,这就是插入排序。我们通过图示来理解一下这个过程:我们有一个原创 2020-05-27 10:54:28 · 137 阅读 · 0 评论 -
数据结构和算法之三:递归算法
数据结构基础之递归算法说到递归,相信大家都用过递归,我们今天就通过一个经典的斐波那契数列问题,展开聊下递归算法。斐波那契数列,1 1 2 3 5 8 13 … , 满足规律是,从第3个数开始,后一个数是前两个数相加,用数学公式来表示第n个数的值的话,那就是 f(n) = f(n-1) + f(n-2) ,条件是 n > 2; 同时 f(1) = 1, f(2) = 1。如果用代码来实现: /** * 斐波拉契数列,求第n个数的值 * 1,1,2,3,5,8,13,21,。原创 2020-05-27 10:49:49 · 488 阅读 · 0 评论 -
数据结构和算法之二:栈和队列
数据结构基础之栈和队列上一文中,我们学习了数组和链表,它们两个是存储数据的最底层结构,是功能完全的线性表。栈和队列是受限的线性表,啥叫功能完全,功能受限呢?数组和链表,我们可以对里面任意位置上的元素进行任意的操作,不受任何限制,而栈和队列,其内部也是数组或链表实现,但是对外暴露的操作接口是有限的,栈只能在栈顶进行压栈和出栈操作,队列只能队尾插入,队头出队操作。栈和队列的结构示意为啥有了功能全面的,更加灵活的数组和链表了,为啥还要搞功能受限的结构出来呢?这是因为在特定的应用场景下, 栈和队列用起来更原创 2020-05-27 10:46:59 · 346 阅读 · 0 评论 -
数据结构和算法之一:基础结构线性表
数据结构基础知识一个简单的问题开始问题:如何判断一个数是2的N次?思路1, 对于这个题目,判断一个数是否是2的N次方,可以通过数学公式, 给定的数字 x ,它是否等于 x = 2 ^ n, 即 x = 2 * 2 * … * 2 , 那么我们可以使用一个循环来解决, 伪代码如下while(x > 1){ x % 2 != 0; return false; x = x / 2;}思路2, 要判断一个数是否是2的N次方,假如我们设定一个数据范围,比如100万,那么我们可以先将在这个范围原创 2020-05-27 10:23:11 · 445 阅读 · 0 评论