![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
我要精通C++
这个作者很懒,什么都没留下…
展开
-
算法-双指针
LeetCode算法技巧之双指针(左右指针,快慢指针,排序+双指针)_双指针排序-CSDN博客原创 2024-04-15 13:43:43 · 126 阅读 · 0 评论 -
算法导论(原书第3版) 目录
第一部分 基础知识第1章 算法在计算中的作用31.1 算法31.2 作为一种技术的算法6思考题8 本章注记8第2章 算法基础92.1 插入排序92.2 分析算法132.3 设计算法162.3.1 分治法162.3.2 分析分治算法20思考题22本章注记24第3章 函数的增长253.1 渐近记号253.2 标准记号与常用函数30思考题35 本章注记36第4章 分治策略374.1 最大子数组问题384.2 矩阵乘法的strassen算法434.3 用代入法求解递归式474.4 用递归树方法求解递归式50原创 2022-05-29 20:22:07 · 768 阅读 · 0 评论 -
【Linux服务器开发】1.4 布隆过滤器-判断海量数据中某条数据是否存在
1.什么是布隆过滤器布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic datastructure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性(存在误差)的,而不是确切的.注意:不同的数据结构有不同的适用场景和优缺点,你需要仔细权衡自己的需求之后妥善适用它们,布隆过滤器就是践行这句话的代表。...原创 2021-04-02 19:32:18 · 501 阅读 · 0 评论 -
图(Graph)-最短路径
1.基本概念1.1 最短路径最短路径:从图中某一顶点(源点)达到另一顶点(终点)找到一条路径,言辞路径上各边的权值总和(称为路径长度)达到最小。单源最短路径:已知有向带权图(简称有向网)G=(V,E),找出从某个属于V的源点S到V中其余各顶点的最短路径。习惯上称路径开始顶点为源点,路径的最后一个顶点为终点。最短路径的最优子结构性质:该性质描述为:如果P(i,j)={Vi...Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必原创 2021-10-31 23:48:00 · 677 阅读 · 0 评论 -
图(Graph)-图的遍历(DFS&BFS)
1.图的深度优先遍历-DFS(Depth First Search)1.1 深度优先遍历深度优先遍历,有时候也成为了深度优先搜索,简称DFS,其实,就是像一棵树的前序遍历。它从图中弄的摸个节点v触发,访问此顶点,然后从v的未被访问的邻接点触发深度优先遍历图,直到图中所有和v有路径相同的顶点的都被访问到。若图中尚有顶点未被访问,则另选图中的一个为被访问的顶点做起始点,重复上述过程,直至图中的所有顶点都被访问到为止。深度优先搜索是通过栈来实现的。...原创 2021-10-31 19:29:11 · 459 阅读 · 0 评论 -
leetcode-73-设置零矩阵
#include <stdio.h>#include <string.h>#include <iostream>#define M 4#define N 3using namespace std;void printMatrix(int ** numbers,int rows,int columns){ for(int i=0;i<rows;i++) { for(int .原创 2021-10-31 16:21:55 · 170 阅读 · 0 评论 -
leetcode-89-格雷编码
链接-解题思路15原创 2021-10-30 19:08:23 · 178 阅读 · 0 评论 -
leetcode-53-最大子序和
int maxSubArray(int* nums, int numsSize){ int max = nums[0]; // 这个值需要非常关注,初始值怎么给呢?我们这里给nums[0]是合理的做法 max = INT_MIN; // 选择一个起点 for(int i = 0;i <numsSize;i++ ) { // 选择一个终点 for(int j = 0;j <numsSize; j++ ) .原创 2021-10-30 16:38:22 · 149 阅读 · 0 评论 -
leetcode-283-这样写为什么报错?
void swap(int *a, int *b) { int t = *a; *a = *b, *b = t;}void moveZeroes(int *nums, int numsSize) { int k = 0; for(int i = 0;i<numsSize;i++) { if(nums[i]==0) { k++; } else { swap(nums[i],nu.原创 2021-10-30 14:43:25 · 108 阅读 · 0 评论 -
图(Graph)-图的存储
1.存储类型顺序存储-邻接矩阵链式存储-邻接表原创 2021-10-24 17:22:19 · 924 阅读 · 0 评论 -
图(Graph)-图的相关概念
1.图的相关概念1.1 图的定义与术语图的定义图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示成:G=(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。顶点线性表中我们把数据元素叫做元素,树中我们将数据元素叫节点,在途中数据元素我们称为顶点(Vertex).顶点必须是有穷的非空集合,因此一个图至少有一个顶点.顶点必须是有穷的非空集合,因此一个图至少有一个顶点.边任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边(Edge)来表示,边可以是空的原创 2021-10-20 23:12:16 · 1234 阅读 · 0 评论 -
leetcode50 power(x,n)
实现pow(x,n),即计算 x 的 n 次幂函数(即,x^n)案例超时的C语言写法:classSolution{public:doublemyPow(doublex,intn){if(n==0)return1;elseif(n%2==1)returnmyPow(x,n-1)*x;elseif(n%2==-1)...原创 2021-10-17 23:23:59 · 186 阅读 · 0 评论 -
100万行的数据怎么去重
100万行的数据怎么高效去重?原创 2021-09-01 10:44:15 · 445 阅读 · 0 评论 -
leetcode-14-最长公共前缀
Javaclass Solution { public String longestCommonPrefix(String[] strs) { if(strs.length==0)return ""; //公共前缀比所有字符串都短,随便选一个先 String s=strs[0]; for (String string : strs) { while(!string.startsWith(s)){ .原创 2021-05-26 13:49:48 · 238 阅读 · 0 评论 -
leetcode-102-二叉树的层序遍历
#define MAXQSIZE 10000 typedef struct{ struct TreeNode *base; int front; int rear;}SqQueue;SqQueue *InitQueue(){ SqQueue *queue = (SqQueue *)malloc(sizeof(SqQueue)); queue->base = (struct TreeNode *)malloc(sizeof(struct TreeNode) * MAXQSIZ.原创 2021-05-22 15:25:09 · 129 阅读 · 0 评论 -
leetcode-8-myAtoi
int myAtoi(char * s){ #define MAX_INT 0x7FFFFFFF #define MIN_INT 0x80000000 long long tmp_res = 0; int is_negtive = 0; char *p =s; char *q; while (*p == ' ' && *p != '\0') p++; if (*p == '-') { .原创 2021-05-22 10:28:51 · 156 阅读 · 0 评论 -
KMP
1.引入首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个字符串的值A=”abcaabababaa”B=”abab”那么普通的匹配是怎么操作的呢?原创 2021-04-16 10:55:50 · 186 阅读 · 0 评论 -
雪花算法
0.阅读学习链接引用阅读1原创 2021-04-05 17:40:00 · 295 阅读 · 0 评论 -
字典树
引用阅读1原创 2021-04-04 14:25:40 · 117 阅读 · 0 评论 -
Dijkstra算法
引用阅读1原创 2021-03-27 21:40:16 · 138 阅读 · 0 评论 -
【系统设计】tinyURL
1.评判2.设计1的十次方 1K1的二十次方 1M1的三十次方 1G 大概是10亿的量级1的三十二次方 4G设计的时候要明白read和write谁多一些?一般在url中读的会比写的多.如果加上cache的话,就可以大幅度提高读写效率.两种不同的淘汰策略.LRU--是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰.LFU--LFU(least frequently u原创 2021-01-02 10:53:04 · 1003 阅读 · 0 评论 -
【文件系统】LRU算法
1.什么是LRU算法 LRU(Least Recently Used),最近最少使用,是一种内存算法.LRU算法基于一种假设:长期不被使用的数据,在未来被用到的几率也不大.因此,当数据所占内存达到一定阈值时,要移除掉最近最少使用的数据.LRU算法使用了一种有趣的数据结构,叫做哈希链表.2.什么是哈希链表在现在的内核实现中,我们的文件的Inode底层的存储结构就是哈希链表.比如说我们现在有文件的inode是00001...原创 2020-11-07 23:38:24 · 369 阅读 · 0 评论 -
找出无符号的32位整型数中的较大的一个
不用比较符号找出两个32位整型数中的较大的一个原创 2020-11-07 00:39:13 · 200 阅读 · 0 评论 -
数据结构与算法之初识散列表
目录1.什么是散列表2.散列的主要作用3. 散列表的查找步骤4.散列函数的设计4.1直接定址法4.2 数字分析法4.3 平方取中法4.4 折叠法4.5 除留余数法4.6 随机数法1.什么是散列表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数.原创 2020-10-28 11:08:44 · 177 阅读 · 0 评论 -
排序算法10-基数排序
1.什么是基数排序基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前.2.算法描述取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始取每个位组成radix数组;对radix进行计数排序(利用计数排序适用于小范围数的特点);3....原创 2020-10-28 09:37:31 · 161 阅读 · 0 评论 -
排序算法9-桶排序
1.什么是桶排序桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。2.算法步骤设置一个定量的数组当作空桶;遍历输入数据,并且把数据一个一个放到对应的桶里去;对每个不是空的桶进行排序;从不是空的桶里把排好序的数据拼接起来。 3....原创 2020-10-28 09:35:16 · 168 阅读 · 0 评论 -
排序算法8-计数排序
1.什么是计数排序计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中.作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数.2.计数排序的步骤...原创 2020-10-28 09:32:28 · 186 阅读 · 0 评论 -
剑指offer&leetcode
1.天秤座的唐风如果有两个数组 a 和 b (没有重复元素),要将 a 和 b 中的中相同的元素放入数组 c 中,不同的元素放入数组 d 中,用什么方法好?原创 2020-10-27 16:21:38 · 741 阅读 · 0 评论 -
排序算法7-堆排序
1.什么是堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;堆排序的平均时间复杂度为 Ο(nlogn)。2.大顶堆和小顶堆图示3.一个条件反射原创 2020-10-27 13:40:26 · 245 阅读 · 0 评论 -
排序算法6-归并排序
1.什么是归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 2.算法步骤1.把长度为n的输入序列分成两个长度为n/2的子序列;2.对这两个子序列分别采用归并排序;3.将两个排序好的子序列合并成一个最终的排序序列(此步骤需要开辟另外的内存空间).3. 图示说明算法思想原创 2020-10-27 10:33:06 · 218 阅读 · 0 评论 -
排序算法5-快速排序
1.什么是快速排序 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n²) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists).快速排序又是一种分而治之思想在排序算原创 2020-10-26 21:57:50 · 125 阅读 · 0 评论 -
排序算法3和4-插入排序与希尔排序
1.什么是插入排序 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.2. 插入排序的思路与步骤将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)3.插入排序的高效使用场景1.元素序列基本有序;2.原创 2020-10-26 16:12:20 · 95 阅读 · 0 评论 -
排序算法2-选择排序
1.什么是选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。2.选择排序的步骤...原创 2020-10-26 14:15:08 · 89 阅读 · 0 评论 -
排序算法1-冒泡排序
1.什么是冒泡排序 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。 冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。 2. 冒泡排序的步骤原创 2020-10-26 14:11:10 · 106 阅读 · 0 评论 -
排序简介
1.排序的基本概念排序是计算机内经常进行的一种操作,其目的是一组无序的数据元素调整为有序的数据元素.2.排序数学定义3.排序的稳定性如果在序列中有两个元素r[i]和r[j],它们的关键字k[i]和k[j],且在排序之前,对象r[i]和r[j]前面,如果在排序之后,对象r[i]仍然在r[j]前面,则称这个排序方法是稳定的,否则称这个排序算法是不稳定的.4.多关键字排序排序是需要比较的关键字多于一个,排序结果先按照关键字1进行排序,当关键字1相同时按照关键字2进行排..原创 2020-10-26 10:12:20 · 411 阅读 · 0 评论 -
数据结构之二叉树的创建
1.如何才能确定一棵树通过中序遍历和先序遍历可以确定一棵树;通过中序遍历和后序遍历可以确定一棵树;通过先序遍历和后序遍历不能确定一棵树.2.练习3.#号法创建树原创 2020-10-24 21:04:15 · 144 阅读 · 0 评论 -
数据结构与算法之树简介
1.示例树的图示2.树的定义与结构特点1.树的定义由一个或者多个(n>=0)节点组成的有限集合T,有且仅有一个节点称为根(root),当n>1的时候,其余的节点分为m(m>=0)个互不相交的有限集合T1,T2,...,Tm.每个集合本身又是棵树,被称作这颗树的子树.(由此可以看出树具有递归性,大树里面有小树).2.树的结构特点(1)非线性结构,有一个直接前驱,但可能有多个直接后继(1:n);(2)树的定义具有递归性,树中还有树;(3)树可以为空,即节点个.原创 2020-10-23 18:51:13 · 348 阅读 · 0 评论 -
数据结构之受限线性表-队列
1.队列基本概念队列是一种特殊的受限制的线性表.队列是只允许一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(First In First Out)的线性表,简称FIFO.允许插入的一段为队尾,允许删除的一端为队头.队列不允许在中间部位进行操作,假设队列是q={a1,a2,a3,...,an},那么a1就是队头元素,而an就是队尾元素,我们在删除的时候,总是从a1开始,而插入的时候总是在队列最后.2....原创 2020-10-23 17:10:11 · 832 阅读 · 0 评论 -
数据结构之受限线性表-栈
1.栈的基本概念概念:首先栈是一个线性表,栈元素具有线性关系,即前驱后继关系。只不过它是一种受限制的线性表,定义中说明栈这种线性表在线性表的表位进行插入或者删除操作,这里的表尾是指栈顶,而不是栈底....原创 2020-10-22 18:41:51 · 524 阅读 · 1 评论 -
数据结构趣味题-约瑟夫环
1.约瑟夫问题 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。2.原创 2020-10-22 15:02:39 · 445 阅读 · 0 评论