算法
文章平均质量分 58
Jxiepc
一个努力向上的男同志
展开
-
算法【树】| 红黑树总结
红黑树是一棵近似平衡二叉搜索树,其中序遍历单调不减,并且能确保任何一个结点的左右子树的高度差小于两倍;恢复红黑树的性质需要少量的颜色变更和不超过三次树旋转(对于插入操作是两次);原创 2022-10-28 21:43:53 · 489 阅读 · 0 评论 -
算法【跳表】|
文章目录一、简介一、简介跳表实际上是对链表进行改造,以支持类似于二分搜索的算法;内部包含n个元素,其查询和插入的平均时间复杂度为O(logN);其结果简单,为多级单链表,使用空间来换取时间,甚至可以用来替代红黑树(redis中的有序集合);【查询】:首先,在最上层(最稀疏)开始查找,不断跳转到下一个层次,直到找到元素;...原创 2022-05-06 15:19:25 · 462 阅读 · 0 评论 -
算法【链表】| 两两交换链表中的节点
文章目录题目描述图解code题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。图解codestruct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int原创 2022-05-06 09:26:45 · 346 阅读 · 0 评论 -
算法【链表】 | 【01】链表反转
文章目录将链表反转,需要保留当前指针和后续的指针,以免指针无效;struct LinkList { int val; LinkList* next; LinkList(int v) : val(v), next(nullptr) {}};/** 递归形式 */LinkList* reverse01(LinkList* head, LinkList* prev) { if(head = nullptr) return prev; LinkList* nex原创 2022-05-04 12:14:27 · 1126 阅读 · 0 评论 -
算法【字符串匹配】| KMP算法详解
文章目录一、简介二、图解三、代码一、简介Knuth-Morris-Pratt字符串搜索算法(或KMP 算法)通过观察在发生不匹配时,单词本身包含足够的信息来搜索W主要“文本字符串”中出现的“单词”S来确定下一个匹配的开始位置,从而绕过对先前匹配字符的重新检查。该算法由James H. Morris构思,并由Donald Knuth “几周后”从自动机理论中独立发现。Morris 和Vaughan Pratt在 1970 年发表了技术报告。三人也在 1977 年联合发表了该算法。独立地,1969 年原创 2022-04-20 16:03:44 · 771 阅读 · 0 评论 -
C++【算法】 | 【algorithm】常用方法
文章目录all_of :所有元素是否都any_of :所有元素是否存在none_of :是否都没有满足条件for_each:将自定义函数用于指定范围find :查找指定范围内的值find_if :获取自定义函数查找指定范围内的第一个元素adjacent_find:查找范围内相等的相邻元素count:统计该范围内出现的次数equal:两个范围内的元素是否相等is_permutation:判断范围是否是另一个排列【与顺序无关】search:子序列的搜索范围copy:复制指定范围元素move:元素移动swap:交原创 2022-03-23 09:44:04 · 2791 阅读 · 0 评论 -
算法【动态规划】 | 【02】枚举类型
文章目录问题一问题描述递归方法动态规划版本问题一问题描述题中给定数组[1,3,5,2]的面值,需要凑出面值为8,列表中的面值可以任意张数,有几种方法;递归方法/*---------------------------------------------------------------------- > File Name: base.cpp > Author: Jxiepc > Mail: Jxiepc > Created Time: Sun 20 Mar原创 2022-03-20 10:00:36 · 675 阅读 · 0 评论 -
算法【动态规划】 | 【01】二维表结构
文章目录问题解决思路:问题一:问题解决思路:先尝试用递归写法 -> 建立数组讲数据缓存到数组中 -> 建立表格结构优化问题一:当在n个位置中,从起始位置到结尾位置必须走k步到达终点,一共有几种走法?...原创 2022-03-19 17:17:48 · 1990 阅读 · 0 评论 -
算法【位运算】 | 位运算的应用
文章目录1、判断数值出现的奇偶次2、数值交换不需要用到临时变量3、获取相应内存块大小4、提取数值位数值5、判断该数值是否为2或4的幂6、位操作数值乘除7、位的状态操作bit数组8、不通过比较判断最大最小值1、判断数值出现的奇偶次问题描述:根据一个数组,查找出一个出现奇数次数的数,其余为偶数次数;利用^运算,只要相同则等于0;/*---------------------------------------------------------------------- > File原创 2022-03-15 15:40:42 · 190 阅读 · 0 评论 -
算法【Morris】 | 先序、中序、后序遍历
文章目录问题描述解析代码复杂度问题描述使用morris遍历树,生成先序、中序、后序遍历结点;1) cur先来到头节点;2) 若cur没有左孩子,cur向右移动;3) 若cur有左孩子,找到左树上最右的结点mostRight; a. 若mR的右指针为空,则让其指向cur,在将cur向左移动; b. 若mR的右指针指向cur,让其指向null,在将cur右移;4) cur为空时停止;【先序】:遍历中只出现一次的节点,直接打印,出现两次的,第一次打印;【中序】:遍历中只出现一次的节点,直原创 2022-03-14 11:35:31 · 1567 阅读 · 2 评论 -
算法【DP树】 | DP树求最大高度以及树的最大距离
文章目录问题描述解析代码结果问题描述通过dp树获取树中最大距离,以及高度;使用结构体将树的信息一级一级往回传递;解析代码/*---------------------------------------------------------------------- > File Name: getMaxdisDP.cpp > Author: Jxiepc > Mail: Jxiepc > Created Time: Mon 14 Mar 2022 08:20:原创 2022-03-14 09:14:32 · 249 阅读 · 0 评论 -
算法【单调栈】 | 列表中每个数值的左右边最大/最小的数值
文章目录问题描述解析代码时间复杂度拓展问题描述【单调栈】:求解每个位置的数左边以及右边最近大于/小于它的数;栈【存储数组索引】:保持顺序;当压入栈的数值大于栈顶时,则将栈中小于该数值的数弹出; 当数组遍历完毕时,则将栈全部弹出;解析代码/*---------------------------------------------------------------------- > File Name: dullStack.cpp > Author: Jxiepc &g原创 2022-03-10 16:36:29 · 294 阅读 · 0 评论 -
算法【窗口滑动问题】 | 判断最大值/最小值
文章目录问题描述解析代码问题描述【窗口滑动问题】:求解在一个数组中,滑动固定区域中最大值;>> 使用双向链表解析代码/*---------------------------------------------------------------------- > File Name: Demo.cpp > Author: Jxiepc > Mail: Jxiepc > Created Time: Thu 10 Mar 2022 11:11:59原创 2022-03-10 15:15:08 · 990 阅读 · 0 评论 -
STL【算法】| 常用算法大集合
文章目录一、简介1.1 类别1.1.1 _if结尾1.1.2 _copy尾词1.1.3 算法类别二、非变动性算法2.1 简介2.2 常见算法2.2.1 元素计数2.2.2 最大值和最小值2.2.3 搜寻元素三、变动性算法3.1 简介3.2 常用3.3 移除性算法四、变序性算法五、排序算法六、已序区间算法七、数值算法一、简介STL算法都被设计用来处理一个或多个迭代器区间;多数情况下只需提供起点即可;STL算法采用覆盖模式而非安插模式;1.1 类别1.1.1 _if结尾当此类算法有两种形式原创 2022-03-08 16:22:50 · 1709 阅读 · 0 评论 -
算法【哈希】 | 哈希表
文章目录一、简介1.1 哈希表/函数1.2 特性1.3 哈希实践一、简介1.1 哈希表/函数🎈哈希函数简介哈希表通过哈希函数对输入的key进行处理,将key存放在相应的索引上的链表;1.2 特性哈希表内存扩张:当哈希表中,索引的链表过长时,会自动扩张一倍;扩张时需要时间为O(logN),且当元素转移时需要时间O(N),故总的时间复杂度为O(NlogN);均分性:哈希表内部链表的长度会维持相对的稳定;查找性能:当通过key进行查找,即可通过哈希函数获取相应的索引,在通过遍历其中的链表原创 2022-03-03 15:10:24 · 142 阅读 · 1 评论 -
算法【哈希】 | 哈希【布隆过滤器】
文章目录一、概念1.1 简介1.2 原理1.3 复杂度1.4 使用步骤1.5 扩展和应用二、构建bit数组一、概念1.1 简介布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。可用于检索一个元素是否在一个集合中;优点:空间效率和查询时间都远远超过一般的算法;缺点:有一定的误识别率和删除困难;1.2 原理当元素被加入到集合内部,通过K个散列函数将改元素映射成一个位数组中的K个点,且将其置为1;当我们检索元素时,只需通过原创 2022-03-03 15:09:37 · 468 阅读 · 0 评论 -
算法【树】 | 【栈用法】如何快速搞懂前序、中序、后序遍历?
文章目录一、树的遍历1.1 先序遍历1.2 中序遍历1.3 后序遍历1.4 代码一、树的遍历????????树的详细介绍前序遍历:【头左右】;中序遍历:【左头右】;后序遍历:【左右头】;1.1 先序遍历每次从栈中弹出一个结点;打印该结点;在将弹出结点的右左【先右在左】子结点压入栈内;1.2 中序遍历先左在右在头;将左子树都进栈;在依次弹出打印,且对其右树执行相同的操作;1.3 后序遍历头结点先入栈;出栈后进入2号栈;先压左在压右;1原创 2022-02-05 16:26:25 · 1454 阅读 · 0 评论 -
算法【树】 | 【递归用法】如何快速搞懂前序、中序、后序遍历?
文章目录一、树的遍历1.2 树遍历的递归用法1.2.1 遍历代码一、树的遍历????????树的详细介绍1.2 树遍历的递归用法前序遍历:【头左右】;中序遍历:【左头右】;后序遍历:【左右头】;1.2.1 遍历代码/*---------------------------------------------------------------------- > File Name: treeTraverse.cpp > Author: Jxiepc >原创 2022-02-05 14:30:54 · 658 阅读 · 0 评论 -
算法【链表】 | 【链表回文】
文章目录一、链表回文1.1 步骤1.2 代码分块代码一、链表回文1.1 步骤> 方法1:将链表的内容压入栈内,在将栈的元素依次弹出对比;> 方法2:使用快慢指针,当快指针走到结束时,慢指针走到一半。此时将后半部分的链表放入链表内, 在与前半部分进行对比;> 方法3:不适用额外的数据结构。使用快慢指针,后将后面的链表进行逆序,与前半部分对比,对比完成后再将链表 恢复;1.2 代码分块代码/*------------------------------------原创 2022-02-05 10:56:01 · 535 阅读 · 0 评论 -
算法【链表】 | 【链表尾部重合问题】
文章目录一、链表尾部重合1、步骤2、代码分块2.1 数据结构2.2 获取入环结点2.3无环链表处理2.4 有环链表处理3、代码一、链表尾部重合1、步骤> 首先判断是否有环:【若有环,则返回入环结点】 方法1:可使用set容器,每次将链表结点压入时,进行查询; 方法2:使用快慢指针【快指针走两步,慢指针走一步】若走不到空结点,则有环。 且当两个指针相遇时,快指针回到头节点,两个指针每次走一步,当两个指针相遇时, 就是入环结点;> 若链表无环: 两条无环链表,先进行长度判原创 2022-02-05 09:55:20 · 2410 阅读 · 0 评论 -
算法【排序】 | 插入排序(附图解、代码)
简介插对于少量元素的排序,它是一个有效的算法,插入排序是一种最简单的排序方法。它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。时间复杂度时间复杂度:O(n2);空间复杂度空间复杂度:O(1);优缺点相对少量的元素,较为有效;过程图解代码/*-------------------------------原创 2022-01-29 11:00:04 · 1013 阅读 · 0 评论 -
算法【排序】 | 桶排序(附图解、代码)
简介工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间O(n)。时间复杂度时间复杂度:O(m+n);优缺点比较浪费空间过程首先根据数值的最后一位,将其统计在列表中;在对该列表进行累加和;在根据累加和以及数值列表进行取出排序;图解代码/*--------------------------------原创 2022-01-29 10:07:37 · 1425 阅读 · 0 评论 -
算法【排序】 | 堆排序(附图解、代码)
文章目录一、简介1.1 时间复杂度1.2 空间复杂度1.3 优缺点二、过程2.1 图解2.2 代码一、简介堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序;大顶堆:每个结点的值都大于或等于其左右孩子结点的值;小顶堆:或者每个结点的值都小于或等于其左右孩子结点的值。1.1 时间复杂度构建时间复杂度:第i次要O(logi);1.2 空间复杂度重建时间复杂度:O(nlogn);1原创 2022-01-28 11:13:38 · 1234 阅读 · 0 评论 -
算法【排序】 | 快速排序 【荷兰问题】(附代码、图解)
简介快速排序是通过冒泡排序算法改进而来的;有多个版本:以下是最优的版本;时间复杂度:总时间复杂度:O(nlogn);空间复杂度:空间复杂度:O(n);过程图解原创 2022-01-28 07:39:34 · 335 阅读 · 0 评论 -
算法【排序】 | 归并排序【排序、逆序对、小和问题】(附图解、代码)
文章目录简介时间复杂度空间复杂度优缺点:过程图解代码简介归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。时间复杂度总时间复杂度:O(nlogn);空间复杂度空间复杂度:O(n+logn);优缺点:比较占内存,但效率高且稳定。过程图解原创 2022-01-27 10:00:36 · 742 阅读 · 0 评论 -
线性代数 |矩阵【运算、逆、转置】
矩阵矩阵介绍一般而言,所谓矩阵就是由一组数的全体,在括号[]内排列成m行n列(横的称行,纵的称列)的一个数表,并称它为m*n矩阵。矩阵相等当俩个矩阵为同型矩阵时,且对应元素相等时。数与矩阵相乘定义:数n与矩阵A相乘,则记作nA或者An;例如:注意:显然,对于0和1及任意矩阵A,有:0A=0、1A=A矩阵的运算规律设A为矩阵,x,y为数值(xy)A = y(xA);(x+y)A = xA+yA;矩阵的加法条件:只有同维的矩阵才能进行相加。原创 2021-05-12 09:35:21 · 9965 阅读 · 2 评论 -
算法基础 | 【02】线性回归
文章目录线性回归的基本介绍线性回归的损失和优化梯度下降法几种梯度下降法全梯度下降法(FG)随机梯度下降算法(SG)小批量梯度下降法随机平均梯度下降法(SAG)回归性能评估线性回归的基本介绍定义定义:利用回归方程对一个or多个自变量(特征值)和因变量(目标值)之间的关系进行建模特点单变量回归:只有一个自变量多元回归:多于一个自变量情况公式特征与目标的关系分析俩种模型:一种线性关系,一种非线性关系线性回归的损失和优化损失函数损失值 = (预测值-真实值)平方再原创 2021-02-09 20:18:00 · 2887 阅读 · 0 评论 -
算法基础 |【01】K-近邻算法
概念在一个样本空间中的k个最相似(特征空间中最近邻)的样本中的大多数属于某一个类别API的使用sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)参数:n_neighbors:默认为5距离度量1、欧式距离即高中所学的俩点之间的距离公式2、曼哈顿距离用以标明两个点在标准坐标系上的绝对轴距总和3、切比雪夫距离是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。类似于人走格子,直行、横行、斜行原创 2021-02-08 16:10:48 · 3212 阅读 · 0 评论