数据结构和算法
Jock2018
珞珈学子,公众号“每日学一技”。
展开
-
Python3 实现选择排序和插入排序
Python3 实现选择排序和插入排序一、选择排序的实现原理思路代码实现小结二、插入排序实现原理思路代码实现小结一、选择排序的实现原理思路对给定的一组数据,经过第一轮依次比较,找到最小的那个数,然后把最小的那个数和第一个数交换;然后继续对不包括第一个数的剩余的数进行第二轮依次比较,找到最小的那个数,然后和第二个数进行交换;以此类推,直至进行比较的数只剩一个停止。代码实现def s...原创 2019-04-24 09:10:52 · 515 阅读 · 0 评论 -
【10】 线性排序:如何根据年龄给100万用户数据排序?
【10】 线性排序:如何根据年龄给100万用户数据排序?1. 线性排序算法介绍2. 桶排序(Bucket sort)3. 计数排序(Counting sort)4. 基数排序(Radix sort)5. 思考6. 参考资料7. 声明1. 线性排序算法介绍线性排序算法包括桶排序、计数排序、基数排序。线性排序算法的时间复杂度为O(n)。此3种排序算法都不涉及元素之间的比较操作,是非基于比较的...原创 2019-10-06 22:20:02 · 507 阅读 · 0 评论 -
【11】 排序优化:如何实现一个通用的、高性能的排序函数?
11 排序优化:如何实现一个通用的、高性能的排序函数?1. 如何选择合适的排序算法?2. 如何优化快速排序?3. 通用排序函数实现技巧4. 思考5. 参考资料6. 声明1. 如何选择合适的排序算法?排序算法一览表排序算法时间复杂度是否稳定排序是否原地排序冒泡排序O(n^2)是是插入排序O(n^2)是是选择排序O(n^2)否是快速...原创 2019-10-06 23:21:15 · 557 阅读 · 0 评论 -
【12】 二分查找(上):如何用最省内存的方式实现快速查找功能?
12 二分查找(上):如何用最省内存的方式实现快速查找功能?1. 二分查找概念2. 时间复杂度分析3. 如何实现二分查找?3.1. 循环实现3.2. 递归实现4. 使用条件(应用场景的局限性)5. 思考6. 参考资料7. 声明1. 二分查找概念二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。2. 时间复...原创 2019-10-07 00:25:54 · 316 阅读 · 0 评论 -
【13】 二分查找(下):如何快速定位IP对应的省份地址?
13 二分查找(下):如何快速定位IP对应的省份地址?1. 四种常见的二分查找变形问题1.1. 查找第一个值等于给定值的元素1.2. 查找最后一个值等于给定值的元素1.3. 查找第一个大于等于给定值的元素1.4. 查找最后一个小于等于给定值的元素2. 适用性分析3. 思考4. 参考资料5. 声明1. 四种常见的二分查找变形问题1.1. 查找第一个值等于给定值的元素代码实现//方法一pub...原创 2019-10-07 09:58:46 · 871 阅读 · 0 评论 -
【14】 跳表:为什么Redis一定要用跳表来实现有序集合?
14 跳表:为什么Redis一定要用跳表来实现有序集合?1. 什么是跳表?2. 跳表的时间复杂度?3. 跳表的空间复杂度及如何优化?4. 高效的动态插入和删除?5. 跳表索引动态更新?6. 思考7. 参考资料8. 声明1. 什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。对于节点数为n的链表,大约可以建立log2n - 1级...原创 2019-10-07 10:51:24 · 403 阅读 · 0 评论 -
【15】 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
15 散列表(上):Word文档中的单词拼写检查功能是如何实现的?1. 散列表的由来?2. 如何设计散列函数?3. 散列冲突的解放方法?4. 思考5. 参考资料6. 声明1. 散列表的由来?散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散...原创 2019-10-07 14:20:34 · 600 阅读 · 0 评论 -
【16】 散列表(中):如何打造一个工业级水平的散列表?
16 散列表(中):如何打造一个工业级水平的散列表?1. 如何设计散列函数?2. 装载因子过大怎么办?(如何根据装载因子动态扩容?)3. 如何选择散列冲突解决方法?4. 如何设计一个工业级的散列函数?5. 思考6. 参考资料7. 声明1. 如何设计散列函数?散列函数的设计不能太复杂,太复杂会消耗更多时间,也会影响到散列表的性能。散列函数生成的值要尽可能随机并且均匀分布,尽可能减少散列冲突,...原创 2019-10-07 16:00:42 · 424 阅读 · 0 评论 -
【17】散列表(下):为什么散列表和链表经常会一起使用?
17 散列表(下):为什么散列表和链表经常会一起使用?1. 为什么散列表和链表经常放在一起使用?2. 散列表和链表如何组合起来使用的案例3. 课后思考4. 小结5. 参考资料6. 声明1. 为什么散列表和链表经常放在一起使用?散列表的优点:支持高效的数据插入、删除和查找操作散列表的缺点:不支持快速顺序遍历散列表中的数据如何按照顺序快速遍历散列表的数据?只能将数据转移到数组,然后排序,最后...原创 2019-10-07 16:41:04 · 626 阅读 · 0 评论 -
【18】哈希算法
18 哈希算法1. 什么是哈希算法?2. 哈希算法的常见应用有哪些?3. 思考4. 参考资料5. 声明1. 什么是哈希算法?定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。如何设计一个优秀的哈希算法?1)单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。2)篡改无效:对输入敏...原创 2019-10-07 18:56:24 · 1398 阅读 · 0 评论 -
【19】 二叉树基础(上):什么样的二叉树适合用数组来存储?
19 二叉树基础(上):什么样的二叉树适合用数组来存储?1. 树的基本概念2. 二叉树的定义3. 二叉树的分类4. 二叉树的存储(或者表示)5. 二叉树的遍历6. 思考7. 参考资料8. 声明1. 树的基本概念节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟...原创 2019-10-07 19:48:38 · 485 阅读 · 0 评论 -
【09】排序(下):如何用快排思想在O(n)内查找第K大元素?
09 排序(下):如何用快排思想在O(n)内查找第K大元素?1. 分治思想2. 归并排序3. 快速排序4. 归并排序与快速排序的区别5. 思考6. 参考资料7. 声明1. 分治思想分治思想:分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。...原创 2019-10-06 20:04:09 · 478 阅读 · 0 评论 -
【08】排序(上):为什么插入排序比冒泡排序更受欢迎?
08排序(上):为什么插入排序比冒泡排序更受欢迎?1. 排序方法与复杂度归类2. 如何分析一个“排序算法”?3. 冒泡排序3.1. 排序原理3.2. 代码实现(Python)3.3. 性能分析4. 有序度&无序度&满有序度5. 插入排序5.1. 插入排序原理5.2. 代码实现5.3. 性能分析6. 选择排序6.1. 选择排序原理6.2 代码实现6.3 选择排序性能分析7. 思考8....原创 2019-10-06 12:17:44 · 2121 阅读 · 1 评论 -
【07】递归:如何用三行代码找到“最终推荐人”?
07 递归:如何用三行代码找到“最终推荐人”?1. 什么是递归?2. 为什么使用递归?递归的优缺点?3. 什么样的问题可以用递归解决呢?4. 如何实现递归?5. 递归常见问题及解决方案6. 如何将递归改写为非递归代码?7. 如何找到“最终推荐人”?8. 【思考】我们平时调试代码喜欢使用 IDE 的单步跟踪功能,像规模比较大、递归层次很深的递归代码,几乎无法使用这种调试方式。对于递归代码,你有什么好...原创 2019-09-12 23:17:47 · 441 阅读 · 0 评论 -
Python3 实现冒泡排序和归并排序
Python3实现冒泡排序和归并排序一、冒泡排序的实现原理思路代码实现小结二、归并排序实现原理思路代码实现小结项目地址一、冒泡排序的实现原理思路就像气泡上升一样,相邻两个数依次两两比较,如果左边的比右边的大,则交换位置。对给定的一组数据,从第一个数开始,依次对相邻的两个数进行比较,如果左边的数大于右边的数,则交换他们的位置,第一轮过后,最大的那个数位于最后;然后继续对不包括最后一个数的...原创 2019-04-25 10:34:26 · 566 阅读 · 0 评论 -
Python3实现快速排序
Python3实现快速排序原理思路代码实现通用版本实战中的版本Pythonic版本小结项目地址原理思路快速排序也是分而治之思想的典范,通过递归解决问题。思路:1. 找到简单的基线条件(递归出口);2. 确定如何缩小问题的规模,使其符合基线条件。详细的原理可以参考 这篇文章坐在马桶上看算法:快速排序步骤归纳:排序数组为collection,游标left从a的最左边开始,游标right从最...原创 2019-05-05 19:23:09 · 1737 阅读 · 0 评论 -
Python3实现希尔排序
Python3实现希尔排序原理思路代码实现普通版本优化后的版本小结项目地址原理思路希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序的实质就是分组插入排序。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再...原创 2019-05-07 10:20:00 · 602 阅读 · 0 评论 -
【01】复杂度分析
【01】复杂度分析1. 什么是复杂度分析?2. 为什么要进行复杂度分析?3. 如何进行复杂度分析?3.1 大O表示法3.1.1 来源3.1.2 特点3.2. 复杂度分析法则4. 常用的复杂度级别?5. 如何掌握好复杂度分析方法?6. 复杂度分析的4个概念7. 为什么要引入这4个概念?8. 如何分析平均、均摊时间复杂度?8.1 平均时间复杂度8.2 均摊时间复杂度9. 参考资料10. 声明1. 什...原创 2019-09-03 00:26:28 · 509 阅读 · 0 评论 -
【02】基本算法思想
【02】基本算法思想1. 贪心算法2. 分治算法3. 动态规划4. 回溯算法5. 枚举算法6. 需要掌握的十大数据结构和算法7. 参考资料8. 声明1. 贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须...原创 2019-09-03 00:32:45 · 219 阅读 · 0 评论 -
【03】数组
【03】数组1. 什么是数组?2. 什么是线性表(Linear List)?3. 什么是非线性表?4. 为什么很多编程语言的数组都是从0开始编号的?5. 连续的内存空间和相同类型的数据的优缺点6. 数组怎么根据下标随机访问的?7. 为何数组插入和删除低效?7.1 数组插入7.2 数组删除8. 数组访问越界问题9. 数组和链表的面试纠错?10. 容器是否完全替代数组?11. JVM标记清除算法?12...原创 2019-09-03 00:34:22 · 182 阅读 · 0 评论 -
【04】 链表上
【04】 链表上1. 什么是链表?2. 为什么使用链表?即链表的特点3.1 单链表3.2 循环链表3.3 双向链表3.4 双向循环链表4. 选择数组还是链表?5. 如何分别用链表和数组实现LRU缓冲淘汰策略?6 如何通过单链表实现“判断某个字符串是否为水仙花字符串”?(比如 上海自来水来自海上)7 设计思想8. 参考资料9. 声明1. 什么是链表?和数组一样,链表也是一种线性表。从内存结构...原创 2019-09-06 23:00:54 · 166 阅读 · 0 评论 -
【04】 链表下:如何轻松写出正确的链表代码?
【04】 链表下:如何轻松写出正确的链表代码?1. 理解指针或引用的含义2. 警惕指针丢失和内存泄漏(单链表)3. 利用“哨兵”简化实现难度4. 重点留意边界条件处理5. 举例画图,辅助思考6. 多写多练,没有捷径7. 一些经验8. LeetCode练习题9. 参考资料10. 声明1. 理解指针或引用的含义含义:将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值...原创 2019-09-07 19:27:37 · 168 阅读 · 0 评论 -
【05】栈:如何实现浏览器的前进和后退功能?
【05】栈:如何实现浏览器的前进和后退功能?1. 什么是栈?2. 为什么需要栈?3. 如何实现栈?4. 栈的应用5. 思考6. LeetCode练习题7. 参考资料8. 声明1. 什么是栈?典型的“栈”结构:后进者先出,先进者后出。从栈的操作特性来看,是一种“操作受限”的线性表,只允许在一端插入和删除数据,只支持入栈和出栈操作。2. 为什么需要栈?栈是一种操作受限的数据结构,其操作...原创 2019-09-07 20:26:21 · 302 阅读 · 0 评论 -
【06】队列:队列在线程池等有限资源池中的应用
【06】队列:队列在线程池等有限资源池中的应用1. 什么是队列(queue)?2. 如何实现队列?2.1 队列API2.2 数组实现(顺序队列):2.3 链表实现(链式队列):2.4 循环队列(基于数组):3. 队列有哪些常见的应用?4. 思考5. 参考资料6. 声明1. 什么是队列(queue)?先进者先出,这就是典型的“队列”结构。支持两个操作:入队enqueue(),放一个数据...原创 2019-09-07 22:37:55 · 344 阅读 · 0 评论 -
【21】 二叉查找树——红黑树
21 二叉查找树——红黑树1. 二叉查找树(Binary Search Tree)2. 有了如此高效的散列表,为什么还需要二叉树?3. 平衡二叉查找树4. 如何定义一棵“红黑树”?5. 为什么说红黑树是“近似平衡”的?6. 思考7. 参考资料8. 声明1. 二叉查找树(Binary Search Tree)概念二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了...原创 2019-10-07 22:08:04 · 422 阅读 · 0 评论