
简单算法
文章平均质量分 60
L-M-Y
健康和自由至上
展开
-
常见排序算法总结
衡量算法优越性的规则时间性能。在我的理解里,计算机产生的最大功能和意义就是“以空间换时间”。因此,一个算法的时间开销是衡量其好坏的最终的标志。而搞笑的排序算法应该是具有尽可能少的关键字比较次数和记录移动次数。空间需求:执行一个算法往往需要一些辅助存储空间,好的算法往往需要的辅助存储空间也相对少冒泡排序1)两两比较相邻元素a[i]和a[i+1],如果a[i]>a[i+1],则交换a[i]和a[i+1]的位置2)对剩下的n-1个元素,再两两进行比较,按同样规则交换它们的位置,经过n-2次边角原创 2021-11-20 14:39:43 · 1358 阅读 · 2 评论 -
快速排序 QuickSort
产生原因排序方法千千万,算法不断在更新进步。可以说,希尔排序是插入排序的升级版;堆排序是选择排序的升级版。而快速排序,是冒泡排序的升级版。我们知道,冒泡排序通过不断比较和移动交换来实现排序,每次至多移动相邻两个元素的位置,像泡泡一样,一点点往上升。而快速排序,则是通过增大元素的移动距离,使较大的元素从前面直接移动到较后的位置,较小的值直接移动到较前面的位置。从而大大减小了时间复杂度。原理通过一趟排序将待排记录分割成独立的两部分,其中一部分元素值均比另一部分元素值小,则可分别堆这两部分进行排序(原创 2021-11-18 21:32:57 · 831 阅读 · 0 评论 -
位运算整理(C/C++)实现
之前,我对位运算表示不屑一顾,今天偶然看到了大佬的一篇文章,好家伙,直接把我下巴惊掉了。没啥想说的,就一句话,位运算,牛逼!(本文摘自大佬的文章)原文链接:https://mp.weixin.qq.com/s/C6o6T9ju34vAxNBg5zobWw位运算简介1位逻辑运算符&(位“与”)and^(位“异或”):规则:相同为0,相异为1,0∧0=0,0∧1=1,1∧0=1,1∧1=0应用:(1)与0相∧,保留原值(2)交换两个值,不用临时变量( 3)与自己相 ∧,值为0|(位原创 2021-08-10 11:07:48 · 211 阅读 · 0 评论 -
求斐波那契数列的几种方法
一、暴力(递归)int fib1(int n){ if (n == 1 || n == 2) return 1; return fib1(n - 1) + fib1(n - 2);}这是最常见的写法,在这里我们可以画出递归树听大佬说,但凡遇到需要递归的问题,最好都画出递归树,对于分析算法的复杂度,寻找算法低效的原因有很大的帮助。递归算法的时间复杂度=子问题分数*解决一个子问题需要的时间由图我们可以看到,这个递归的时间复杂度为O(2^n),显然是一个指数级别原创 2021-08-10 10:31:09 · 175 阅读 · 0 评论 -
必学算法总结
哈哈哈,看看就好鸭数据结构1 线段树(维护区间操作)2 二叉搜索树3 树状数组(维护前缀操作)4 单调栈(在需要栈性质的前提下维护单调序列)5 单调队列(维护单调队列,常用于节点之间有可用权值表示的逻辑关系问题的求解)6 并查集(判断连通性、传递逻辑关系)、带权并查集(常用于节点之间有可用权值表示的逻辑关系问题的求解)7 哈希表8 trie树(设计二进制数相关问题,是AC自动机的基础)9 treap平衡树(维护有序序列,对其进行二分查找,求k大,求前驱后继等操作)10 伸展树(维护区原创 2021-08-09 14:06:34 · 191 阅读 · 0 评论 -
Codeforces Round #202 (Div. 1) A题
第一次做div1的题,哈哈哈,参考了大佬的代码,学了二分,还是有点点收获的鸭A. Mafia分类:思维,二分题目大意:有n个人玩游戏,每个人想玩的最少局数为a[i],每局游戏中有一个人是裁判(裁判不参与此局游戏),求最少进行多少局游戏,能够满足每个人的需求。思路:这道题读懂之后我才发现,有很多隐含条件,比如每个人都要从第一局玩到最后一局不能退出。这道题的思路若集中在每个人玩了多少局,情况会比较复杂,所以主要看每个人当裁判的个数。设共要玩k局,则每个人当裁判的场数为k-a[i],k-a[0]+原创 2021-08-03 11:41:07 · 182 阅读 · 0 评论 -
C++二分查找总结
二分查找是一种非常快速的查找方法,又称折半查找。二分查找定义二分查找(Binary Search)技术。它的前提是线性表中的记录必须是关键码有序(通常为升序),线性表必须采用顺序存储。二分查找的基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复,直至查找成功,或所有查找区域无记录查找失败为止。代码示例//by lmy#include原创 2021-08-03 10:43:37 · 224 阅读 · 0 评论 -
KMP模式匹配算法
概念串(string)的最重要的操作之一就是串的模式匹配。说的这么高级,其实就是在一个主串里面找某一个子串的位置。而KMP是一种很快速的字符串查找方法。既然提到KMP的高效性,就不得不拿出朴素模式匹配算法来进行对比一下子。朴素的模式匹配算法若是在长度为m的主串里找一个长度为n的子串时间复杂度:O(m*n)举个小栗子吧~图片:虽然这个栗子可能看起来并不是特别复杂,但是实际上,计算机处理的并不仅仅只是单单的字符,而是二进制0和1的串,一个ASCII码是一个8位的二进制01串,所以,比一个字符原创 2021-07-28 15:21:53 · 287 阅读 · 0 评论 -
前缀和(C++)
算法的种类很多,虽然我目前掌握的不多,但是在我浅薄的认知里,我把算法分为两类。一类是小算法,比如前缀和与快速幂这种,为什么说它们是小算法呢,因为,它们的用法比较单一,不算是一种庞大的思想,一般不能决定整个算法的走向,而是为降低程序时间复杂度的一个小操作,一种锦上添花的小装饰。另一类是大算法,比如贪心和动态规划这种,这种算法直接关系到解决某个问题的全局思想,出现的形式多样,运用起来也比较灵活。哈哈,废话不再多说,来解释一下前缀和吧~定义前缀和(Prefix sum)就是,对于一个给定数组a,它的前缀原创 2021-07-23 16:30:03 · 2555 阅读 · 0 评论 -
贪心算法基本介绍
贪心算法介绍挑选过程是多步判断,每步依据某种“短视”的策略(只看眼前)的策略进行选择,即在每个局部阶段,贪心法都走出一个当前最优的局部决策,并期望通过每次所做的局部最优决策产生一个全局最优解。选择时注意满足相容性条件。贪心算法类似于分治算法和动态规划,也是一种基于子问题思想的策略。(分治策略的求解过程是自底向上,但是贪心算法的求解过程是自顶向下)贪心算法思想1)贪心法适用于组合优化问题。2)求解过程是多步判断过程,最终的判断序列对应于问题的最优解。3)依据某种“短视的”(只看眼前)贪心选择性质原创 2021-07-08 14:40:23 · 632 阅读 · 0 评论 -
求佩尔方程的解
题目描述求关于x y的二次不定方程的解 x* x-n* y* y=1输入多组输入数据,先输入组数T 然后输入正整数n(n<=100)输出对于每组数据输出一行,求y<=10000的最小正整数解 ,输出y的值,如果在此范围内没有解则输出No**样例输入 **173样例输出No提示只需要输出y的值题解刚看到这个题的时候,我傻傻的用了两个for,循环来循环去,疯狂时间超限。后来观摩了大佬的代码,才恍然大悟,这题最终的结果与x无关,只需要关注y* y* n+1是否为整数就好了原创 2021-05-06 11:50:35 · 316 阅读 · 0 评论 -
牛客 开心的涂刷(快速幂)
题目描述链接:https://ac.nowcoder.com/acm/problem/14718来源:牛客网一天小明同学拿着m种颜色的油漆去涂刷n块格子,在涂刷的过程中他发现有很多种涂色方案,并很快的算出了答案,然后他发现如果涂好颜色的格子中只要存在某两个相邻的格子颜色一样,他就会感到开心,他想知道有多少种让他开心的涂刷方案。输入描述:输入仅包含一行,包含两个数n,m分别表示格子数和颜色数。(1 <= n <= 1e12, 1 <= m <= 1e12)输出描述:输出一原创 2021-04-15 16:48:53 · 549 阅读 · 2 评论 -
快速幂算法(C++)
基本概念什么是快速幂呢?个人理解,就是更快速的计算幂运算。比如计算a^b刚学这个算法的时候我也很疑惑,幂运算不是有现成的公式么,直接pow(a,b)不就好了吗?后来才明白,pow(a,b)的时间复杂度是O(b),即每次乘b,都得再运算一次。如果b的值很大,那么代码的运行时间会很长,很多题目会疯狂时间超限。而快速幂算法的时间复杂度是O(logb),可以有效减少运行计算机的次数。例子下面我举个简单小的例子:计算2^32(a=2,b=32)2*2=2^2;2^2 *2^2 =2^4;2^4原创 2021-04-14 21:32:45 · 17433 阅读 · 3 评论