
数据结构
Michael阿明
两个孩子的父亲,8年机械工程师,已转行互联网做算法,一起继续加油!高举智慧,她就使你高升;怀抱智慧,她就使你尊荣。-- 箴言(4:8)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《数据结构与算法之美》学习汇总
此篇文章是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助。本人是半路程序员,2018年2月开始学习C++的,下面的代码基本都是C++11版本的,代码有错误的地方请不吝留言赐教。附有部分练习LeetCode、POJ的题目。原创 2019-04-22 21:13:00 · 24769 阅读 · 218 评论 -
数据结构--并查集(Disjoint-Set)
文章目录1. 并查集2. 操作2.1 初始化2.2 查询2.3 合并3. 完整代码4. 参考1. 并查集并查集是一种树型的数据结构用于处理一些不相交集合(Disjoint Sets)的合并及查询问题2. 操作2.1 初始化把每个点所在集合初始化为其自身,时间复杂度均为O(N),可用数组,哈希表等结构来实现for(int i = 0; i < n; i++) father...原创 2020-04-03 20:42:32 · 6639 阅读 · 10 评论 -
数据结构--树状数组
文章目录1. 树状数组2. 单点查询,单点修改3. 单点查询,区间修改1. 树状数组类似数据结构:线段树(Segment Tree)树状数组 跟 线段树 的区别:树状数组能做的事情,线段树都能做!(线段树功能更牛)树状数组代码简单,实现起来比线段树容易(树状数组代码更简单)树状数组的 查询 和 修改 复杂度都为 log(n)\log(n)log(n)原数组为 A树状数组为...原创 2020-04-01 21:56:42 · 2799 阅读 · 12 评论 -
数据结构--树--线段树(Segment Tree)
文章目录1. 概念2. 建树3. 查询4. 修改5. 完整代码及测试1. 概念线段树是一种二叉树,是用来表示一个区间的树:常常用来查询区间的:和、最小值、最大值树结点中存放不是普通二叉树的值,其结点结构如下class TreeNode{public: int sum;//区间和 int MAX;//区间最大的 int MIN;//区间最小的 in...原创 2020-03-13 01:43:33 · 3273 阅读 · 16 评论 -
数据结构--单链表single linked list数据结构C++实现
2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下《数据结构与算法》以及Python入门。我的github代码链接https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmi...原创 2019-03-09 20:34:31 · 1550 阅读 · 0 评论 -
数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)
回文串为首尾对称的字符串:如a,aba,abba等单链表思路1.将字符读入链表2.找到链表中点3.将链表从中点断开成2条,将后半条反转4.比较两条链表是否相等(比较次数以少的为准(长度为奇数时))双向链表思路1.将字符读入链表2.找到链表尾节点3.从首尾依次向中间比较(双向链表可以双向移动,代码上更简洁,见下面)单链表C++代码实现//...原创 2019-03-14 22:12:30 · 3852 阅读 · 1 评论 -
数据结构--链表--约瑟夫环问题(单向循环链表)
问题:一群人站成一个圆圈,从一个人开始报数,1, 2 ,。。。m,报到m的拉出去砍了,求被砍的顺序和最后一个活下来的。利用单向循环链表实现C++代码如下:(参考书籍:数据结构与算法实验指导书)#include <iostream>using namespace std;struct NodeType{ int num; char name[20...原创 2019-03-14 23:10:51 · 5350 阅读 · 5 评论 -
数据结构--链表--LRU缓存
LRU(Least Recently Used)缓存策略:通俗的讲就是,最近使用的放在最前面,不经常使用的放后面,满了就删除C++代码实现//用单链表实现LRU策略 2019.3.17#include <iostream>#include <string>using namespace std;struct weburl{ string web...原创 2019-03-18 21:21:19 · 1048 阅读 · 0 评论 -
数据结构--单链表single linked list(无表头哨兵)重写
针对上次写的单链表中不足的地方进行修改:1.构造函数需要让用户输入(bad)2.函数功能不单一,既操作链表,还打印输出(bad)代码链接(包含无头\有头单链表、循环单链表、双链表、循环双链表)接口 singleList.h//// Created by mingm on 2019/3/18.//#ifndef _SINGLELIST_H#define _SINGLEL...原创 2019-03-21 00:05:10 · 3179 阅读 · 2 评论 -
数据结构--链表--单链表归并排序mergesort
思路:1.将链表的中点找到,对其切分成2条2.继续步骤1,切成4条,8条。。。,直至每段链表只有1个元素3.归并操作,对两两链表进行合并排序,并返回回并后的链表的头结点,依次向上递归回去C++代码实现链表头文件链接:https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/linkedLi...原创 2019-03-23 19:45:38 · 2226 阅读 · 0 评论 -
数据结构--链表--单链表中环的检测,环的入口,环的长度的计算
就如数字6一样的单链表结构,如何检测是否有6下部的○呢,并且求交叉点位置思路使用快慢指针(一个一次走2步,一个走1步),若快慢指针第一次相遇,则有环慢指针路程 s = a+b快指针路程 2s = a+b+nRs = nR链表的长度 L = a+b+c = nR+c又 L = a + R则 nR+c = a+R 变形—> (n-1)*R+c = a 意味着从h...原创 2019-03-26 15:12:04 · 1752 阅读 · 2 评论 -
数据结构--栈--顺序栈/链式栈(附: 字符括号合法配对检测)
栈结构:先进后出,后进先出,像叠盘子一样,先叠的后用。代码github地址 https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/stack1.顺序栈(数组存储,需给定数组大小,到达容量需要copy转移数据)1.1 头文件 arrStack.h//// Created by mingm on 2...原创 2019-03-28 20:28:54 · 1477 阅读 · 3 评论 -
数据结构--栈--共享顺序栈
共享顺序栈:内部也是一个数组将两个栈放在数组的两端,一个从数组首端开始压栈,一个从数组尾部开始压栈,等到两边栈顶在中间相遇时,栈满。共享顺序栈在某些情况下可以节省空间。头文件 sharingStack.h//共享顺序栈// Created by mingm on 2019/3/28.//#ifndef STACK_SHARINGSTACK_H#define STACK_SHARI...原创 2019-03-29 00:09:31 · 2273 阅读 · 0 评论 -
数据结构--栈--浏览器前进后退应用
浏览器前进后退:当你依次浏览a,b,c,然后回到b,再浏览d,就只能查看a,b,d,了。原理: 利用两个栈A,B浏览新网页的时候,压入栈A,清空栈B前进,栈A获取栈B的栈顶元素,并压入栈A后退,栈B获取栈A的栈顶元素,并压入栈Bbrowser.h头文件//// Created by mingm on 2019/3/31.//#ifndef STACK_BROWSER_H#...原创 2019-03-31 23:56:05 · 1857 阅读 · 0 评论 -
数据结构--队列Queue--链式队列、顺序队列
队列:先进先出,就如排队一样,先到的,先排上1.链式队列1.1 头文件 listQueue.h/** * @description: 链式队列 * @author: michael ming * @date: 2019/4/1 22:47 * @modified by: */#ifndef QUEUE_LISTQUEUE_H#define QUEUE_LISTQUEUE_H...原创 2019-04-02 00:01:32 · 1085 阅读 · 0 评论 -
数据结构--队列Queue--循环顺序队列
针对顺序队列中的入队操作:if 队列没满,但是队尾到达数组末尾了,队列"满"了,其实没有满,数据需要整体移至数组头部,才可以继续入队。为解决该问题,避免数据的挪移,有了循环顺序队列...原创 2019-04-02 22:18:38 · 1036 阅读 · 0 评论 -
数据结构--队列Queue--打印杨辉三角
杨辉三角大家很熟悉,不做介绍了,第n行的首末两元素均为1,中间n-2个元素由n-1行相邻两元素相加得到。将第1行数据存在队列中(1)第2行数据1入队(1,1){ 2行中间没有数据 } 打印1行结尾1,出队(1),2行结尾1入队(1,1) //打印 1第3行数据1入队(1,1,1){ 打印第2行数据1,出队(1,1),出队的1+队首的1=2,入队(1,1,2) }打印2行结尾1,...原创 2019-04-04 23:41:46 · 6477 阅读 · 0 评论 -
数据结构--跳表SkipList
对单链表查找一个元素的时间复杂度是 O(n)通过对链表建立多级索引的结构,就是跳表,查找任意数据、插入数据、删除数据的时间复杂度均为 O(log n)前提:建立了索引,用空间换时间的思路(每两个节点建立一个索引)索引节点总和 n/2+n/4+n/8+…+8+4+2 = n-2,空间复杂度 O(n)插入和删除后,动态更新索引,避免局部链表元素过多或者过少,退化成单链表...原创 2019-04-20 21:02:48 · 938 阅读 · 0 评论 -
数据结构--散列表 Hash Table
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。散列函数,设计的基本要求散列函数计算得到的散列值是一个非负整数( 因为数组下标从0开始)如果 key1 = key2,那 hash(key1)== hash(key2)如果 key1 != key2,那 hash(key1)!= hash(key...原创 2019-05-04 20:34:16 · 1165 阅读 · 0 评论 -
数据结构--二叉树 Binary Tree
文章目录1.概念2.存储方式2.1 链式存储(二叉树代码大部分是链式实现的)2.2 顺序存储(基于数组)3.二叉树的遍历1.概念二叉树,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点满二又树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点。完全二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排...原创 2019-05-10 20:59:43 · 1304 阅读 · 2 评论 -
数据结构--二叉查找树 Binary Search Tree
文章目录1.二叉查找树概念2.二叉查找树操作2.1 查找2.2 插入2.3 删除2.4 其他2.5 支持重复数据的二叉查找树2.6 有散列表了,还需要二叉查找树?1.二叉查找树概念二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。2.二叉查找树操作2.1 查找2.2 插入2.3 删除2.4 其他支持快...原创 2019-05-17 23:51:25 · 1426 阅读 · 0 评论 -
数据结构--红黑树 Red Black Tree
文章目录1.概念1.概念二叉树在频繁动态增删后,可能退化成链表,时间复杂度由 O(lgn) 变成 O(n)。(不平衡)平衡二叉树,树中任意一个节点的左右子树的高度相差 <= 1。完全二叉树、满二又树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。平衡二叉查找树中“平衡”的意思,就是让整棵树左右看起来比较“对称"、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样...原创 2019-05-18 00:34:15 · 1103 阅读 · 12 评论 -
数据结构--堆 Heap
文章目录1. 概念2. 操作和存储1. 概念堆是一种特殊的树a. 堆是完全二叉树(除最后一层,其他层都是满的,最后一层节点都靠左)b. 没一个节点都大于等于(或者都小于等于)其子树中每个节点的值2. 操作和存储完全二叉树适合用数组存储,节省空间(不需要左右指针)...原创 2019-05-30 00:52:02 · 1090 阅读 · 0 评论 -
数据结构--图 Graph
文章目录1. 概念2. 存储方法2.1 邻接矩阵 Adjacency Matrix2.2 邻接表 Adjacency List1. 概念顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。2. 存储方法2.1 邻接矩阵 Adjacency Matrix存储比较浪费,有的顶点很多,但是边很少(微信用户很多,每个用户的好友只百个),用邻...原创 2019-06-03 20:41:47 · 1855 阅读 · 0 评论 -
图Graph--寻找二度好友(BFS应用)
社交网络可以用图来表示(查阅图的概念)。寻找二度好友,这个问题就非常适合用图的广度优先搜索BFS算法来解决,因为广度优先搜索是层层往外推进的。首先,遍历与起始顶点最近的一层顶点,也就是用户的一度好友然后再遍历与用户距离的边数为2的顶点,也就是二度好友关系只需要稍加改造一下广度优先搜索代码,用一个数组来记录每个顶点与起始顶点的距离,非常容易就可以找出二度好友关系...原创 2019-06-13 00:28:10 · 2125 阅读 · 0 评论 -
图Graph--最小生成树
文章目录1.概念1.概念对图运用不同的遍历方法就可能得到图的不同遍历顺序,每一种遍历顺序对应于一棵生成树对于无向连通图,所有的生成树中必有一棵树的所有边的权的总和最小的,称之为最小生成树(Minimum cost spanning tree)...原创 2019-06-14 19:35:56 · 1424 阅读 · 0 评论 -
字符串匹配算法(Trie树)
文章目录1. Trie树概念2. Trie树操作2.1 存储2.2 插入2.3 查询1. Trie树概念Trie树,也叫字典树,它是一个树形结构。是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串。Trie树本质,利用字符串之间的公共前缀,将重复的前缀合并在一起。2. Trie树操作2.1 存储Trie树是一个多叉树;二叉树的数据结构里存放着左右子节...原创 2019-06-25 01:25:37 · 7229 阅读 · 2 评论 -
数据结构--位图 BitMap
文章目录1. 位图2. 代码1. 位图我们有1千万个整数,整数的范围在1到1亿之间。如何快速查找某个整数是否在这1千万个整数中呢?当然,这个问题可以用散列表来解决。可以使用一种特殊的散列表,那就是位图。申请一个大小为1亿、布尔类型(true或者false)的数组。将这1千万个整数作为数组下标,将对应的数组值设置成true。比如,整数5对应下标为5的数组值设置为true,也就是array[...原创 2019-08-06 22:18:08 · 2595 阅读 · 3 评论 -
B+树 -- MySQL数据库索引
文章目录1. 定义清楚问题2. 尝试学过的数据结构解决问题3. 改造二叉查找树来解决问题4. 总结为了加速数据库中数据的查找速度,我们常对表中数据创建索引。数据库索引是如何实现的呢?底层使用的是什么数据结构和算法呢?1. 定义清楚问题如何定义清楚问题呢?除了问题调研,还可以对一些模糊的需求进行假设,来限定要解决的问题的范围。假设要解决的问题,只包含两个常用的需求:根据某个值查找,比如 ...原创 2019-08-08 01:41:26 · 752 阅读 · 0 评论 -
索引 Index -- 快速查找数据
文章目录1. 为什么需要索引2. 索引的需求定义2.1 功能性需求2.2 非功能性需求3. 构建索引常用的数据结构4. 总结索引这种常用的技术解决思路,底层往往会依赖哪些数据结构?1. 为什么需要索引实际的软件开发中,它们的本质都可以抽象为“对数据的存储和计算”。存储,增删改查。一旦存储的数据很多,性能就成了关注的重点“如何节省存储空间、提高数据增删改查的效率”,是设计的重点。不夸张地...原创 2019-08-09 23:52:19 · 1449 阅读 · 0 评论 -
如何选择数据结构和算法(转)
文章目录1.时间、空间复杂度 != 性能2.抛开数据规模谈数据结构和算法都是“耍流氓”3. 结合数据特征和访问方式来选择数据结构4. 区别对待IO密集、内存密集和计算密集5. 善用语言提供的类,避免重复造轮子6. 千万不要漫无目的地过度优化熟知每种数据结构和算法的功能、特点、时间空间复杂度,还是不够的。工程上的问题往往都比较开放,往往需要综合各种因素,比如编码难度、维护成本、数据特征、数据规模等...原创 2019-08-22 23:54:37 · 1801 阅读 · 0 评论