
数据结构与算法
一角钱技术
Java架构师
展开
-
堆和二叉堆的实现和特性
点赞再看,养成习惯,公众号搜一搜【一角钱技术】关注更多原创技术文章。本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章。堆 HeapHeap:可以迅速找到一堆数中的最大或者最小值的数据结构。将根节点最大的堆叫做大顶堆或大根堆,根节点最小的堆叫做小顶堆或小根堆。常见的堆有二叉堆、裴波那契堆等。堆本身是一个相对比较抽象的数据结构,那么它有具体的实现就分为二叉堆(二项堆、Binary)、裴波那契堆(基于树的)。那么要实现的话一般面试来说或者经常会用的话就..原创 2020-11-20 17:44:28 · 344 阅读 · 1 评论 -
深入理解Redis跳跃表的基本实现和特性
点赞再看,养成习惯,公众号搜一搜【一角钱技术】关注更多原创技术文章。本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章。前言在这里我们先回忆一下普通链表的时间复杂度,可以看到除了 look up 操作是 O(n)O(n)O(n) 的,其他操作都是 O(1)O(1)O(1) 的时间复杂度。也就是说你需要随机访问里面的任何一个元素的话,它的时间复杂度平均值是 O(n)O(n)O(n) 的,这也就是链表它的问题所在。从这里可以看到并没有所谓完美的一种数据结构,如..原创 2020-11-09 18:53:41 · 445 阅读 · 0 评论 -
「算法」时间复杂度没搞明白?怎么刷题~
点赞再看,养成习惯,微信搜一搜【一角钱小助手】关注更多原创技术文章。本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章。前言数据结构和算法本身解决的是 “快” 和 “省” 的问题,即如何让代码运行的更快,如何让代码更节省存储空间。所以我们在写程序的时候,一定要对自己编写的程序的时间和空间复杂度有所了解,而且是养成习惯的,写完了之后能够下意识地分析出你这段程序的时间和空间复杂度,以及能够用最简洁的时间和空间复杂度完成这段程序。基本上是一个顶尖职业选手的必备..原创 2020-09-18 21:15:05 · 426 阅读 · 0 评论 -
树、二叉树、二叉搜索树的实现和特性
点赞再看,养成习惯,微信搜一搜【一角钱小助手】关注更多原创技术文章。本文 GitHub github.com/JavaStudy 已收录,有我的系列文章。前言本篇先回顾树、二叉树、二叉搜索树的实现和特性,《AVL 树和红黑树的实现和特性》可以阅读这篇。另外,树的面试题解法一般都是递归 为什么? 我们在后面总结。一维结构:数组、链表、跳表、栈、队列等,这些结构都是 线性存储结构。二维结构:树、图,是一种非线性存储结构,存储的是具有 “一对多”关系的数据元素的集合。树 Tree树的结点..原创 2020-09-14 19:52:21 · 287 阅读 · 0 评论 -
8.分治、回溯的实现与特性
前言分治与回溯,其实本质上就是递归,只不过它是递归的其中一个细分类。你可以认为分治和回溯最后就是一种特殊的递归,或者是较为复杂的递归即可。做这一类题目最后到达效果:碰到一个题目你就找它的重复性。重复性有最近的重复性,或者是有所谓的最优重复性,那么最优重复性就是动态规划。最近重复性是根据重复性怎么构造以及怎么分解就有说明分治,或者是最后要回溯,或者是其它的各种办法。但本质上其实就是一种递归,而本质上的话其实就是找它的重复性。分治 Divide & Conquer分治的思想分治本质就是一种递.原创 2020-09-09 10:57:29 · 294 阅读 · 0 评论 -
16.AVL 树和红黑树的实现和特性
15.AVL 树和红黑树的实现和特性1. 树的回顾1.1 树 Tree1.2 二叉树 Binary Tree二叉树遍历:前序(Pre-order): 根-左-右中序(In-order): 左-根-右后序(Post-order):左-右-根如果一颗树是二叉搜索树,那么它的中序就是有序的示例代码def preorder(self, root): if root: self.traverse_path.append(root.val) self.preorde原创 2020-08-19 16:11:47 · 356 阅读 · 1 评论 -
19.LRU Cache的实现、应用和题解
19.LRU Cache的实现、应用和题解Cache缓存我们先来认识一下cache以及cache在现实中的应用,cache的话就叫做缓存,比如之前文章提到过的 Fibonacci数列以及爬楼梯问题,解这些题就需要做一个所谓的记忆化搜索,其实我们就建列一个cache,你可以用数组来表示,Python可以直接用@LRU Cache 来写。那么缓存到底是什么呢?在现实中其实应用很多。记忆钱包 - 储物柜代码模块比如说我们人类的记忆,其实很多时候就是一个缓存,很多东西我们会记在纸上,写在书籍里面,原创 2020-08-16 22:23:27 · 360 阅读 · 0 评论 -
18.布隆过滤器的实现及应用
18.布隆过滤器的实现及应用布隆过滤器介绍布隆过滤器(Bloom Filter)由Burton Howard Bloom在1970年提出,它实际上是一个很长的二进制向量(位数组) 和一系列 随机映射函数(哈希)。布隆过滤器可以用于检索一个元素是否在一个集合中,是一种空间查询率高的概率型数据结构。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。它专门用来检测集合中是否存在特定的元素。在这里听起来很平常的需求,所以为什么要使用这种数据结构?什么情况下需要用到布隆过滤原创 2020-08-16 12:28:32 · 387 阅读 · 0 评论 -
17.位运算基础及实战要点
17.位运算基础及实战要点位运算符算数移位与逻辑移位位运算的应用为什么需要位运算机器里的数字表示方式和存储格式就是二进制十进制 <—> 二进制:如何转换?如何从十进制转换为二进制4(d):01008(d):010005(d):01016(d):0110位运算符含义运算符示例左移<<0011 => 0110右移>>0110 => 0011按位或|0011 —=> 1011原创 2020-08-13 23:44:49 · 164 阅读 · 0 评论 -
14.并查集的实现与特性
14.并查集的实现与特性并查集(Dijoint Set)属于一种跳跃式数据结构,也就是说你不会就是你压根都不会,你要是一会的就会用就行了,它没有太多让你在上面进行发展的空间,或者是需要像动态规划或者是各种搜索一样有非常强的随机应变和在上面进行自由发挥的空间。所以我们主要就是把它的情景和它的实现代码进行学习掌握。掌握代码模版直接套上去用即可。并查集 (Dijoint Set)适用场景它解决的场景就是组团和配对的问题,也就是说在有些现实的问题中,你需要很快地判断这两个个体是不是在一个集合中,这么讲有点抽原创 2020-08-08 16:55:40 · 265 阅读 · 0 评论 -
13.Trie树的基本实现与特性
13.Trie树的基本实现与特性理解字典树之前我们先提出三个问题,后面我们再来回答:字典树的数据结构字典树的核心思想字典树的基本性质本文是之前的《字典树实现》的一个升级,如果觉得本篇稍繁杂可以去看之前的一篇。在这里我们也先回忆一下树,树本身定义比较简单,如下图:如果你看到上图这样的一个层级,你应该马上会想到按层次来打印一颗二叉树,这个题目是非常高频的题目:102. 二叉树的层序遍历。那么这里你不记得这个题目或者对写这个代码的话还有一点模糊,你可以去再练习一遍。同时深度优先搜索和原创 2020-08-08 14:12:46 · 413 阅读 · 0 评论 -
11.二分查找的实现与特性
11.二分查找的实现与特性二分查找的前提目标函数单调性(单调递增或者递减)存在上下界(bounded)能够通过索引访问(index accessible)这三个前提条件的话简单说来,一定要把它形成肌肉式记忆。第一单调性:二分查找的是在有序的里面进行查找,如果它是无序的话记忆没法进行二分查找,无序的话怎么办呢?只能从头到尾遍历,正因为它是有序的,所以能够通过判断它的某些特征排除掉比如说前半部分或者排除掉后半部分,所以这里它必须是要单调的。第二上下界:存在一个上下界,如果没有上下界的话,那么原创 2020-08-03 15:18:12 · 638 阅读 · 0 评论 -
12. 动态规划的实现及关键点
12. 动态规划的实现及关键点分治+回溯+递归+动态规划它的本质就是将一个复杂的问题,分解成各种子问题,同时寻找它的重复性。不管是分治、回溯、递归还是动态规划,它们并没有本质上的非常大的不一样,很多时候就是一些小的细节问题。理解动态规划之前先回顾一下“递归”、“分治”递归代码模版public void recur(int level, int param) { // terminator if (level > MAX_LEVEL) { // process r原创 2020-08-02 16:20:29 · 448 阅读 · 0 评论 -
10. 贪心算法的实现与特性
贪心算法贪心算法 Greedy贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(最有利)的选择,从而希望导致结果是全局最好或最优的算法。贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。- 贪心:当下做局部最优判断- 回溯:能够回退- 动态规划:最优判断 + 回退经常有同学会思考,每次我当下选择最好的,会不会全局就是最优的,以及我们中文有很多成语,就来解释这样的情况。比方说:只顾眼前,原创 2020-07-14 18:27:28 · 1395 阅读 · 0 评论 -
9. 深度优先搜索和广度优先搜索
深度优先搜索和广度优先搜索关于搜索&遍历对于搜索来说,我们绝大多数情况下处理的都是叫 “所谓的暴力搜索” ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所谓的智能的情况在里面考虑,很多情况下它做的一件事情就是把所有的结点全部遍历一次,然后找到你要的结果。基于这样的一个数据结构,如果这个数据结构本身是没有任何特点的,也就是说是一个很普通的树或者很普通的图。那么我们要做的一件事情就是遍历所有的结点。同时保证每个点访问一次且仅访问一次,最后找到结果。那么我们先把搜索整个先化简情况,我原创 2020-07-14 18:26:34 · 339 阅读 · 0 评论 -
1. 数组:为什么数组要从0开始编号,而不是1开始呢?
本文共864字|阅读2分钟在大部分编程语言中,数组都是从0开始编号的,但你是否下意识想过,为什么数组要从0开始编号,而不是1开始呢? 从1开始不是更符合人类的思维习惯吗?下面以这个问题来学习数组。如何实现随机访问?什么是数组?估计你心中已经有了答案。不过,这里还是总结一下。数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。这里定义里有几个关键词,理解了这几个关键词,就能彻底掌握数组的概念了。线性表(Linear List)。顾名思义,线性表就是数据排.原创 2020-07-11 16:24:23 · 11745 阅读 · 2 评论 -
数据结构与算法—冒泡排序
一、冒泡排序先看一个案例,假设在一个班级里面,想知道身高最高的那个人?两两比较A B => BB C => BB D => DD E => …假设这么几个数 6 4 8 1 10 06 4 比较 4 6 8 1 10 06 8 比较 4 6 8 1 10 08 1 比较 4 6 1 8 10 08 10 比较 4 6 1 8 10 010 0 比较...原创 2019-03-23 23:45:27 · 177 阅读 · 0 评论