
数据结构与算法
文章平均质量分 66
张维鹏
这个作者很懒,什么都没留下…
展开
-
海量数据处理的方法总结
基础知识:bit:位 byte:字节 1 byte= 8 bit int 类型为 4 byte,共32位bit,unsigned int也是 2^32 byte = 4G 1G= 2^30 =10.7亿海量数据处理概述:所谓海量数据处理,就是指数据量太大,无法在较短时间内迅速解决,或者无法一次性装入内存。而解决方案就是:针对时间,可以采用巧妙的算法搭配合适的数据结构,如 Bloom filter/Hashmap/bit-map/堆/数据库/倒排索引/trie树;针对空间...原创 2021-04-14 00:54:01 · 22947 阅读 · 1 评论 -
布隆过滤器Bloom Filter简介
背景:如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率:采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL、红黑树)存储,查找时间复杂度为O(logN) 采用哈希表存储,考虑到哈希碰撞,整体时间复杂度也要O[log(n/m)]当需要判断一个元素是否存在于海量数据集合中,不仅查找时间慢,还会占用大量存储空间,接下来看一下布隆过滤器如何解决这个问题1、什么是布隆过滤器:布隆过滤器是一种空间效率很高的随机数据结..原创 2021-02-08 15:35:45 · 2604 阅读 · 0 评论 -
十大排序算法小结
相关博客:排序算法:冒泡排序、插入排序、选择排序、希尔排序排序算法:归并排序、快速排序排序算法:桶排序、计数排序、基数排序排序算法:堆排序 前面学习了10中最基本的排序算法,这篇博客主要是对这10种排序算法的小结:1、这十种排序算法可以分为两大类:(1)非线性时间排序算法:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比...原创 2019-01-30 15:50:53 · 2073 阅读 · 0 评论 -
排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客:排序算法:冒泡排序、插入排序、选择排序、希尔排序排序算法:归并排序、快速排序排序算法:桶排序、计数排序、基数排序排序算法:堆排序十大排序算法小结一、冒泡排序:1、算法原理:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系的要求。如果不满足就让它俩互换位置。一次冒泡会让至少一个元素移动到它应该在的位置,重复n...原创 2019-01-28 23:27:36 · 5924 阅读 · 2 评论 -
排序算法:归并排序、快速排序
相关博客:排序算法:冒泡排序、插入排序、选择排序、希尔排序排序算法:归并排序、快速排序排序算法:桶排序、计数排序、基数排序排序算法:堆排序十大排序算法小结一、归并排序:1、工作原理:归并排序的采用分治思想,如果要排序一个数组,我们先把数组从中间分成前后两个部分,然后对前后两个部分分别进行排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。2、动图演...原创 2019-01-29 17:22:45 · 2666 阅读 · 0 评论 -
排序算法:桶排序、计数排序、基数排序
相关博客:排序算法:冒泡排序、插入排序、选择排序、希尔排序排序算法:归并排序、快速排序排序算法:桶排序、计数排序、基数排序排序算法:堆排序十大排序算法小结这篇博客将主要介绍三种时间复杂度是O(n)的排序算法:桶排序、计数排序、计数排序。因为这些排序算法的时间复杂度都是线性的,所以也把这类排序算法称为线性排序。之所以能够做到线性的时间复杂度,主要原因是这几个算法是非基于...原创 2019-01-29 19:19:07 · 4580 阅读 · 0 评论 -
排序算法:堆排序
相关博客:排序算法:冒泡排序、插入排序、选择排序、希尔排序排序算法:归并排序、快速排序排序算法:桶排序、计数排序、基数排序排序算法:堆排序十大排序算法小结一、堆:1、什么是堆:堆是一种特殊的树,它满足需要满足两个条件:(1)堆是一种完全二叉树,也就是除了最后一层,其他层的节点个数都是满的,最后一个节点都靠左排列。(2)堆中每一个节点的值都必须大于等于(...原创 2019-01-30 14:40:12 · 2627 阅读 · 0 评论 -
数据结构:树
目录1、二叉树:2、二叉查找树:3、平衡二叉树:3.1、平衡查找树之AVL树:3.2、平衡二叉树之红黑树:4、B树:5、B+树:6、B*树:7、Trie树: 1、二叉树: 二叉树的定义:每个结点至多只有两个子节点的树。(1)满二叉树:叶子节点全部都在最底层,除了叶子节点,其余的每个节点都有两个的子节点。①一颗树深度为h,最大层数为k,深度与...转载 2018-06-24 21:26:28 · 3424 阅读 · 0 评论 -
使用LinkedHashMap实现LRU算法
LRU算法,最近最少使用原则,如果要实现该算法,可以借助LinkedHashMap数据结构,LinkedHashMap继承HashMap,底层使用哈希表和双向链表来保存所有元素,使用LinkedHashMap可以确保元素按照顺序进行存储。默认情况下,LinkedHashMap是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据。下面就基于这两种存储方式,简单展示一下如何原创 2021-01-31 23:54:02 · 7560 阅读 · 2 评论 -
如何实现ABC三个线程按顺序执行十次
题目要求:创建三个线程,每个线程分别打印ABC,并按照ABC的顺序执行十次题目可以使用多种不同的方式解决,下面我们分别使用 Condition 等待唤醒机制、Semaphore 信号量、CountDownLatch 闭锁、Thread.join() 方法四种方式实现题目要求。一、使用一个 ReentrantLock 和 三个 Condition 来实现:import java.util.concurrent.locks.Condition;import java.util.concurr原创 2021-09-26 01:36:36 · 10549 阅读 · 2 评论 -
《剑指offer》答案整理
第一题,二维数组中的查找:https://blog.youkuaiyun.com/a745233700/article/details/82108738第二题,替换空格:https://blog.youkuaiyun.com/a745233700/article/details/82730804第三题,从头到尾打印链表:https://blog.youkuaiyun.com/a745233700/article/det...原创 2019-01-21 13:35:56 · 2901 阅读 · 0 评论 -
《剑指offer》-- 链表中倒数第k个节点、反转链表、合并两个排序的链表
一、链表中倒数时第k个节点:1、题目:输入一个链表,输出该链表中倒数第k个结点。2、解题思路:单链表具有单向移动的特性。(1)第一种:先遍历链表,算出链表节点数count,第二次直接遍历到第count-k个节点。但是要注意,可能链表节点数count小于k,此时要返回NULL,所以要先判断这个条件。(这一种就不贴代码出来了)(2)第二种:可以用两个指针,一个指针遍历到第k个结...原创 2018-08-28 13:51:37 · 630 阅读 · 0 评论 -
《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值
一、序列化二叉树:1、题目:请实现两个函数,分别用来序列化和反序列化二叉树。2、解题思路:(1)根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。(2)依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。另外,结...原创 2018-09-16 19:40:07 · 456 阅读 · 0 评论 -
《剑指offer》-- 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖
一、斐波那契数列:1、题目:现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39。2、什么是斐波那契数列?斐波那契数列指的是这样一个数列: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ……,可以观察到,从第3个数开始,每个数的值都等于前连个数之和。3、解题思路:这里可以使用递归的方法实现,但是递归的方式的时间复杂...原创 2018-08-26 16:03:10 · 629 阅读 · 0 评论 -
《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格
一、把数组排成最小的数:1、题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。2、解题思路:重写Comparator的compare()方法。3、代码实现:public class Test23 { public static void ...原创 2018-09-17 02:35:53 · 821 阅读 · 0 评论 -
《剑指offer》-- 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树
一、 树的子结构:1、题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构。2、解题思路:这个题比较简单,利用递归的方式就可以判断B是不是A树的子结构。3、实现代码: public boolean HasSubtree(TreeNode root1,TreeNode root2) { //当tree1和tree2都不为空...原创 2018-08-28 22:07:58 · 453 阅读 · 0 评论 -
《剑指offer》-- 第一个只出现一次的字符、数组中只出现一次的数字、字符流中第一个不重复的字符、数组中重复的数字
一、第一个只出现一次的字符:1、题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).2、代码实现:public class Test8 { public int FirstNotRepeatingChar(String str) { if(str.length...原创 2018-09-17 01:06:33 · 518 阅读 · 0 评论 -
《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
一、两个链表的第一个公共结点:1、题目:输入两个链表,找出它们的第一个公共结点。2、解题思路:(1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走。(2)第二种:用两个指针扫描"两个链表",最终两个指针到达 null 或者到达公共结点。接着,把链表1的尾连到链表2的头,把链表2的尾连到链表1的头,同时遍历,最终会在公共结点相遇;3、代码实...原创 2018-09-17 01:58:22 · 416 阅读 · 0 评论 -
《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围
一、矩阵中的路径1、题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包...原创 2018-09-18 00:25:37 · 500 阅读 · 0 评论 -
《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表
一、从上往下打印二叉树:1、题目:上往下打印出二叉树的每个节点,同层节点从左至右打印。2、解题思路:用arraylist模拟一个队列来存储相应的TreeNode。3、代码实现:public class Test9 { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ...原创 2018-09-15 14:21:10 · 433 阅读 · 0 评论 -
《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
一、复杂链表的复制:参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba1、题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引...原创 2018-09-15 18:29:52 · 438 阅读 · 0 评论 -
《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数
一、调整数组顺序使奇数位于偶数前面:1、题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变2、解决思路:如果题目中没有要求偶数和偶数、奇数和奇数之间的相对位置不变,这道题就比较简单,我们只需维护两个指针:第一个指针pHead 初始化为数组的第一个元素,第二个指针...原创 2018-08-28 23:23:17 · 582 阅读 · 0 评论 -
《剑指offer》-- 栈的压入与弹出序列、把字符串转化为整数、扑克牌顺子、孩子们的游戏(圆圈中最后剩下的数)
一、栈的压入与弹出序列:1、题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2、解题思路:借用一个辅助的栈,遍历压栈顺序,...原创 2018-09-15 14:17:27 · 467 阅读 · 0 评论 -
《剑指offer》-- 二叉树的下一个结点、对称二叉树、按之字性顺序打印二叉树、把二叉树打印成多行
一、二叉树的下一个结点:1、题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2、解题思路:分析二叉树的下一个节点,一共有以下情况:(1)二叉树为空,则返回空;(2)节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;(3)节点不是...原创 2018-09-16 18:35:24 · 372 阅读 · 0 评论 -
《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列
一、构建乘积数组:1、题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。2、解题思路:参考牛客网的“披萨大叔”:https://www.nowcoder.com/questionTerminal/94a4d381a68b47...原创 2018-09-17 12:53:05 · 616 阅读 · 0 评论 -
《剑指offer》--二维数组中的查找、从头到尾打印链表、重建二叉树、旋转数组的最小数字
一、二维数值中的查找:1、题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2、解题思路:通过分析可以很简单的找出一个规律,二维数组的最左下角的的点,该点的所在列上边的点都是减少的,该点所在行右边的点都是增加的。因此,我们以该点作为切入...原创 2018-08-27 11:36:04 · 1380 阅读 · 0 评论 -
《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一、数组中的逆序对:1、题目:数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。2、解题方法:参考牛客网的“rs勿忘初心”、“流痕”:https://www.nowcoder.com/questionTerminal/96bd668...原创 2018-09-18 02:26:37 · 1064 阅读 · 0 评论 -
《剑指offer》-- 和为S的连续整数序列、和为S的两个数字、左旋转字符串、翻转单词顺序列
一、和为S的连续整数序列:1、题目:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?2、解题思路:参考牛客网的...原创 2018-09-17 03:14:19 · 480 阅读 · 0 评论 -
二维矩阵中的最大矩形面积--java实现
一、原题:给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积。样例:给你一个矩阵如下:[ [1, 1, 0, 0, 1], [0, 1, 0, 0, 1], [0, 0, 1, 1, 1], [0, 0, 1, 1, 1], [0, 0, 0, 0, 1]]输出6 二、解题思路:1、首先...原创 2018-08-25 23:54:52 · 7603 阅读 · 2 评论