![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
z_yemu
一直在努力路上的程序员
展开
-
数据结构和算法-基础篇-红黑树(上)
1. 红黑树1.平衡二叉树二叉查找树是常用的一种二叉树,他支持快速插入,删除,查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)1. 平衡二叉查找树二叉树中任意一个节点的左右子树的高度相差不能大于1。所以完全二叉树,满二叉树都是平衡二叉树,非完全二叉树也有可能是平衡二叉树。平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。发明平衡二叉查找树这类数据结构的初衷是解决普通二叉查找树在频繁的插入,删除等动态更新的情况下,出现时间复杂度退化的问题。原创 2020-06-12 00:27:48 · 303 阅读 · 0 评论 -
数据结构与算法-基础算法篇-二叉树
1. 树1. 树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。2.概念解释节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟节点:具有相同父节点的多个节点称为兄弟节点关系节点的高度:节点到叶子节点的最长路径所包含的边数节点的深度:根节点到节点的路径所包含的边数节点的层数:节点的深度+1(根节点的层数是1)树的高原创 2020-06-11 00:26:42 · 1332 阅读 · 0 评论 -
数据结构与算法-基础算法篇-哈希算法
1. 哈希算法如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?在实际开发中,我们应该如何用哈希算法解决问题?1. 什么是哈希算法?1. 定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2. 如何设计一个优秀的哈希算法?单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。篡改无效:对输入敏感,哪怕原始数据只修改一个Bit原创 2020-06-10 00:15:48 · 405 阅读 · 0 评论 -
数据结构与算法-基础算法篇-散列表(Hash Table)
1. 散列表1. 什么是散列表散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。将数据存储在散列值对应的数组下标位置。散列表两个核心问题是散列函数设计和散列冲突解决。散列冲突有两种常用的解决方法,开放寻址法和链表法。散列函数设计的好坏决定了散列冲突的概率,也就决定散列表的性能。2. 如何设计散列函数?总结3点设计散列函数的基本要求:原创 2020-06-09 00:47:02 · 1028 阅读 · 0 评论 -
数据结构与算法-基础算法篇-跳表(skip list)
2. 跳表 (skip list)这里先提出一个问题:redis 为什么会选择用跳表来实现有序集合呢? 为什么不用红黑树呢参考:https://juejin.im/post/57fa935b0e3dd90057c50fbc1. 什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中 down 表示 down 指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引原创 2020-06-06 23:24:25 · 448 阅读 · 0 评论 -
数据结构与算法-基础算法篇-二分查找
1. 二分查找1. 什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?2. 时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2k),…,这是一个等比数列。当n/(2k)=1时,k的值就是总共缩小的次数,也是查找的总次数。而每次缩小操作只涉及两个数据的大小比较原创 2020-06-06 01:20:50 · 1236 阅读 · 0 评论 -
数据结构与算法-基础算法篇-排序优化(如何实现一个通用的、高性能的排序函数?)
5. 排序优化:1. 如何选择合适的排序算法?排序算法一览表为什选择快速排序?线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。2. 如何优化快速排序?导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不原创 2020-06-05 00:16:57 · 166 阅读 · 0 评论 -
数据结构与算法-基础算法篇-线性排序(桶排序、计数排序、基数排序)
4. 线性排序算法线性排序算法包括桶排序、计数排序、基数排序。线性排序算法的时间复杂度为O(n)。此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。1. 桶排序(Bucket sort)1. 算法原理:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。2. 使用条件要排序的数据需要很容易就能划分成m个桶,并且桶与原创 2020-06-04 00:08:39 · 406 阅读 · 0 评论 -
数据结构与算法-基础算法篇-排序(归并排序、快速排序)
3. 归并排序、快速排序1. 分治思想分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。2. 归并排序算法原理先把数组从中间分成前后两部分,然后对前后两部分分别进行排序,再将排序好的两部分合并到一起,这样整个数组就有序了。这就是归并排序的核心思想。如何用递归实现归并排序呢?写递归代码的技巧就是分写得出递推公式,然后找到终止条件,最后将递推公原创 2020-06-03 00:02:01 · 209 阅读 · 0 评论 -
数据结构与算法-基础算法篇-排序(冒泡、插入、选择)
2. 排序1. 几种经典排序算法及其时间复杂度级别冒泡、插入、选择: O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较2. 如何分析一个排序算法?学习排序算法的思路?明确原理、掌握实现以及分析性能。如何分析排序算法性能?从执行效率、内存消耗以及稳定性3个方面分析排序算法的性能。执行效率:从以下3个方面来衡量最好情况、最坏情况、平均情况时间复杂度时间复杂度的系数、常数、低阶:排序的数据量比较小时考虑比较次数和交换(或移原创 2020-06-02 00:20:38 · 302 阅读 · 0 评论 -
数据结构与算法-基础算法篇-递归
1. 递归:1. 什么是递归:递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);2. 为什么使用递归?递归的优缺点?优点:代码的表达力很强,写起来简洁。缺点:空间复杂度高、有堆栈溢出风险、存在重复原创 2020-06-01 23:32:49 · 206 阅读 · 0 评论 -
数据结构与算法-基础篇-队列
4. 队列1. 如何理解“队列”?队列是一种操作受限的线性表数据结构。队列最大的特点就是先进先出。最基本的操作:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。2. 顺序队列和链式队列用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。随着不停地进行入队、出队操作,head 和 tail 都会持续往后移动。当 tail 移动到最右边,即使数组中还有空原创 2020-06-01 00:03:42 · 197 阅读 · 0 评论 -
数据结构与算法-基础篇-栈
3. 栈1. 什么是栈?后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。2. 为什么需要栈?栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。所以,当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。3. 数组实现(自动扩容)时间原创 2020-05-31 16:50:12 · 215 阅读 · 0 评论 -
数据结构与算法-基础篇-链表
2. 链表推荐一个课程:数据结构与算法之美(极客时间)什么是链表?和数组一样,链表也是一种线性表。从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。为什么使用链表?插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。和数组相比,内存空间消耗更大,因为每个存储数原创 2020-05-31 02:21:48 · 246 阅读 · 0 评论 -
数据结构与算法-基础篇-数组
二、基础篇1. 数组1. 为什么很多编程语言的数组都是从0开始编号的?从数组存储的内存模型上来看,“下标”确切的说法就是一种“偏移”,相比从1开始编号,从0开始编号会少一次减法运算,数组作为非常基础的数组结构,通过下标随机访问元素又是非常基础的操作,效率的优化就要尽可能的做到极致。主要的原因是历史原因,C语言的设计者是从0开始计数数组下标的,之后的Java、JS等语言都进行了效仿,或者说是为了减少从C转向Java、JS等的学习成本。2. 什么是数组? 数组是一个线性数据结构,用一组连续的内原创 2020-05-31 01:43:49 · 215 阅读 · 0 评论 -
数据结构与算法-入门篇-复杂度分析
一、入门篇推荐一个课程:数据结构与算法之美(极客时间)1. 为什么学习数据结构和算法直接好处是能够有写出性能更优的代码。算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。2. 学习的重点在什么地方 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。在学习数据结构和算法的过程中,要学习它的「来原创 2020-05-31 01:08:59 · 277 阅读 · 0 评论