![](https://img-blog.csdnimg.cn/20190709194635554.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
《数据结构与算法之美》学习笔记
该专栏是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助。本人是半路程序员,2018年2月开始学习C++的,代码基本都是C++11版本的,代码有错误的地方请不吝赐教,一起学习,一起进步!
Michael阿明
两个孩子的父亲,8年机械工程师,已转行互联网做算法,一起继续加油!高举智慧,她就使你高升;怀抱智慧,她就使你尊荣。-- 箴言(4:8)
展开
-
《数据结构与算法之美》学习汇总
此篇文章是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助。本人是半路程序员,2018年2月开始学习C++的,下面的代码基本都是C++11版本的,代码有错误的地方请不吝留言赐教。附有部分练习LeetCode、POJ的题目。原创 2019-04-22 21:13:00 · 24421 阅读 · 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 · 6366 阅读 · 10 评论 -
数据结构--树状数组
文章目录1. 树状数组2. 单点查询,单点修改3. 单点查询,区间修改1. 树状数组类似数据结构:线段树(Segment Tree)树状数组 跟 线段树 的区别:树状数组能做的事情,线段树都能做!(线段树功能更牛)树状数组代码简单,实现起来比线段树容易(树状数组代码更简单)树状数组的 查询 和 修改 复杂度都为 log(n)\log(n)log(n)原数组为 A树状数组为...原创 2020-04-01 21:56:42 · 2746 阅读 · 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 · 3205 阅读 · 16 评论 -
10种C++排序算法
10种C++版本排序算法原创 2018-07-12 19:09:33 · 2999 阅读 · 42 评论 -
快速排序quicksort算法优化
1.基本想想快速排序使用分治的思想通过一趟排序将待排序列分割成两部分,其中一部分所有元素均比基准大,另一部分均比基准小分别对这两部分元素继续进行排序,以达到整个序列有序2.快排的步骤1.选择基准 在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot)2.分割操作 在基准左边的元素都比该基准小,在基准右边的元素都比基准大 3.递归 递归地对两个序列进...原创 2018-07-21 23:57:09 · 1243 阅读 · 4 评论 -
快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)
对链接中快速排序进行代码优化https://blog.csdn.net/qq_21201267/article/details/80993672#t61.只申请一次内存,避免多次递归调用时反复的申请和释放内存,提高程序运行效率/* * 6-1-opti1.快速排序(best version)(三数取中基准+希尔排序+基准群)(opti1,只申请一次内存) * 对数组找出一个中间大小...原创 2018-08-09 01:56:00 · 1669 阅读 · 0 评论 -
数据结构--单链表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 · 1458 阅读 · 0 评论 -
数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)
回文串为首尾对称的字符串:如a,aba,abba等单链表思路1.将字符读入链表2.找到链表中点3.将链表从中点断开成2条,将后半条反转4.比较两条链表是否相等(比较次数以少的为准(长度为奇数时))双向链表思路1.将字符读入链表2.找到链表尾节点3.从首尾依次向中间比较(双向链表可以双向移动,代码上更简洁,见下面)单链表C++代码实现//...原创 2019-03-14 22:12:30 · 3759 阅读 · 1 评论 -
数据结构--链表--约瑟夫环问题(单向循环链表)
问题:一群人站成一个圆圈,从一个人开始报数,1, 2 ,。。。m,报到m的拉出去砍了,求被砍的顺序和最后一个活下来的。利用单向循环链表实现C++代码如下:(参考书籍:数据结构与算法实验指导书)#include <iostream>using namespace std;struct NodeType{ int num; char name[20...原创 2019-03-14 23:10:51 · 5265 阅读 · 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 · 994 阅读 · 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 · 3095 阅读 · 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 · 2050 阅读 · 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 · 1609 阅读 · 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 · 1399 阅读 · 3 评论 -
数据结构--栈--共享顺序栈
共享顺序栈:内部也是一个数组将两个栈放在数组的两端,一个从数组首端开始压栈,一个从数组尾部开始压栈,等到两边栈顶在中间相遇时,栈满。共享顺序栈在某些情况下可以节省空间。头文件 sharingStack.h//共享顺序栈// Created by mingm on 2019/3/28.//#ifndef STACK_SHARINGSTACK_H#define STACK_SHARI...原创 2019-03-29 00:09:31 · 2166 阅读 · 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 · 1016 阅读 · 0 评论 -
数据结构--队列Queue--循环顺序队列
针对顺序队列中的入队操作:if 队列没满,但是队尾到达数组末尾了,队列"满"了,其实没有满,数据需要整体移至数组头部,才可以继续入队。为解决该问题,避免数据的挪移,有了循环顺序队列...原创 2019-04-02 22:18:38 · 943 阅读 · 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 · 6288 阅读 · 0 评论 -
算法--递归--走台阶问题(2种递归+递归改循环)
递归:一个问题可以分解成若干子问题,且求解思路一样,当到一定的情况下有终止条件,这样的问题可以用递归方法求解注意事项:递归调用深度太大,栈空间会耗尽溢出注意避免调用中某些值的重复计算(见以下代码3)递归,频繁调用函数,时间成本高(见以下代码1)递归代码可以改成循环代码 (见以下代码2)问题给你 n 个台阶,你的最大步幅是2步,可以一次走1步,也可以一次走2步,问有多少种走法?...原创 2019-04-06 15:26:19 · 3898 阅读 · 2 评论 -
算法--递归--汉诺塔问题
游戏规则:一次只能挪一片;小的只能在大的上面;把所有的从A柱挪到C柱。递推公式:上部 n - 1 个 A 到 B;最底下 1 个 A 到 C ;上部 n - 1 个 B 到 C;终止条件:n = 1 时,A 到 C;/** * @description: 汉诺塔递归问题 * @author: michael ming * @date: 2019/4/7 20:10 * ...原创 2019-04-07 20:58:02 · 2086 阅读 · 10 评论 -
算法--排序--寻找数组内第K大的元素
此题目,需要用到快速排序里的划分数组操作:快排参考:https://blog.csdn.net/qq_21201267/article/details/81516569#t2先选取一个合适的哨兵(三数取中法)将数组分成三部分【小于哨兵的】【哨兵】【大于等于哨兵的】然后看哨兵的下标+1 == K吗?等于就返回哨兵,不等则在一侧递归调用该划分方法复杂度:平均情况下,遍历一次数组找到哨兵是...原创 2019-04-13 17:43:38 · 840 阅读 · 0 评论 -
算法--排序--大小写字母数字分离(桶排序思想)
题目: 对D,a,F,B,c,A,z这个字符串进行排序,要求将其中所有小写字母都排在大写字母的前面,但小写字母内部和大写字母内部不要求有序。比如经过排序之后为a,c,z,D,F,B,A,这个如何来实现呢?如果字符串中存储的不仅有大小写字母,还有数字。要将小写字母的放到前面,大写字母放在中间,数字放在最后,不用排序算法,又该怎么解决呢?思路:先扫描一遍数组,计算3种类型的元素个数,计算出每个类...原创 2019-04-13 20:41:40 · 2222 阅读 · 0 评论 -
算法--二分查找--求平方根(循环法/递归法)
二分查找:数据需要是顺序表(数组)数据必须有序可以一次排序,多次查找;如果数据频繁插入,删除操作,就必须保证每次操作后有序,或者查找前继续排序,这样成本高,二分查找不合适数据太小,不用二分查找,直接遍历数据太大,也不用,因为数组需要连续的内存,存储数据比较吃力复杂度 lg2n题目: 求一个数的平方根例如:二分法求根号5a:折半: 5/2=2.5b:平方校验:...原创 2019-04-15 23:37:05 · 4948 阅读 · 0 评论 -
算法--二分查找--查找给定条件的值
1.数据有序且无重复,查找给定值/** * @description: 数据有序(小到大)且无重复,查找给定值 * @author: michael ming * @date: 2019/4/16 18:54 * @modified by: */#include <iostream>#define N 10using namespace std;int binar...原创 2019-04-17 00:51:24 · 1436 阅读 · 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 · 880 阅读 · 0 评论 -
数据结构--散列表 Hash Table
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。散列函数,设计的基本要求散列函数计算得到的散列值是一个非负整数( 因为数组下标从0开始)如果 key1 = key2,那 hash(key1)== hash(key2)如果 key1 != key2,那 hash(key1)!= hash(key...原创 2019-05-04 20:34:16 · 1092 阅读 · 0 评论 -
算法--Hash算法及其应用场所
文章目录1.Hash算法定义2.应用2.1 安全加密2.2 唯一标识2.3 数据校验2.4 散列函数2.5 负载均衡2.6 数据分片2.7 分布式存储1.Hash算法定义哈希算法:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。设计一个优秀的哈希算法并不容易,需要满足的几点要求:1· 从哈希值不能反向推导出原...转载 2019-05-07 23:51:33 · 903 阅读 · 0 评论 -
数据结构--二叉树 Binary Tree
文章目录1.概念2.存储方式2.1 链式存储(二叉树代码大部分是链式实现的)2.2 顺序存储(基于数组)3.二叉树的遍历1.概念二叉树,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点满二又树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点。完全二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排...原创 2019-05-10 20:59:43 · 1232 阅读 · 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 · 1315 阅读 · 0 评论 -
数据结构--红黑树 Red Black Tree
文章目录1.概念1.概念二叉树在频繁动态增删后,可能退化成链表,时间复杂度由 O(lgn) 变成 O(n)。(不平衡)平衡二叉树,树中任意一个节点的左右子树的高度相差 <= 1。完全二叉树、满二又树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。平衡二叉查找树中“平衡”的意思,就是让整棵树左右看起来比较“对称"、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样...原创 2019-05-18 00:34:15 · 1021 阅读 · 12 评论 -
数据结构--堆 Heap
文章目录1. 概念2. 操作和存储1. 概念堆是一种特殊的树a. 堆是完全二叉树(除最后一层,其他层都是满的,最后一层节点都靠左)b. 没一个节点都大于等于(或者都小于等于)其子树中每个节点的值2. 操作和存储完全二叉树适合用数组存储,节省空间(不需要左右指针)...原创 2019-05-30 00:52:02 · 983 阅读 · 0 评论 -
数据结构--图 Graph
文章目录1. 概念2. 存储方法2.1 邻接矩阵 Adjacency Matrix2.2 邻接表 Adjacency List1. 概念顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。2. 存储方法2.1 邻接矩阵 Adjacency Matrix存储比较浪费,有的顶点很多,但是边很少(微信用户很多,每个用户的好友只百个),用邻...原创 2019-06-03 20:41:47 · 1699 阅读 · 0 评论 -
图Graph--寻找二度好友(BFS应用)
社交网络可以用图来表示(查阅图的概念)。寻找二度好友,这个问题就非常适合用图的广度优先搜索BFS算法来解决,因为广度优先搜索是层层往外推进的。首先,遍历与起始顶点最近的一层顶点,也就是用户的一度好友然后再遍历与用户距离的边数为2的顶点,也就是二度好友关系只需要稍加改造一下广度优先搜索代码,用一个数组来记录每个顶点与起始顶点的距离,非常容易就可以找出二度好友关系...原创 2019-06-13 00:28:10 · 1963 阅读 · 0 评论 -
图Graph--农夫过河问题(BFS/DFS应用)
农夫过河问题:原创 2019-06-13 22:25:25 · 3124 阅读 · 0 评论 -
图Graph--最小生成树
文章目录1.概念1.概念对图运用不同的遍历方法就可能得到图的不同遍历顺序,每一种遍历顺序对应于一棵生成树对于无向连通图,所有的生成树中必有一棵树的所有边的权的总和最小的,称之为最小生成树(Minimum cost spanning tree)...原创 2019-06-14 19:35:56 · 1246 阅读 · 0 评论 -
字符串匹配算法(BF & RK)
文章目录1. BF(brute force)暴力匹配1. BF(brute force)暴力匹配BF算法的思想,在主串中,检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串,看有没有跟模式串匹配的。最坏情况下每次都要对比m个字符,对比次数n-m+1次,复杂度O(m*n)...原创 2019-06-17 23:41:46 · 1179 阅读 · 2 评论 -
字符串匹配算法(BM)
文章目录1. BM(Boyer-Moore)算法1. BM(Boyer-Moore)算法思想:有模式串中不存在的字符,那么肯定不匹配,往后多移动几位,提高效率BM原理:坏字符规则,好后缀规则...原创 2019-06-22 04:12:15 · 33316 阅读 · 42 评论 -
字符串匹配算法(KMP)
文章目录1. KMP由来2. KMP算法基本原理1. KMP由来上一节说的BM算法是最高效、最常用的字符串匹配算法。最知名的却是KMP,它3位作者(D.E.Knuth,J.H.Morris,V.R.Pratt),算法的全称是Knuth Morris Pratt 算法,简称KMP算法。2. KMP算法基本原理类似于BM里的概念:坏字符(不能匹配的),好前缀(已经匹配的那段)K...原创 2019-06-22 21:22:27 · 1189 阅读 · 2 评论 -
字符串匹配算法(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 · 6649 阅读 · 2 评论