![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
文章平均质量分 53
算法与数据结构
(╯▔皿▔)╯
这个作者很懒,什么都没留下…
展开
-
取模(%)
职能作用于两个整型数(正整数、负整数),运算结果是两数相除后的余数,运算结果为整数。所以, i % k = (i + n * k) % k, n属于整数。(2)被除数小于除数时,运算结果等于被除数。取绝对值,再%,结果加上被除数的符号。(1)运算结果正负号与。原创 2024-01-23 09:55:00 · 423 阅读 · 0 评论 -
gcd(求解最大公约数)
我来介绍一下这个算法的优点,就是避免了大整数取模导致效率低下,但是运算次数要比辗转相除多得多,所以我们在使用的时候需要判断一下。但是大整数取模会让一些题极为头疼,所以我们还是要慎重考虑什么时候用更相减损什么时候用辗转相除。两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。其实就是把更相减损变得更高级一点(加减运算变乘除运算,提升了一个级别)原创 2024-01-23 09:54:03 · 418 阅读 · 0 评论 -
KMP算法
优点:指向被查找数组的指针i,从头遍历到尾(不反复),指向目标数组的指针j,通过nxt数组,当匹配过程中,遇到不相同/后找到目标字符串时,跳到合适的位置;//找到最长的前后缀重叠长度。作用:当匹配过程中,遇到不相同/后找到目标字符串时,则将 j(指向目标数组的指针)= nxt[j],继续匹配。定义:nxt[i]存储目标数组的前i - 1项的最长相同前后缀的长度;原创 2024-01-23 09:51:37 · 401 阅读 · 0 评论 -
二分查找算法
空间 <------> 时间。二分查找《——f[x]:数组<------> f(x):函数——》二分答案。则mid = (head + tail) / 2 == head;2.f[x] = y, y --> x难, x-->y 易;要用mid = (head + tail + 1) >> 1。1.查找第一个1 == 查找第一个大于target的数;2.查找最后一个1 == 查找最后一个大于target的数。边界条件:当head == tail + 1;初始条件:head = 0, tail =原创 2024-01-23 09:50:12 · 834 阅读 · 0 评论 -
递归转非递归
设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。若集合X上的关系是R,且R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。2.处理当前队首节点,将队首节点有向边指向的所有节点的入度减一,并将入度为一的节点入队(bfs)比较简单的理解:偏序是指集合中只有部分成员可以比较,全序是指集合中所有的成员之间均可以比较。自己模拟的栈可以开辟在堆上,它的空间可以是整个电脑的内存,相比于系统栈更大,减少了爆栈操作。的序列,简称拓扑序列。原创 2024-01-23 09:32:21 · 858 阅读 · 0 评论 -
二维扫描线法
/vec_y存储范围内的点的y值。原创 2024-01-22 18:46:09 · 384 阅读 · 0 评论 -
时间复杂度
对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。O(n)--程序运行时间与问题规模呈线性关系。而且,在能够应用均摊时间复杂度分析的场合,O(1)--程序运行时间与问题规模没有关系。---系数归一,常数归一,保留最高次项。1s ---> 计算机计算10^8次。O(n^2)--循环套循环。原创 2024-01-22 18:45:00 · 359 阅读 · 0 评论 -
回溯算法详解
回溯算法 == 问题状态求解树 + 深搜 + 剪枝优化。原创 2024-01-22 18:43:47 · 806 阅读 · 0 评论 -
为什么在main函数外开数组
在main函数外开,使用系统堆空间,因为堆空间比栈(函数在栈内)大,所以在main函数外开数组时,可以开的更大。原创 2024-01-22 18:39:32 · 345 阅读 · 0 评论 -
排序算法详解
O(n^2)代码实现:void select_sort(int* arr, int l, int r) { for (int i = 0, I = r - 1; i < I; i++) { int ind = i; for (int j = i + 1; j < r; j++) { if (arr[j] < arr[ind]) ind = j; } swap(arr原创 2024-01-22 18:38:26 · 883 阅读 · 0 评论 -
判断可不可以左旋得到字符串
判断可不可以左旋得到字符串。原创 2024-01-22 18:29:11 · 356 阅读 · 0 评论 -
判断素数 -- 随笔
另一方面,当从小到大遍历到数 x 时,倘若它是合数,则它一定是某个小于 x 的质数 y 的整数倍,故根据此方法的步骤,我们在遍历到 y 时,就一定会在此时将 x 标记为 isPrime[x]=0。当然这里还可以继续优化,对于一个质数 x,如果按上文说的我们从 2x 开始标记其实是冗余的,应该直接从 x * x 开始标记,因为 2x,3x,…从小到大遍历每个数,如果这个数为质数,则将其所有的倍数都标记为合数(除了该质数本身),即 0,这样在运行结束的时候我们即。大于 x 的 x 的倍数 2x,3x,…原创 2024-01-22 18:27:45 · 387 阅读 · 0 评论 -
前缀和数组--HZOJ_244_第七章
求数组的连续M位和:O(n)---> O(1)问题转换(竞赛算法思维)原创 2024-01-22 18:25:33 · 324 阅读 · 0 评论 -
三部翻转法
include<stdio.h>#include<string.h>#include<assert.h>intcharacharbassertaassertbintaintbifreturnaacharabifreturnelsereturnintchar"abcdefg"char"cdefgab"intif"yes\n"else"no\n"return。原创 2024-01-22 18:24:20 · 321 阅读 · 0 评论 -
森林与并查集
1.N个节点有M对关系(M条边),每对关系(每条边)都有一个权值w,可以表示距离或划分成多个集合时的集合编号.原创 2024-01-22 18:22:36 · 884 阅读 · 0 评论 -
四平方和定理 - - leetcode 279
/ 判断是否能表示为 4^k*(8m+7)// 判断是否为完全平方数。原创 2024-01-22 18:17:04 · 332 阅读 · 0 评论 -
贪心--随笔
贪心:用偏序关系一次又一次的证明贪心策略。看一步走一步,而且只看一步路;算法执行每一步,都选当前最优解;HZOJ-P511 进制。不回头,不改变已有策略。原创 2024-01-22 18:14:51 · 340 阅读 · 0 评论 -
正方形矩阵顺时针旋转90度
matrix[col][n - row - 1]正好是旋转后的位置。正方形矩阵顺时针旋转90度 等价于 矩阵水平翻转 + 对角线翻转。n 是 matrix.size();原创 2024-01-22 18:10:23 · 374 阅读 · 0 评论 -
异或运算满足交换律
除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。异或运算满足交换律,a^b^a=a^a^b=b。原创 2024-01-22 18:12:13 · 336 阅读 · 0 评论 -
stack
堆栈是一个线性表,插入和删除只在表的一端进行。这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom)。堆栈的元素插入称为入栈,元素的删除称为出栈。由于元素的入栈和出栈总在栈顶进行,因此,堆栈是一个后进先出(Last In First Out)表,即 LIFO 表。C++ STL 的堆栈泛化是直接通过现有的序列容器来实现的,默认使用双端队列deque的数据结构,当然,可以采用其他线性结构(vector 或 list等),原创 2024-01-22 12:09:21 · 314 阅读 · 0 评论 -
递归函数详解
假设递归函数调用返回结果是正确的,实现本层函数逻辑(p(n - 1)->p(n))实现边界条件时的程序逻辑(P(1))递归函数设计的三个重要部分。原创 2024-01-22 12:08:25 · 656 阅读 · 0 评论 -
队和优先队列
左孩子编号:2i右孩子编号:2i1。原创 2024-01-22 12:07:19 · 821 阅读 · 0 评论 -
队列和栈详解
size:队列大小head:头指针tail:尾指针。原创 2024-01-22 12:04:04 · 1147 阅读 · 0 评论 -
非递减排列
非递减排列是指一个数列中的元素从左到右依次不减,或者说不降序排列。也就是说,如果数列中某个元素的值比它前面的元素小,那么它的值至少和前面的元素相等,即数列中不存在逆序对。如果数列中有相邻的元素相等,也认为是非递减排列。9,8,7,7,6,5,5,2,1 : 非递增排列。1,2,3,3,4,5,8,8:非递减排列,1,2,3,4,5:递增排列,9,8,7,6,5:递减排列。原创 2024-01-22 11:52:04 · 522 阅读 · 0 评论 -
哈希表详解
介绍哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表hash table(key,value) 的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。原创 2024-01-22 11:48:44 · 929 阅读 · 0 评论 -
链表---详解
链表不一定由结构体构成,也可能是数与数之间的固定指向。双指针等距移动法:确定链表中的倒数第几位的位置。通过快慢指针可以分辨是单向链表还是循环链表。一般来说,有头链表使用时更方便。把链表的尾节点当作虚拟头节点。原创 2024-01-20 12:08:46 · 847 阅读 · 0 评论 -
平衡树基础
(1)节点插入从根节点开始,逐层比较要插入的节点比当前节点大,指针往右子树移要插入的节点比当前节点小,指针往左子树移直到遍历到空节点,根据上述规则,插入到空节点(2)节点删除1、删除叶⼦节点直接删除2、删除出度为1的节点提升唯一的子树3、删除出度为2的节点找到要删除节点的前驱或者后继,与其中之一替换后,转换为度为1的节点问题前驱:从要删除的节点的左子树开始,向右遍历到的最大节点为要删除的节点的前驱后继:从要删除的节点的右子树开始,向左遍历到的最小节点为要删除的节点的后继。原创 2024-01-20 12:03:49 · 860 阅读 · 0 评论 -
树与二叉树
根节点:最顶层的节点就是根结点,它是整棵树的源头叶子节点:在树下端的节点,就是其子节点个数为0的节点节点的度:指定节点有几个分叉就说这个节点的度是几(叶子节点的度为零)树的度:只看根结点,树的度等价于根节点的度出度:该节点指向多少个节点入度:多少个节点指向该节点节点高度:指从这个节点到叶子节点的距离(一共经历了几个节点)节点深度:指从这个节点到根节点的距离(一共经历了几个节点)树的高度:指所有节点高度的最大值树的深度:指所有节点深度的最大值。原创 2024-01-20 10:40:14 · 964 阅读 · 0 评论 -
顺序表详解
代码实现:原创 2024-01-20 10:35:53 · 854 阅读 · 0 评论 -
算法debug
算法debug。原创 2024-01-20 10:34:31 · 379 阅读 · 0 评论 -
跳跃表的代码实现
跳跃表(Skip List):增加了向前指针的链表叫做指针。跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质是一种可以进行二分查找的有序链表。跳表在原有的有序链表上增加了多级索引,通过索引来实现快速查询。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。跳表是一个随机化的数据结构,可以被看做是二叉树的一个变种,它在性能上和红黑树、AVL树不相上下。原创 2024-01-20 10:31:38 · 828 阅读 · 0 评论 -
二分查找法
二分查找法。原创 2023-07-14 10:25:55 · 23 阅读 · 0 评论 -
函数的递归
递归常见的错误:Stack overflow(栈溢出)*函数调用都要在栈区申请空间。原创 2023-07-14 10:20:58 · 29 阅读 · 0 评论 -
冒泡排序法
*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*///交换数据时用于存放中间数据。//存放数组a中元素的个数。//每轮比较n-1-i次,原创 2023-07-13 11:53:30 · 29 阅读 · 0 评论 -
删除数组中的重复项
删除数组中的重复项。原创 2023-07-13 11:51:26 · 195 阅读 · 0 评论