
数据结构与算法
文章平均质量分 72
我吃西蓝花
用最简洁和细致的语言,实现最清晰和明确的表达 | 目前做优质的c/c++技术栈专栏
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法笔记—动态规划
【代码】算法笔记—动态规划。原创 2025-04-20 22:56:09 · 584 阅读 · 0 评论 -
Hash表,STL-unordered_map和unordered_set
下面是模拟的底层hash表:使用的是开放定址法。一、unordered_map和unordered_set。原创 2025-02-18 18:47:22 · 269 阅读 · 0 评论 -
算法笔记—前缀和(动态规划)
优化:前缀和+同余定理:首先,加以i结尾的子数组和为y,sum是i的前缀和,然后y%k==0表示子数组的和可以被整除。所以(sum-x)%k==0 => 同余定理: sum%k==x%k,其中x可以是i之前所有元素的前缀和,我们用hash统计好i之前所有元素的前缀和,就可以得出以i结尾的子数组和为k的个数。细节:这里的sum和x可能为负数,所以%k取余可能是负数,所以用 sum%k==x%k,无法正确判断出一些特殊情况,例如sum=-3,x=2;同余定理:(a-b)%k==c……原创 2024-12-20 22:54:47 · 288 阅读 · 0 评论 -
贪心算法—
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。这种算法并不总是能找到全局最优解,但在某些问题上能提供足够好的解决方案。原创 2024-06-22 18:23:43 · 987 阅读 · 0 评论 -
背包问题—动态规划
与找521 零钱兑换的方式的区别,这个是排列,顺序不同,也统计次数。01背包问题:没有物品(元素)只能选择1次。完全背包,物品(元素)个数有无限个。原创 2024-06-10 23:07:46 · 221 阅读 · 0 评论 -
算法—字符串操作
【代码】算法—字符串操作。原创 2024-06-08 18:33:23 · 362 阅读 · 0 评论 -
红黑树(STL-ordered_map)
结论2:有n个内部结点的红黑树的高度为h=2^(h/2)-1-->log2(n+1)iterator++:iterator++的所指结点,为其右子树的最大值(最左结点),无右子树时,为某一祖先,即从下向上遍历,第一个祖先的左孩子为该iterator所指结点的祖先。类似AVL树,复用旋转函数,但是少了平衡因子变化。原创 2024-03-20 17:26:04 · 1031 阅读 · 0 评论 -
算法-栈操作
【代码】算法-栈操作。原创 2024-04-22 15:13:11 · 254 阅读 · 0 评论 -
算法-二分查找
具体:定义区间左右指针,中间结点的数值与目标值比较结果,不断减少一半的区间长度,其去target所在区间里搜索,如果left>right跳出循环。二分查找:在数组有序的条件下,通过不断选取中间结点,根据中间结点的数值与目标值比较结果,将。右边界模板,通过二段性,分成两段,target位于左段(左区间)的最右端点。左边界模板,通过二段性,分成两段,target位于右段(右区间)的左端点。原创 2024-04-22 15:13:56 · 587 阅读 · 1 评论 -
算法—hash表
熟悉hash映射,用key判断是否对象存在或者存在个数,在其他问题种常用来记录key(键值)是否存在(或者存在个数),用来if判断。原创 2024-04-17 12:02:25 · 352 阅读 · 0 评论 -
算法—链表操作
掌握数据结构链表的头插和尾插,删除,查找的操作,然后就可以根据题目要求实现其操作组合。对于链表来说,画图更好理解题解中的具体步骤,否则难以理解代码实际对数据结构的操作。原创 2024-04-16 10:14:47 · 292 阅读 · 0 评论 -
算法—分治
具体实现:多数采用递归操作分解,然后递归操作,需要注意的是函数头,函数体,以及递归出口,函数头:由问题所需变量指定,递归出口由问题最小规模返回决定,函数体看问题具体的需要的信息决定。分治-快速排序:下面这三题:都是快排,其中第一题快排,第二题,在快排的基础上,进行剪枝,避免无用的排序,第三题同理,也是避免无用排序。O(Nlog2k);:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时,采用这种思想,基本问题指问题规模最小时的情况,次级问题是指主问题的n级降低n-1级的问题。原创 2024-04-13 07:53:16 · 343 阅读 · 0 评论 -
算法-滑动窗口
本题更新结果具体问题具体分析,因为出窗的条件是满足问题目标,所以需要在出窗满足时,提前更新结果,然后观察其他问题,出窗条件为不满足问题目标(通常是大于/超过)。滑动窗口,与双指针类似,也是使用两个指针进行移动遍历数组处理,也可以说时双指针中的一个特殊类型,因为左右指针同向移动,左右指针中间所夹的区域像一个窗口一样移动,所以称为滑动窗口。以第一个例题举例,首先需要两个指针,一个指针入窗口(right),一个指针出窗口(left),以及right遍历的所需条件。第一个例题是在出窗口前时,满足条件,更新结果。原创 2024-03-30 23:58:03 · 567 阅读 · 0 评论 -
算法—位运算
按位与1后,除最低位外所有位变为0,判断最低位,为1,所有数n的x位为1,反之为0。然后与数n按位或 ,(bit)0与任意或为任意,1与任意或为1,所有将数n的x位置为1。然后与数n按位与,(bit)1与任意与为任意,0与任意与为0,所以将数n的x位置变为0。将(int)1左移x位,在按位取反,变成如下,除了x位外都为1.。原理:-n为:将最右侧的1的左边的数全部取反,然后与数n相与。原理:n-1为将最右侧的1的右边的数全部取反,然后与数n相与。算术右移:仅对于有符号数,对于无符号数为逻辑右移。原创 2024-03-23 16:03:55 · 770 阅读 · 0 评论 -
位图与布隆过滤器
第二步:将对应的小文件(A1和B1),即hash分割时hash函数相同的小文件,一起放进set中,过滤掉重复和不相同的元素,每次处理完将set中的元素存入对应的文件,依次对A2,B2~A200,B200进行相同处理。我们每次加入一个元素后,多个hash函数对应的各自的多个位都+1,每次删除一个元素后,同理减一。第一步,同上,对两个文件各自进行hash分割为200个小文件,分别为A1~A200,以及B~B200,A1和B1采样相同的hash函数,那么两个大文件的同一个query,必然在哈希函数相同小文件中。原创 2024-03-20 17:24:56 · 665 阅读 · 0 评论 -
平衡搜索二叉树—AVL树
为了避免搜索二叉树的高度增长过快,降低二叉树的性能,规定在插入和删除二叉树的结点的时候,任何结点左右子树的高度差绝对值不超过1,这样的二叉树被称为平衡二叉树(balanced Binary Tree),简称平衡树。在搜索二叉树BST的基础上增加以上性质,就称为AVL树。原创 2024-03-05 22:49:19 · 411 阅读 · 0 评论 -
二叉搜索树
情况4:在它的右子树中寻找中序下的第一个结点(关键字最小),用它的值填补到被删除节点 中,再来处理该结点的删除问题--替换法删,或者在左子树中寻找中序下的最后一个结点,交换此结点与删除结点的值,将其转换为对左子树最右结点的删除(情况1或者2).对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。情况3:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除。删除和插入有递归和非递归两个版本。原创 2024-02-17 22:46:24 · 849 阅读 · 0 评论 -
数据结构—堆:STL-priority_queue
1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。empty():检测容器是否为空。原创 2024-01-29 23:52:02 · 437 阅读 · 0 评论 -
数据结构与算法-排序
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)原创 2023-11-27 20:30:49 · 151 阅读 · 1 评论 -
线性表-顺序表与链表
当慢指针刚进环时,可能就和快指针相遇了,最差情况下两个指针之间的距离刚好就是环的长度。此时,两个指针每移动一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在满指针走到一圈之前,快指针肯定是可以追上慢指针的,即相遇。编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点。,即慢指针一次走一步,快指针一次走两步,两个指针从链表其实位置开始运行,如果链表。原创 2023-10-30 21:42:10 · 84 阅读 · 1 评论 -
数据结构—时间复杂度与空间复杂度
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果,也即是解决问题的计算过程。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。找到基本语句与问题规模N之间的数学表达式,即使算出了该算法的时间复杂度。空间复杂度也是一个数学表达式,是对一个算法在运行过程中。2、在修改后的运行次数函数中,只保留最高阶项。时间复杂度的定义:在计算机科学中,原创 2023-10-30 19:49:37 · 97 阅读 · 2 评论