数据结构算法
果然如此
这个作者很懒,什么都没留下…
展开
-
【数据结构与算法之美】递归树:如何借助树来求解递归算法的时间复杂度?(细胞分裂问题)
一、递归树与时间复杂度分析1.递归思想就是将大问题分解为小问题来求解,然后在将小问题分解为小小问题,将问题一层一层地分解,直到问题的数据规模被分解得足够小,不要继递归分解为止。2.用递归树来求解归并排序的时间复杂度①:每次分解是一分为二,所以代价很低,将时间上的消耗记作常量1。②:归并算法中比较耗时的归并操作,也就是把两个子数组合并为大数组③:每一层归并操作消耗的时间总和是一样的,跟要...原创 2020-03-12 18:43:34 · 748 阅读 · 0 评论 -
【数据结构与算法之美】红黑树(下):掌握这些技巧,你也可以实现一个红黑树
目录一、实现红黑树的基本思想1. 红黑树需要满足这样几个要求:2.红黑树非常重要的操作3.插入操作的平衡调整4.删除操作的平衡调整5. 针对关注节点进行二次调整二、课后思考一、实现红黑树的基本思想1. 红黑树需要满足这样几个要求:根节点是黑色的; 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; 任何相邻的节点都不能同时为红色,也就...原创 2020-03-12 16:58:09 · 193 阅读 · 0 评论 -
【数据结构与算法之美】红黑树(上):为什么工程中都用红黑树这种二叉树?
目录一、什么是“平衡二叉查找树”?二、如何定义一棵“红黑树”?三、课后思考一、什么是“平衡二叉查找树”?1. 二叉树中任意一个节点的左右子树的高度相差不能大于 1。2. 完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。3.AVL 树严格符合平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。4.红...原创 2020-03-12 15:35:06 · 247 阅读 · 0 评论 -
【数据结构与算法之美】哈希算法(下):哈希算法在分布式系统中有哪些应用?
一、负载均衡1.1.需求如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。1.2.解决方案通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。二、数据分片2.1.如...原创 2020-03-12 14:19:18 · 179 阅读 · 0 评论 -
【数据结构与算法之美】哈希算法(上):如何防止数据库中的用户信息被脱库?
一、什么是哈希算法?1.定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2.如何设计一个优秀的哈希算法?①单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。②篡改无效:对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。③散列冲突:散列冲突的概率要很小,对...原创 2020-03-12 14:08:36 · 163 阅读 · 0 评论 -
【数据结构与算法之美】二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
一、二叉查找树(Binary Search Tree)1. 二叉查找树特点二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据2. 二叉查找树定义二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值3...原创 2020-03-10 11:33:29 · 219 阅读 · 0 评论 -
【数据结构与算法之美】二叉树基础(上):什么样的二叉树适合用数组来存储?
一、树1.树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。2.概念解释节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟节点:具有相同父节点的多个节点称为兄弟节点关系节点的高度:节点到叶子节点的最长路径所包...原创 2020-03-09 19:41:35 · 522 阅读 · 0 评论 -
【数据结构与算法之美】散列表(下):为什么散列表和链表经常会一起使用?(LRU、LinkedHashMap)
目录一、为什么散列表和链表经常放在一起使用?二、散列表和链表如何组合起来使用?三、课后思考一、为什么散列表和链表经常放在一起使用?1.散列表的优点:支持高效的数据插入、删除和查找操作2.散列表的缺点:不支持快速顺序遍历散列表中的数据3.只能将数据转移到数组,然后排序,最后再遍历数据。4.我们知道散列表是动态的数据结构,需要频繁的插入和删除数据,那么每次顺序遍历之前都需要先...原创 2020-03-08 22:49:03 · 160 阅读 · 0 评论 -
【数据结构与算法之美】散列表(中):如何打造一个工业级水平的散列表?(HashMap、ThreadLocalMap)
目录一、如何设计散列函数?二、如何根据装载因子动态扩容?三、如何选择散列冲突解决方法?四、课后思考一、如何设计散列函数?1.要尽可能让散列后的值随机且均匀分布,这样会尽可能减少散列冲突,即便冲突之后,分配到每个槽内的数据也比较均匀。2.散列函数的设计也不能太复杂,太复杂就会太耗时间,也会影响到散列表的性能。3.常见的散列函数设计方法:直接寻址法、平方取中法、折叠法、随机...原创 2020-03-08 17:33:50 · 228 阅读 · 0 评论 -
【数据结构与算法之美】散列表(上):Word文档中的单词拼写检查功能是如何实现的?(HashMap、TreeMap)
一、散列表的由来?1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。二、如何设计散列函数?总结3点设计散列函数的基本要求1.散列函数计算得到的散列值是一个非负整数。2.若k...原创 2020-03-08 13:39:34 · 289 阅读 · 0 评论 -
【数据结构与算法之美】跳表:为什么Redis一定要用跳表来实现有序集合?(Redis跳表、ConcurrentSkipListMap、红黑树、TreeMap)
目录一、什么是跳表?二、跳表的时间复杂度?三、跳表的空间复杂度及如何优化?四、高效的动态插入和删除?五、跳表索引动态更新?六、课后作业一、什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n...原创 2020-03-08 11:32:40 · 327 阅读 · 0 评论 -
【数据结构与算法之美】二分查找(下):如何快速定位IP对应的省份地址?
一、四种常见的二分查找变形问题1.查找第一个值等于给定值的元素2.查找最后一个值等于给定值的元素3.查找第一个大于等于给定值的元素4.查找最后一个小于等于给定值的元素二、适用性分析1.凡事能用二分查找解决的,绝大部分我们更倾向于用散列表或者二叉查找树,即便二分查找在内存上更节省,但是毕竟内存如此紧缺的情况并不多。2.求“值等于给定值”的二分查找确实不怎么用到,二分查找更适合用在...原创 2020-03-07 22:10:26 · 409 阅读 · 0 评论 -
【数据结构与算法之美】二分查找(上):如何用最省内存的方式实现快速查找功能?
一、什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?1.时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2^k),…,这是一个等比数列。当...原创 2020-03-05 21:28:29 · 225 阅读 · 0 评论 -
【数据结构与算法之美】排序优化:如何实现一个通用的、高性能的排序函数?
目录一、如何选择合适的排序算法?1.排序算法一览表2.为什选择快速排序?二、如何优化快速排序?三、通用排序函数实现技巧四、课后思考一、如何选择合适的排序算法?1.排序算法一览表时间复杂度 是稳定排序? 是原地排序?冒泡排序 O(n^2) 是 是插入排序 O(n^2) 是 是选择排序 O(n^2) 否 是快速排序 O(nlogn) 否 是归并排序 O...原创 2020-03-05 19:58:29 · 203 阅读 · 0 评论 -
【数据结构与算法之美】线性排序:如何根据年龄给100万用户数据排序?
一、线性排序算法介绍1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法的时间复杂度为O(n)。3.此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。4.对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。二、桶排序(Bucket sort)1.算法原理:1)将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。2)桶内排完序之...原创 2020-03-05 19:02:12 · 275 阅读 · 0 评论 -
【数据结构与算法之美】排序(下):如何用快排思想在O(n)内查找第K大元素?
目录一、分治思想二、归并排序三、快速排序四、归并排序与快速排序的区别五、课后思考一、分治思想1.分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。2.分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。二、归并排序1. 算法原理先把数组从中间分成前后两...原创 2020-03-05 10:10:19 · 299 阅读 · 0 评论 -
【数据结构与算法之美】排序(上):为什么插入排序比冒泡排序更受欢迎?
目录一、排序方法与复杂度归类二、如何分析一个“排序算法”?三、冒泡排序四、插入排序五、选择排序六、课后思考一、排序方法与复杂度归类(1)几种最经典、最常用的排序方法:冒泡排序、插入排序、选择排序、快速排序、归并排序、计数排序、基数排序、桶排序。(2)复杂度归类冒泡排序、插入排序、选择排序 O(n^2)快速排序、归并排序 O(nlogn)计数排序、基数排序、桶...原创 2020-03-04 19:02:18 · 150 阅读 · 0 评论 -
【数据结构与算法之美】递归:如何用三行代码找到“最终推荐人”?
目录一、什么是递归?二、为什么使用递归?递归的优缺点?三、什么样的问题可以用递归解决呢?四、如何实现递归?五、递归常见问题及解决方案六、如何将递归改写为非递归代码?七、课后思考一、什么是递归?1.递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。2.方法或函数调用自身的方式称为递归调用,调用称...原创 2020-03-04 13:48:55 · 204 阅读 · 0 评论 -
【数据结构与算法之美】队列:队列在线程池等有限资源池中的应用
一、如何理解“队列”?1、队列是一种操作受限的线性表数据结构。2、队列最大的特点就是先进先出。3、最基本的操作:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。二、顺序队列和链式队列1、用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。2、队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。...原创 2020-03-04 13:15:09 · 234 阅读 · 0 评论 -
【数据结构与算法之美】栈:如何实现浏览器的前进和后退功能?
一、如何理解“栈”?1、栈是一种操作受限的数据结构,只支持入栈和出栈操作。2、典型的“栈”结构:后进者先出,先进者后出。3、从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。4、特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。二、如何实现一个“栈”?1、栈既可以用数...原创 2020-03-03 12:19:37 · 516 阅读 · 0 评论 -
【数据结构与算法之美】链表(下):如何轻松写出正确的链表代码?
目录一、理解指针或引用的含义二、警惕指针丢失和内存泄漏(单链表)1.插入节点2.删除节点三、利用“哨兵”简化实现难度1.什么是“哨兵”?2.未引入“哨兵”的情况3.引入“哨兵”的情况4.“哨兵”还有哪些应用场景?四、重点留意边界条件处理五、举例画图,辅助思考六、多写多练,没有捷径:5个常见的链表操作及leetcode地址一、理解指针或引用的含义...原创 2020-03-02 22:57:20 · 251 阅读 · 0 评论 -
【数据结构与算法之美】链表(上):如何实现LRU缓存淘汰算法?
一、什么是链表?1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。二、为什么使用链表?即链表的特点1.插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率...原创 2020-03-02 16:28:42 · 174 阅读 · 0 评论 -
【数据结构与算法之美】什么是数组?引出jvm垃圾回收
一、为什么很多编程语言的数组都是从0开始编号的?1、从数组存储的内存模型上来看,“下标”确切的说法就是一种“偏移”,相比从1开始编号,从0开始编号会少一次减法运算,数组作为非常基础的数组结构,通过下标随机访问元素又是非常基础的操作,效率的优化就要尽可能的做到极致。2、主要的原因是历史原因,C语言的设计者是从0开始计数数组下标的,之后的Java、JS等语言都进行了效仿,或者说是为了减少从C转向...原创 2020-03-01 23:48:43 · 594 阅读 · 0 评论 -
【数据结构与算法之美】复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度
一、复杂度分析的4个概念1.最坏情况时间复杂度:代码在最理想情况下执行的时间复杂度。2.最好情况时间复杂度:代码在最坏情况下执行的时间复杂度。3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于...原创 2020-03-01 16:22:41 · 193 阅读 · 0 评论 -
【数据结构与算法之美】复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
目录一、什么是复杂度分析?二、为什么要进行复杂度分析?三、如何进行复杂度分析? 1. 大O表示法2.复杂度分析法则四、常用的复杂度级别?五、如何掌握好复杂度分析方法?一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时...原创 2020-03-01 14:50:48 · 184 阅读 · 0 评论 -
【数据结构与算法之美】如何抓住重点,系统高效地学习数据结构与算法?
一、数据结构和算法是什么1、数据结构是指一组数据的存储结构2、算法就是操作数据的方法3、数据结构和算法是相辅相成的,数据结构是为算法服务的,而算法要作用在特定的数据结构之上二、学习的重点在什么地方数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。在学习数据结构和算法的过程中,要学习它的「来历」、「...原创 2020-03-01 14:48:14 · 164 阅读 · 0 评论