常用算法
博弈Dream
code and code
展开
-
如何计算时间复杂度
一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa ! =0时,时间复杂度就是O(2^n);a=0,bO(n^3);a,b=0,cO(n^2)依此类推eg:(1) for(i=1;i //循环了n*n次,当然是O(n^2) f转载 2017-09-02 09:08:49 · 567 阅读 · 0 评论 -
动态规划算法
动态规划 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 基本思想 若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存...原创 2018-02-25 16:38:52 · 766 阅读 · 0 评论 -
常用排序之桶排序
桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。与计数排序类似,因为对输入数据作了某种假设,桶排序的速度也很快。具体来说,计数排序假设输入数据都属于一个小区间内的整数,而桶排序则假设输入是由一个随机过程产生,该过程将元素均匀、独立地分布在[0,1)区间上。工作原理 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后,将n个输入数分别放到各个桶中...原创 2018-03-24 11:12:12 · 352 阅读 · 0 评论 -
常用排序之计数排序
计数排序是一种非比较排序算法。计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。计数排序是稳定的。基本思想 对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则x就应该在第18个输出位置上。当有几个元素相同时,这一方案要修改,因为不能把它们放在同一个输出位置...原创 2018-03-20 15:36:05 · 1395 阅读 · 0 评论 -
常用排序之基数排序
基数排序属于“分配式排序”,又称“桶子法”。它是通过键值的信息,将要排序的元素分配至某些“桶”中,以达到排序的作用。基数排序属于稳定性排序。时间复杂度 基数排序的时间复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数。基本原理 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这...原创 2018-03-22 09:07:11 · 1133 阅读 · 0 评论 -
常用查找算法
一、顺序搜索 顺序查找是在一个已知无(或有)序队列中找出与给定关键字相同的数的具体位置。顺序查找适合小规模的数据原理从序列的第一个元素开始,依次与关键字进行比较,直到找到目标关键字或者查找失败。 1、从表中的第一个元素开始,依次与关键字比较。 2、若某个元素与关键字匹配,则查找成功。 3、若直至最后一个元素还未匹配关键字,则查找失败。时间复杂度 ...原创 2018-03-26 16:02:46 · 1315 阅读 · 0 评论 -
KMP字符串匹配算法
KMP算法是一种改进的字符串匹配算法。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。基本思想设主串(下文中称为T):a b a c a a b a c a b a a b b模式串(下文中称为W):a b a c a b 用朴素...原创 2018-04-03 20:19:32 · 1932 阅读 · 0 评论 -
排列与组合
一、全排列问题1.对于一个给定的序列 a = [a1, a2, a3, … , an],请设计一个算法,用于输出这个序列的全部排列方式。 例如:a = [1, 2, 3] 输出[1, 2, 3][1, 3, 2][2, 1, 3][2, 3, 1][3, 2, 1][3, 1, 2]代码如下:void helper(vector<int>v, int start, int end){...原创 2018-06-02 16:35:52 · 482 阅读 · 0 评论 -
最大公约数与最小公倍数
位操作由三个操作符&、|、^,分别对它们的操作数的各个位执行AND、OR和XOR(异或)等逻辑操作。当两个位进行AND 操作时,如果两个位都是1,结果为1,否则结果为0。当两个位进行OR操作时,如果两个位都是0,结果为0,否则结果为1。当两个位进行XOR操作时,如果两个位不同,结果为1,如果两个位相同,结果为0。 位操作符要求操作数为整数类型,它们对操作数对应的位进行指定的操作,每次对左右...原创 2018-05-09 10:31:45 · 403 阅读 · 0 评论 -
判断素数
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。定义 质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。解法1对1到n之间的数求余,若余数为0,说明其有因子,它不是一个素数。bool isPrime(int n){ int i; for (i = 2; i < n; i++) {...原创 2018-07-31 09:19:09 · 1151 阅读 · 0 评论 -
大数据和空间限制问题
大数据和空间限制问题1. 只用2GB内存在20亿个整数中找到出现次数最多的数2. 40亿个非负整数中找到没出现的数3. 找到100亿个URL中重复的URL以及搜索词汇的top K问题4. 40亿个非负整数中找到出现两次的数和所有数的中位数5. 一致性哈希算法的基本原理6. 统计论坛在线人数分布7. 找到1到10w中没有出现的两个数字8. 判断数字是否出现在40亿个数...原创 2018-08-10 14:40:28 · 895 阅读 · 0 评论 -
DFS和BFS算法
一、深度优先遍历深度优先搜索,是图论中的经典算法。其利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。递归定义假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:1.访问出发点v,并将其标记为已访问过;2.依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点...原创 2018-02-17 17:00:26 · 1131 阅读 · 0 评论 -
回溯算法
回溯法,简单理解就是有源可溯。基本思想要借鉴穷举法,但是它不是一味地穷举,当发现某一步不符合条件时,这一步后面的穷举操作就不进行了(俗称“剪枝”),我自己把它叫做动态穷举法。假设第一个步骤可行,那么执行第二个步骤,第三个......如果其中第三个步骤不行,那么我们再回过来(回溯),第二个步骤换一种方法尝试,然后再重新第三个步骤,第四个......直到完成任务要求为止。这里,以八皇后问题为例。试图把...原创 2018-02-23 19:28:35 · 634 阅读 · 0 评论 -
分治算法
分治分:递归解决较小的问题治:然后从子问题的解构建原问题的解分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略...原创 2018-02-21 17:20:07 · 682 阅读 · 0 评论 -
常用排序之希尔排序法
算法描述 希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。具体描述如下: 假如有一个大小为n数组,一般取一个增量d=n/2,将数组的元素进行分组。 所有距离为d的倍数的元素被分到一组中,先在各组内进行直接插入排序。再取第二个增量d2重复上述分组和排序,直至所取增量为1,此时所有记录放在同一组中进行直接插入排序。改进的目的基于以下两点: ...原创 2017-09-04 10:15:30 · 1434 阅读 · 0 评论 -
常用排序之堆排序法
什么是堆?堆实际上是一棵完全二叉树,堆分为大顶堆和小顶堆,大顶堆的堆顶的关键字是最大的,小顶堆的堆顶的关键字是最小的。堆排序思想:利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性。一般用数组来表示堆,如下所示:堆的操作insert (插入) 为将一个元素X插入到堆中,我们在下一个空闲位置创建一个空穴,否则该堆将不是完全树。如果X可以放在该空穴中而不破坏堆...原创 2017-09-07 10:32:57 · 2138 阅读 · 0 评论 -
常用排序之选择排序法
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法 具体描述 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现...原创 2017-09-06 09:04:45 · 1453 阅读 · 0 评论 -
数据结构中常用排序
1.冒泡排序法冒泡排序稳定的#include#define SIZE 8void bubble_sort(int a[],int n);void bubble_sort(int a[],int n){ int i,j,temp; for(i=0;i<n-1;i++) for(j=0;ja[j+1]) { temp=a[...原创 2017-08-31 17:40:39 · 560 阅读 · 0 评论 -
常用排序之冒泡排序法
冒泡排序一般是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成,冒泡排序是一种稳定排序。原理冒泡排序算法的运作如下:(从后往前) 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对...原创 2017-09-02 08:55:38 · 1365 阅读 · 0 评论 -
常用排序之插入排序法
算法描述 何为插入排序呢?顾名思义,即向一个有序数据序列中插入一个数,插入此数后的序列仍然有序。具体描述如下: 假如有一个数组: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 ⒋ 重复步骤3,直到找到已排序...原创 2017-09-03 09:52:38 · 1425 阅读 · 0 评论 -
常用排序之归并排序法
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定排序。归并过程 比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r...原创 2017-09-08 11:35:39 · 1381 阅读 · 0 评论 -
常用排序之快速排序法
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法描述 1、设置两个变量i、j,排序开始的时候:i = 0,j = N-1; 2、以第一个数组元素作为关键数据,赋值给key,即key = A[0]; ...原创 2017-09-13 15:58:48 · 1625 阅读 · 0 评论 -
二分查找算法
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法。但是,二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找过程 假设表中的元素是升序排列,取表中间位置,将中间位置的关键字与所要查找的关键字进行比较,如果相等则查找成功。否则将表从中间位置分成1、2两个表,如果中间位置记录的关键字大于查找关键字,则继续查找1表;否则继续查...原创 2018-02-27 19:36:02 · 2451 阅读 · 0 评论 -
贪心算法
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。满足条件1、可行性:即它必须满足问题的约束2、局部最优:它是当前步骤中所有可行选择中最佳的局部选择3、不可取消:即选择一旦做出,在算法的后面步骤中就无法改变了 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选...原创 2018-02-19 17:56:57 · 667 阅读 · 0 评论 -
洗牌算法和概率算法
1.洗牌算法假定有个数组,含有n个元素,假定有个方法shuffle(...)对n-1个元素有效,我们用它来打乱n个元素的次序。我们会先打乱前n-1个元素的次序,然后取出地n个元素,将它与数组中的元素随机交换。递归解法的算法如下:int Rand(int low, int high){ return low + rand() % (high - low + 1);}vec...原创 2018-08-21 18:59:13 · 609 阅读 · 0 评论