数据结构与算法
__盛夏光年__
这个作者很懒,什么都没留下…
展开
-
一、概述
一、絮絮叨叨计划写一系列数据结构与算法的博客:一是给自己立个flag——坚持做完,二是记录自己的学习过程,总结和分享知识1、Why?面试 =》考查基础 =》数据结构与算法工作 =》有助于理解、使用框架;优化程序,提升效率、性能锻炼逻辑思维能力 =》提升个人竞争力2、What?数据结构: Array(数组)、Stack/Queue(堆栈/队列)、PriorityQueue(...原创 2018-10-12 15:21:38 · 269 阅读 · 0 评论 -
十一、哈希算法
业界著名的哈希算法也有很多,比如 MD5、SHA 等。侧重点:在实际应用中,如何用哈希算法解决问题?一、概述哈希算法:将任意长度的二进制值串映射为固定长度的二进制值串的映射规则;哈希值:通过原始数据映射之后得到的二进制值串。二、哈希算法的设计要求从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大...原创 2018-11-12 10:08:10 · 646 阅读 · 0 评论 -
十二、二叉树
大纲:树、二叉树二叉查找树平衡二叉查找树、红黑树递归树一、树(Tree)1、树的相关概念(1)节点其中,每个元素称为“节点”;用来连接相邻节点之间的关系,成为“父子关系”。其他概念:“父节点、子节点、兄弟节点,根节点,叶子节点或叶节点”==》A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。...原创 2018-11-18 11:05:52 · 225 阅读 · 0 评论 -
十三、红黑树
实际工程中,很多用到平衡二叉查找树的地方都是红黑树。==》为何是红黑树?而不是其他平衡二叉查找树?其他二叉树不适用于单次操作时间非常敏感的场景。AVL树对于频繁的插入、删除操作的数据集合代价有些高==》红黑树维护成本比AVL要低一、平衡二叉查找树平衡二叉树:二叉树中任意一个节点的左右子树的高度相差不能大于1。完全二叉树、满二叉树都是平衡二叉树;但非完全二叉树也可能是平衡二叉树...原创 2018-11-25 20:25:03 · 207 阅读 · 0 评论 -
十四、堆(Heap)
0、堆(Heap)堆排序是一种原地的、时间复杂度为O(nlogn)的排序算法。引入:快速排序平均情况下,时间复杂度为O(nlogn),甚至堆排序比快速排序的时间复杂度还要稳定,但在实际中,快排性能要比堆排序好,为什么???一、堆的概述1、相关概念堆——是一种特殊的树堆是一个完全二叉树(除了最后一层,其他层的节点个数都是满的,最后一层的节点都是靠左排列)堆中每一个节点的值都必须大...原创 2018-12-04 10:38:35 · 304 阅读 · 0 评论 -
十五、图(graph)
引入社交网络,如何存储微博、微信等这些社交网络的好友关系?==》图一、图(Graph)的相关概念图:复杂的非线性表结构;顶点(vertex):图中的元素;边(edge):图中一个顶点可以与任意其他顶点建立连接关系。顶点的度(degree):与顶点相连接的边的条数无向图:边没有方向的图;有向图:边存在方向的图;有向图中度分为入度(in-degree)和出度(out-degre...原创 2018-12-04 14:27:29 · 3226 阅读 · 0 评论 -
【编程4】插入排序+快速排序+LeetCode.148(排序链表)
文章目录一、排序链表1、题目描述——LeetCode.1482、分析(1)一般的快排(2)解题思路3、实现二、排序算法三、插入排序1、基本思想(1)过程概述(2)具体算法描述:2、示例3、实现4、分析(1)原地排序算法(2)稳定排序算法(3)时间复杂度四、快速排序1、基本思想(1)快速排序的流程2、实现3、性能分析一、排序链表1、题目描述——LeetCode.148在 O(n logn) 时...原创 2018-12-12 14:37:33 · 337 阅读 · 0 评论 -
【编程5】斐波那契数列 + 递归+LeetCode50
传送门:https://leetcode-cn.com/problems/powx-n/一、LeetCode 50. Pow(x, n)1、题目描述实现 pow(x, n) ,即计算 x 的 n 次幂函数。2、示例示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.0000...原创 2018-12-13 17:15:53 · 428 阅读 · 0 评论 -
【编程3】二叉树遍历(LeetCode.102)
二叉树是最常用的树结构二叉树的层次遍历1、题目描述——LeetCode.102给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。给定二叉树: [3,9,20,null,null,15,7],返回其层次遍历结果:一、二叉树(Binary Tree)1、相关概念二叉树每个节点最多有两个子节点(左子结点、右子节点)。满二叉树叶子节点全都在最底层,除...原创 2018-12-11 10:11:54 · 276 阅读 · 0 评论 -
【LeetCode】617. 合并二叉树
一、题目描述给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。二、示例示例 1:输入: Tree 1 Tree 2 ...原创 2019-03-06 09:21:31 · 95 阅读 · 0 评论 -
【LeetCode】130.被围绕的区域
一、题目描述给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。二、示例示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O...原创 2019-03-15 14:45:43 · 202 阅读 · 0 评论 -
十、散列表(Hash Table)
一、概述散列表(Hash Table),也称“哈希表”或者“Hash 表”1、相关概念原始数据叫作键(键值)或关键字(key);将原始数据转化为数组下标的映射方法称为散列函数(或“Hash 函数”“哈希函数”,hash function);而散列函数计算得到的值就叫作散列值(或“Hash 值”“哈希值”,table)2、散列表(1)散列表用的就是数组支持按照下标随机访问的时候...原创 2018-11-07 16:06:43 · 492 阅读 · 0 评论 -
九、跳表(Skip List)
一、概述跳表是一种在各个方面都比较优秀的动态数据结构,可支持快速的插入、删除、查找操作,甚至可以替代红黑树(Red-black Tree)应用:Redis 中的有序集合(sorted set)是用跳表实现的。基本思想结合 链表 和 二分法 的特点,将链表进行加工,创造一个二者的结合体:链表从头节点到尾节点是有序的可以进行跳跃查找(形如二分法)例如:我们建立两层索引(第三层和第...原创 2018-10-29 17:30:50 · 181 阅读 · 0 评论 -
八、二分查找(Binary Search)
一、概述二分查找(Binary Search,也称折半查找)——针对有序数据集合的查找算法1、基本思想类似分治思想,每次都通过跟区间的中间元素进行对比,将代查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0(不存在该元素)。2、时间复杂度分析——O(logn)不妨假设数据量为n,每次查找后数据量均为原来的1/2,最坏的情况下,直到查找区间被缩小为空,才停止。设经过k...原创 2018-10-28 17:44:20 · 743 阅读 · 0 评论 -
二、数组
发布文章 博文管理我的博客退出 Trash Temp 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 【数据结构与算法】 ...原创 2018-10-12 22:46:09 · 1284 阅读 · 0 评论 -
三、链表(Linked List)(原理)
前言经典的链表应用场景:LRU 缓存淘汰算法缓存是一种提高数据读取性能的技术,由于缓存的大小有限,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?这就需要缓存淘汰策略来决定。常见的策略有三种:先进先出策略 FIFO(First In,First Out)最少使用策略 LFU(Least Frequently Used)最近最少使用策略 LRU(Least Recentl...原创 2018-10-13 16:10:00 · 427 阅读 · 0 评论 -
三、链表(实践)
一、数据结构1、单向链表结点包括:数据域 + 指针域数据域:存储数据元素的值指针域(链域):存储下一个结点地址或者指向其后继结点的指针struct Node{ int data; Node * next;}2、双向链表结点包括:数据域 + 左指针域(prev) + 右指针域(next)struct DNode{ int data; DNode * prev;...原创 2018-10-15 09:35:22 · 256 阅读 · 0 评论 -
四、栈
前言应用:浏览器的前进、后退功能一、栈的概述栈(stack)是限定仅在表尾(栈顶)进行插入和删除操作的线性表。栈顶(top):允许插入和删除的一端,另一端成为栈底(bottom)后进先出(Last In First Out,LIFO),先进后出==》只允许在一端插入和删除数据。栈主要包含两个操作:进栈和出栈 ,也就是在栈顶插入一个数据和从栈顶删除一个数据。其中,入栈也称压栈、入...原创 2018-10-16 21:33:14 · 132 阅读 · 0 评论 -
五、队列(Queue)
一、概述队列(queue): 只允许在一端进行插入 (队尾) 操作,而在另一端 (队头) 进行删除操作的线性表。队头:删除操作的一端——front队尾:插入操作的一端——rear特点:先进先出(First In First Out)其他常用队列:循环队列、阻塞队列、并发队列。二、C++队列的方法push()——向栈内压入一个成员;pop()——从栈顶弹出一个成员;emp...原创 2018-10-22 09:14:34 · 488 阅读 · 0 评论 -
六、递归(Recursion)
一、递归概述应用:DSF深度优先搜索、前中后序二叉树遍历等三个条件:一个问题的解可以分解为几个子问题的解该问题与分解之后的子问题,除了数据规模不同,求解思路完全一样存在递归终止条件写递归代码的关键:如何将大问题分解为小问题的规律 =》写出递归公式确定终止条件将递推公式 和 终止条件 转化为codes优点:表达力强、非常简洁;缺点:空间复杂度高、有堆栈溢出的风险、存在...原创 2018-10-22 09:15:46 · 363 阅读 · 0 评论 -
七、排序(1)
一、排序的概述1、最经典、最常用的排序方法:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。2、分类:排序方法时间复杂度是否基于比较1冒泡、插入、选择O(n2)√2快排、归并O(nlogn)√3桶、计数、基数O(n)×思考: 插入排序和冒泡排序具有相同的时间复杂度,但在实际开发中,更倾向于使用插入...原创 2018-10-22 09:17:24 · 198 阅读 · 0 评论 -
七、排序 (2)
七、排序(一)原创 2018-10-28 17:27:56 · 122 阅读 · 0 评论 -
七、排序(3)——线性排序
时间复杂度是 O(n) 的排序算法:桶排序、计数排序、基数排序,也称线性排序,他们都不是基于比较的排序算法。一、桶排序1、基本思想将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,从而形成有序序列。2、桶排序对要排序数据的要求非常苛刻要排序的数据需要很容易就能划分成 m 个桶,并且,桶与桶之间有着天然的大小顺序。 ...原创 2018-10-28 17:43:02 · 315 阅读 · 0 评论 -
七、排序(4)——qsort()
一、回顾时间复杂度是稳定排序是原地排序冒泡排序O(n2)√√插入排序O(n2)√√原创 2018-10-28 17:43:37 · 704 阅读 · 0 评论 -
【LeetCode】128. 最长连续序列
一、题目描述给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。二、示例示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。三、分析思路一:使用sort排序,然后查找最大的连续序列。因为题目要求时间复杂度为 O(N) ,这种方式不可用。使用并查集参考资料:...原创 2019-03-12 23:06:57 · 250 阅读 · 0 评论