![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 62
jack学编程
这个作者很懒,什么都没留下…
展开
-
大话数据结构之二叉搜索树
大话数据结构之二叉搜索树的c++实现原创 2023-01-11 15:35:39 · 163 阅读 · 0 评论 -
大话数据结构之二叉树c++实现
程杰 大话数据结构之二叉树c++实现原创 2022-12-21 17:42:48 · 180 阅读 · 0 评论 -
刷题笔记(9)---排序
目录排序算法冒泡排序迭代递归选择排序迭代递归插入排序希尔排序快速排序(递归)归并排序迭代递归堆排序计数排序桶排序基数排序排序算法冒泡排序迭代递归选择排序迭代递归插入排序希尔排序快速排序(递归)归并排序迭代递归堆排序计数排序桶排序基数排序...原创 2021-09-20 19:35:47 · 143 阅读 · 0 评论 -
实现一个支持动态扩容的数组
目录目的运行结果目的实现一个支持动态扩容的数组实现一个大小固定的有序数组,支持动态增删改操作/* * 程序名:array.c,此程序演示 * 实现一个支持动态扩容的数组; * 实现一个大小固定的有序数组,支持动态增删改操作 * 作者:jack 日期:20210707*/#include <stdlib.h>#include <stdio.h>typedef int ElemType; // 自定义数据元素为整数。struct array{ i原创 2021-07-07 16:02:16 · 408 阅读 · 1 评论 -
60 天攻克数据结构与算法
目录在这篇文章里,对专栏内容重新做了一次梳理,将整个专栏拆分成四个阶段,列出了每个阶段的核心知识点、标注了每个知识点的难易程度(E-Easy,M-Medium,H-Hard),并用 1-10 分说明其重要性。...转载 2021-07-11 14:02:20 · 115 阅读 · 0 评论 -
数据结构与算法---第四阶段知识总结
转载 2021-07-11 14:02:44 · 67 阅读 · 0 评论 -
数据结构与算法---第三阶段知识总结
转载 2021-07-02 14:25:52 · 79 阅读 · 0 评论 -
数据结构与算法---第二阶段知识总结
转载 2021-07-02 14:24:43 · 74 阅读 · 0 评论 -
数据结构与算法---第一阶段知识总结
转载 2021-07-02 14:22:07 · 77 阅读 · 0 评论 -
贪心、分治、回溯和动态规划
目录几种算法思想必知必会的代码实现回溯分治动态规划对应的 LeetCode 练习题Regular Expression Matching(正则表达式匹配)Minimum Path Sum(最小路径和)Coin Change (零钱兑换)Best Time to Buy and Sell Stock(买卖股票的最佳时机)Maximum Product Subarray(乘积最大子序列)Triangle(三角形最小路径和)几种算法思想必知必会的代码实现回溯利用回溯算法求解八皇后问题利用回溯算法求解 0-转载 2021-07-02 13:55:19 · 79 阅读 · 0 评论 -
数据结构---图
目录关于图的几个必知必会的代码实现图对应的 LeetCode 练习题Number of Islands(岛屿的个数)description/Valid Sudoku(有效的数独)关于图的几个必知必会的代码实现图实现有向图、无向图、有权图、无权图的邻接矩阵和邻接表表示方法实现图的深度优先搜索、广度优先搜索实现 Dijkstra 算法、A* 算法实现拓扑排序的 Kahn 算法、DFS 算法对应的 LeetCode 练习题Number of Islands(岛屿的个数)岛屿的个数英文版岛屿的个转载 2021-07-02 13:48:49 · 52 阅读 · 0 评论 -
二叉树和堆
目录关于二叉树和堆的 7 个必知必会的代码实现二叉树堆对应的 LeetCode 练习题Invert Binary Tree(翻转二叉树)Maximum Depth of Binary Tree(二叉树的最大深度)Validate Binary Search Tree(验证二叉查找树)Path Sum(路径总和)关于二叉树和堆的 7 个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某个节点的后继、前驱节点实现二叉树前、中、后序以及按层遍历堆实现一个小转载 2021-07-02 13:45:17 · 102 阅读 · 0 评论 -
散列表和字符串
目录关于散列表和字符串的 4 个必知必会的代码实现散列表字符串对应的 LeetCode 练习题字符串Reverse String (反转字符串)Reverse Words in a String(翻转字符串里的单词)String to Integer (atoi)(字符串转换整数 (atoi))关于散列表和字符串的 4 个必知必会的代码实现散列表实现一个基于链表法解决冲突问题的散列表实现一个 LRU 缓存淘汰算法字符串实现一个字符集,只包含 a~z 这 26 个英文字母的 Trie 树实现朴素转载 2021-07-02 13:40:46 · 138 阅读 · 0 评论 -
排序和二分查找
目录关于排序和二分查找的几个必知必会的代码排序二分查找对应的 LeetCode 练习题Sqrt(x) (x 的平方根)关于排序和二分查找的几个必知必会的代码排序实现排序实现归并排序、快速排序、插入排序、冒泡排序、选择排序编程实现 O(n) 时间复杂度内找到一组数据的第 K 大元素二分查找实现一个有序数组的二分查找算法实现模糊二分查找算法(比如大于等于给定值的第一个元素)对应的 LeetCode 练习题Sqrt(x) (x 的平方根)平方根英文版平方根中文版...转载 2021-07-02 13:34:32 · 69 阅读 · 0 评论 -
栈、队列和递归
目录关于栈、队列和递归的几个必知必会的代码实现栈队列递归对应的 LeetCode 练习题栈Valid Parentheses(有效的括号)Longest Valid Parentheses(最长有效的括号)Evaluate Reverse Polish Notatio(逆波兰表达式求值)队列Design Circular Deque(设计一个双端队列)Sliding Window Maximum(滑动窗口最大值)递归Climbing Stairs(爬楼梯)关于栈、队列和递归的几个必知必会的代码实现栈用转载 2021-07-02 13:30:47 · 204 阅读 · 0 评论 -
数组和链表
目录关于数组和链表的几个必知必会的代码实现数组链表对应的 LeetCode 练习题数组Three Sum(求三数之和)Element(求众数)Missing Positive(求缺失的第一个正数)链表Linked List Cycle I(环形链表)Merge k Sorted Lists(合并 k 个排序链表)数据结构和算法中必知必会的 30 个代码实现。每天花一点时间,来完成测验。测验完成后,根据结果,回到相应章节,有针对性地进行复习。关于数组和链表的几个必知必会的代码实现数组实现一个支持动态扩转载 2021-07-02 13:23:29 · 59 阅读 · 0 评论 -
红黑树(一)---为什么工程中都用红黑树这种二叉树?
目录什么是“平衡二叉查找树”?如何定义一棵“红黑树”?为什么说红黑树是“近似平衡”的?解答开篇内容小结课后思考上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是 O(logn)。不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。我上一节说了,要解决这个复杂度退化翻译 2021-06-29 22:10:16 · 189 阅读 · 0 评论 -
二叉树基础(二)---有了如此高效的散列表,为什么还需要二叉树?
目录二叉查找树(Binary Search Tree)1. 二叉查找树的查找操作2. 二叉查找树的插入操作3. 二叉查找树的删除操作4. 二叉查找树的其他操作支持重复数据的二叉查找树二叉查找树的时间复杂度分析解答开篇内容小结课后思考上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的二叉树,二叉查找树。二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。我们之前说过,散列表也是支持这些操作的,并且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。既然有了这么翻译 2021-06-29 22:01:37 · 145 阅读 · 0 评论 -
二叉树基础(一)---什么样的二叉树适合用数组来存储?
目录树(Tree)二叉树(Binary Tree)二叉树的遍历解答开篇 & 内容小结课后思考前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出一道思考题:二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储?带着这些问题,我们就来学习今天的内容,树!树(Tree)我们首先来看,什么是“树”?再完翻译 2021-06-29 21:51:03 · 613 阅读 · 0 评论 -
哈希算法(二)---哈希算法在分布式系统中有哪些应用?
目录应用五:负载均衡应用六:数据分片1. 如何统计“搜索关键词”出现的次数?2. 如何快速判断图片是否在图库中?应用七:分布式存储解答开篇 & 内容小结课后思考上一节,我讲了哈希算法的四个应用,它们分别是:安全加密、数据校验、唯一标识、散列函数。今天,我们再来看剩余三种应用:负载均衡、数据分片、分布式存储。你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下,哈希算法是如何解决这些分布式问题的。应用五:负载均衡我们知道,负载均衡算法有很多,比如轮询、随机、加权轮询等。那如何才能翻译 2021-06-29 21:43:32 · 234 阅读 · 0 评论 -
哈希算法(一)---如何防止数据库中的用户信息被脱库?
目录什么是哈希算法?应用一:安全加密应用二:唯一标识应用三:数据校验应用四:散列函数解答开篇内容小结课后思考还记得 2011 年 CSDN 的“脱库”事件吗?当时,CSDN 网站被黑客攻击,超过 600 万用户的注册邮箱和密码明文被泄露,很多网友对 CSDN 明文保存用户密码行为产生了不满。如果你是 CSDN 的一名工程师,你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 要想搞清楚这个问题,就要先弄明白哈希算法。哈希算法历史悠久,业界著名的哈希算法也有很多,比如 MD5、SH翻译 2021-06-29 21:36:46 · 314 阅读 · 0 评论 -
二分查找(二)---如何快速定位IP对应的省份地址?
目录变体一:查找第一个值等于给定值的元素变体二:查找最后一个值等于给定值的元素变体三:查找第一个大于等于给定值的元素变体四:查找最后一个小于等于给定值的元素解答开篇内容小结课后思考通过 IP 地址来查找 IP 归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个 IP 地址,就会看到它的归属地。这个功能并不复杂,它是通过维护一个很大的 IP 地址库来实现的。地址库中包括 IP 地址范围和归属地的对应关系。当我们想要查询 202.102.133.13 这个 IP 地翻译 2021-06-29 20:18:02 · 584 阅读 · 0 评论 -
二分查找(一)---如何用最省内存的方式实现快速查找功能?
目录无处不在的二分思想O(logn) 惊人的查找速度二分查找的递归与非递归实现1. 循环退出条件2.mid 的取值3.low 和 high 的更新二分查找应用场景的局限性解答开篇内容小结课后思考今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解,但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。老规矩,我们还是来看一道思考题。假设我们有 1000 万个整数数据,每个数据占 8 个翻译 2021-06-29 20:07:32 · 264 阅读 · 0 评论 -
栈---如何实现浏览器的前进和后退功能?
目录如何理解“栈”?如何实现一个“栈”?支持动态扩容的顺序栈栈在函数调用中的应用栈在表达式求值中的应用栈在括号匹配中的应用解答开篇内容小结课后思考浏览器的前进、后退功能,我想你肯定很熟悉吧?当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a。当你后退到页面 a,点击前进按钮,就可以重新查看页面 b 和 c。但是,如果你后退到页面 b 后,点击了新的页面 d,那就无法再通过前进、后退功能查看页面 c 了。假设你是 Chrome 浏览器的开发工程师,你会翻译 2021-06-29 16:31:09 · 474 阅读 · 2 评论 -
链表(二)---如何轻松写出正确的链表代码?
目录技巧一:理解指针或引用的含义技巧二:警惕指针丢失和内存泄漏技巧三:利用哨兵简化实现难度技巧四:重点留意边界条件处理技巧五:举例画图,辅助思考技巧六:多写多练,没有捷径内容小结课后思考上一节我讲了链表相关的基础知识。学完之后,我看到有人留言说,基础知识我都掌握了,但是写链表代码还是很费劲。哈哈,的确是这样的!想要写好链表代码并不是容易的事儿,尤其是那些复杂的链表操作,比如链表反转、有序链表合并等,写的时候非常容易出错。从我上百场面试的经验来看,能把“链表反转”这几行代码写对的人不足 10%。为什么链翻译 2021-06-29 16:18:48 · 108 阅读 · 1 评论 -
链表(一)---如何实现LRU缓存淘汰算法?
目录五花八门的链表结构链表 VS 数组性能大比拼解答开篇内容小结课后思考今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法。缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的 CPU 缓存、数据库缓存、浏览器缓存等等。缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:先进先出策略翻译 2021-06-29 15:47:34 · 169 阅读 · 0 评论 -
数组---为什么很多编程语言中数组都从0开始编号?
目录如何实现随机访问?低效的“插入”和“删除”警惕数组的访问越界问题容器能否完全替代数组?解答开篇内容小结课后思考在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常基础、简单,但是我估计很多人都并没有理解这个基础数据结构的精髓。在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗?我们可以带着这个问题来学习接下翻译 2021-06-29 15:32:34 · 164 阅读 · 0 评论 -
复杂度分析(二)---浅析最好、最坏、平均、均摊时间复杂度
目录最好、最坏情况时间复杂度平均情况时间复杂度均摊时间复杂度内容小结课后思考上一节,我们学习了复杂度的大 O 表示法和几个分析技巧,还举了一些常见复杂度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 复杂度分析。掌握了这些内容,对于复杂度分析这个知识点,你已经可以到及格线了。今天继续学习四个复杂度分析方面的知识点,最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均情况时间复杂度翻译 2021-06-29 15:17:25 · 391 阅读 · 0 评论 -
复杂度分析(一)---如何分析、统计算法的执行效率和资源消耗?
目录为什么需要复杂度分析?1. 测试结果非常依赖测试环境2. 测试结果受数据规模的影响很大大 O 复杂度表示法时间复杂度分析1. 只关注循环执行次数最多的一段代码2. 加法法则:总复杂度等于量级最大的那段代码的复杂度3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积几种常见时间复杂度实例分析1. O(1)2. O(logn)、O(nlogn)3. O(m+n)、O(m*n)空间复杂度分析内容小结课后思考数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间翻译 2021-06-29 14:59:53 · 288 阅读 · 0 评论