数据结构与算法
文章平均质量分 92
qq_35671159
这个作者很懒,什么都没留下…
展开
-
RoaringBitmap数据结构以及精确去重UDAF实现
一、位图(Bitmap)1、什么是比特(bit) 1)它是英文 binary digit 的缩写 2)它是计算机内部存储的最小单位,用二进制的0或者1来表示 3)1 Byte = 8 bit;1024 Byte = 1 Kb;1024 Kb = 1 Mb;1024 Mb = 1 Gb;1024 Gb = 1 Tb2、引子给出40亿个连续不重复且无序的无符号int型整数,目前条件是只有一个2G内存的PC,需要判断出某个数字是否在给出的这40亿个数字里面...原创 2022-05-06 17:09:50 · 1837 阅读 · 0 评论 -
数据结构与算法之快速排序
1. 什么是快速排序:最突出的特点就是通过数字之间的比较找到基准数的位置,然后根据该位置进行递归分治2. 画图分析,示例数组为{4, 7, 6, 5, 3, 2, 8, 1}1)数组{4, 7, 6, 5, 3, 2, 8, 1}以4为基准,分治数组2) 紧接着递归进入数组中小于 4 的这部分以 3 为基准发现都在3的左边,右边再次递归时,startIndex= 2 + 1 endIndex = 2,2是3这个数字在该数组中的索引位置,startIndex > endInd..原创 2020-08-19 17:42:17 · 313 阅读 · 1 评论 -
数据结构与算法之希尔排序
1. 我是看了漫画算法以后才看懂的,在这里附上漫画算法的地址:https://mp.weixin.qq.com/s/b9-dkpAhWJYshuSs5cwnOw2. 希尔排序从两个方面来优化插入排序的:1) O(n^2) 中n的规模(n的规模越小,排序的时间花的就越少)2) 整个数组序列的有序性(越是趋向于有序,比较交换的次数少了,排序的时间花的就越少)3. 时间复杂度,注:我不会证明。。O(nlogn)...原创 2020-07-18 09:47:19 · 116 阅读 · 0 评论 -
数据结构与算法之插入排序
1. 什么是插入排序我的理解:我感觉插入排序结合了冒泡排序和选择排序的一些思想但又不太一样。冒泡排序是两两比较从右向左依次推出最值,选择排序是从左向右从乱序序列中选出最值之后插入相应位置,插入排序是将未排序值和有序序列两两比较将比较值交换到相应的位置。冒泡排序重在两两比较后交换;选择排序重在在没排序的序列中选择最值;插入排序重在没排序的值和已排好序的序列进行比较,再两两交换直到交换到相应位置2. 图解,由小到大排序,数组为:3,4,1,5,23. show me the code/原创 2020-07-06 11:51:53 · 128 阅读 · 0 评论 -
数据结构与算法之选择排序
1. 什么是选择排序我的理解:从左向右一次推举中数组中的最值,推举的方式是:第一次选择所有元素的最值放到数组左边第一位,第二次再从剩下的元素中选择最值放到第二位,依此类推,直到排出数组的顺序为止2. 图解,由小到大排序,数组为:3,4,1,5,22. show me the code/** * 选择排序 */public class SelectSort { public static void main(String[] args) { int[]原创 2020-06-29 17:27:40 · 176 阅读 · 0 评论 -
数据结构与算法之冒泡排序
1. 什么是冒泡排序:我自己的理解:相邻的数字之间两两比较不断的从右向左推选出最大(小)值的过程。特点就是一次只能在最右边推举出一个最大(小)值,所以需要多次推举2. 对上面的理解画图解释一下,以数组 3, 4,1,5,2由小到大为例:3. show me the code:public class BubbleSort { public static void main(String[] args) { int[] num = {3, 4, 1, 5, 2原创 2020-06-28 19:49:46 · 179 阅读 · 0 评论 -
数据结构与算法之(渐进)时间复杂度
1. 搜了好多文章也没太理解,看了下面这个大佬的文章之后有些理解了,附上大佬的博客地址:https://blog.csdn.net/qq_35661171/article/details/843136012. 重点概念总结一下:T(n)函数表示基本操作执行次数 渐进时间复杂度:若存在函数f(n), 使得当n趋近于无穷大时, T(n) / f(n) 的极限值为不等于零的常数, 则称 f(n)是T(n)的同数量级函数。记作T(n) =O( f(n) ), 称O( f(n) )为算法的渐进时间复杂.原创 2020-06-28 15:31:40 · 2177 阅读 · 1 评论 -
数据结构与算法之递归(8皇后问题)
1. 规则:有一个 8 x 8 的棋盘,放置皇后棋子,要求:所放的皇后不能在同一排,不能在同一列,不能在同一斜线2.http://www.4399.com/baidugame/42643.htm 这个是4399里8皇后小游戏的地址3. 为了理清思路,我以 4 x 4的棋盘为例,code/** * 8皇后问题 */public class Queue8 { // 一维数组代表所放皇后的列, 我们默认不把皇后放在同一行 private final int max = 4..原创 2020-06-22 14:21:16 · 229 阅读 · 2 评论 -
数据结构与算法之递归(迷宫回溯问题)
什么是递归:顾名思义,递归就是自己调用自己。我自己理解递归的本质是不断的开辟方法栈的过程/** * 迷宫回溯 */public class MazeBacktrack { public static void main(String[] args) { // 构造一个7行6列的地图矩阵 int[][] map = new int[7][6]; // 第一行和最后一行都是"墙", 用数字1来表示 for (int i = 0原创 2020-06-17 12:15:21 · 254 阅读 · 0 评论 -
数据结构与算法之计算器实现(中缀转后缀,用后缀表达式实现)
/** * 后缀表达式实现计算器 */public class SuffixExpressionCalculator { /** * 计算方法 * * @param infixExpr 中缀表达式 * @return 结果 */ public int calculate(String infixExpr) { Stack<Integer> stack = new Stack<>(); .原创 2020-06-12 19:31:53 · 346 阅读 · 0 评论 -
数据结构与算法之前缀、中缀、后缀表达式(中缀转前缀、中缀转后缀)
中缀表达式:我们熟悉的算术表达式,如:(3+4)*5-6+8前缀表达式(波兰表达式):机器熟悉的算术表达式,如:+ - * + 3 4 5 6 8后缀表达式(逆波兰表达式):机器熟悉的算术表达式,如:3 4 + 5 * 6 - 8 +1. 中缀转前缀语言描述:从右向左遍历中缀表达式,如果是数字就压入数字栈,如果是符号就压入符号栈,如果当前符号比符号栈栈顶符号优先级小则弹出栈顶符号并压入数字栈,如果当前符号比符号栈的栈顶符号优先级大或者相等则压入符号栈,如果有括号,在遍历完括号执行完上述操作.原创 2020-06-11 19:00:10 · 2466 阅读 · 1 评论 -
数据结构与算法之栈(简单计算器的实现)
//需要用到的栈类public class StackDemo { private int top; private final int size; private final int[] stack; public StackDemo(int size) { this.size = size; stack = new int[size]; top = -1; } /** * 判断栈是否已满 .原创 2020-06-09 22:45:59 · 908 阅读 · 0 评论 -
数据结构与算法之栈(简单Demo,用单向链表来模拟栈)
/** * 用链表实现栈 */public class StackLinkedList { private final Node head = new Node(-1); // 链表节点的最大值 private final int maxSize; // 当前链表节点的个数 private int count; public StackLinkedList(int maxSize) { this.maxSize = maxSiz.原创 2020-06-09 15:37:02 · 164 阅读 · 0 评论 -
数据结构与算法之栈(简单demo,主要是理解栈的特点)
什么是栈:先入后出的有序列表, 类似于弹夹压子弹, 最后一颗在栈顶, 第一个元素在栈底为什么要用栈:栈可以解决的问题有 1. 子程序调用; 2.递归; 3.表达式的转换; 4.二叉树的遍历快速入门: public class StackDemo { private int top; private int size; private final int[] stack; public StackDemo(int size) { this.size .原创 2020-06-08 13:46:03 · 234 阅读 · 1 评论 -
数据结构与算法之单向环形链表(约瑟夫环、约瑟夫问题)
1. 什么是单向环形链表:单向链表的尾节点的next指针指向链表头节点2. 为什么要有这个数据结构:我目前理解的是可以解决约瑟夫问题3. 怎么解决约瑟夫问题:约瑟夫问题(变种,本质不变):设编号为1到n的人围坐一圈, 编号为k(1<=k<=n)的人从1开始报数, 数到第m的人出列, 他/她的下一位又从1开始报数, 数到第m的人又出列. 以此类推, 直到所有人出列为止, 由此产生一个出队列的编号,请打印这个出队列的编号show me the code:public cla原创 2020-06-05 19:25:59 · 256 阅读 · 0 评论 -
数据结构与算法之双向链表(增删改查、有序增、正向遍历、反向遍历)
双向链表1.什么是双向链表: 每个节点都有前一个节点的位置和后一个节点的位置2.为什么要用双向链表: 和单向链表比, 双向链表可以正反向的遍历, 而且可以自我删除节点. 单链表只能单向遍历, 并且在删除节点时需要找到待删除节点的前一个节点.3.怎么用双向链表:public class DoublyLinkedList { // 头节点 private final Node headNode = new Node(0, "", ""); /** * 添加节点.原创 2020-06-03 15:45:49 · 610 阅读 · 0 评论 -
数据结构与算法之单链表(增{包含增序增加}、删、改、查、链表反转、有序链表合并{包含递归和非递归两种方式})
直接上代码吧,后面再总结一下:public class SinglyLinkedList { // 头节点 private final Node headNode = new Node(0, "", ""); /** * 添加节点 * * @param newNode 新节点 */ public void add(Node newNode) { Node temp = headNode; whi原创 2020-05-29 13:24:23 · 254 阅读 · 0 评论 -
数据结构与算法之环形队列(以int数组为例,不包含扩容)
废话补不多说了, 环形队列最难理解的部分就是取模部分, 可以先看一下这个链接的大佬的讲解:https://juejin.im/post/5c95d2515188252dab3ebfc5如果上面这个链接的内容看懂了, 那本章的内容就不用看了, 就只当我做一个学习记录就好了:// 代码部分import java.util.Arrays;public class CircleArrayQueue2 { private int front; private int tail; .原创 2020-05-26 17:57:07 · 190 阅读 · 0 评论 -
数据结构与算法之稀疏数组(棋盘的保存和续局)
稀疏数组: Int sparseArray = new Int[原始数组有效值+1][3]// 行 列 值// 总行数 总列数 有几个有意义的值// 第几行(从0开始) 第几列(从0开始) 值是什么为什么会用到稀疏数组: 如果原始的二维数组很多数据没有意义, 可以用到稀疏数组来达到数据压缩、节省空间的目的稀疏数组的应用:public..原创 2020-05-22 18:37:04 · 163 阅读 · 0 评论