算法设计与分析
Devin Dever
立志写好每一篇博客,分享日常好用工具!
展开
-
减可变规模算法—中值和选择问题
问题描述:选择问题是求一个n个数列表的第k个最小元素的问题,当k==1或者k ==n,时,可以只扫描整个列表,分别找出最小值或者最大值。这个问题有意思的是当k=n/2时,它要求找出一个这样的元素,这个元素比前半部分列表的元素都要大,又比后半部分的元素都要小,这个中间的值叫做中值。这里我们要了解到一个划分的思想,将一个给定的列表根据某个值p进行划分,一般来说,列表元素会重新整理,使得左边部分的元素都是小于p的,紧接着就是中轴p本身,然后是右边部分都是大于p的划分Lomuto划分,考虑一个数组.原创 2020-05-29 17:35:20 · 1469 阅读 · 0 评论 -
KMP算法终结篇(一)
KMP算法简介KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。下面开始分步讲解一下KMP算法的模式 从模式串t中提取加速匹配的信息在KM...原创 2020-05-04 10:13:19 · 476 阅读 · 0 评论 -
学懂基础排序算法—快速排序
快速排序简介:快速排序是另一种基于分治技术的重要排序算法,不像合并排序是按照元素在数组中的位置对他们进行划分,快速排序通过元素的值对它们进行划分,划分是对数组中元素的重新排列,使得某一元素左边的元素都小于等于该元素,而右边的元素都大于等于该元素。显然,建立划分后,A【s】就已经位于在它有序数组中的最终位置,接下来,对两边的数组分别进行排序,同样的方法。下面是快速排序算法的伪代码void quicksort(int a[10],int l,int r){ if(l<r) { int原创 2020-05-27 21:07:08 · 449 阅读 · 0 评论 -
基础排序算法—(堆)和堆排序
堆排序堆排序的步骤大致分为两部构造堆删除最大键,就是对剩下的对进行n-1次根删除操作接下来来具体聊聊这两步操作 构造堆第一种方法是自底而上堆构造 算法图示第二种方法是自顶向下堆构造通过把新的键插入预先构造好的堆,来构造一个新堆,那么我们怎么把一个新的键插入堆中呢?首先把一个包含键k的结点附加在当前堆的最后一个叶子后面,然后按照下面的方法把k筛...原创 2020-05-27 19:18:38 · 491 阅读 · 0 评论 -
分治法,动态规划法—最大子数组问题的求解
问题描述:假定你获得了投资某公司的机会,这家公司的股票价格是不稳定的,你被准许在某一天买进该公司的股票#define min -24551215#include<stdio.h>struct tuple{ int low; int high; int maxsum;};tuple findmaxcrossingsubarray(int a[100],int low,int mid,int high){ int leftsum=min; int maxleft; int r原创 2020-05-26 22:02:42 · 780 阅读 · 0 评论 -
分支策略—分治法
分治算法的实质:把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治算法通常以数学归纳法来验证。而它的计算成本则多数以解递归关系式来判定。分治法模式在每一层递归时都有三个步骤分解原问题为若干子问题,都是原问题的规模较小的实例。解决这些子问题,递归求解子问题,如果子问题足够小,直接求解。合并这些子问题的解变成原问题的解。...原创 2020-05-26 18:15:38 · 602 阅读 · 0 评论 -
算法时间复杂度符号
O(大O):表示小于等于o(小o):表示小于Ω(大欧米嘎):大于等于ω(小欧米嘎):大于Θ:等于转载 2020-05-26 18:16:47 · 544 阅读 · 0 评论 -
最基础排序算法—归并排序
归并排序算法完全遵循分治模式。直观上操作如下;分解: 分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决: 使用归并排序递归的排序两个子序列合并: 合并两个已排序的子序列来产生已排序的答案当待排序的序列长度为1,递归开始回升,不需要做处理,长度为1的序列都是排好序的。归并排序算法的关键点在于“合并”步骤中两个已排序序列的合并,通过调用一个辅助的函数来合并。merge(A,p,q,r)A是一个数组,p,q,r是数组的下标。该过程假设子数组A(p,,,q)和A(q+1,,,,r原创 2020-05-26 17:57:00 · 277 阅读 · 0 评论 -
顺序查找和蛮力字符串匹配
这一篇文章考虑的是蛮力法在查找问题上的应用顺序查找源程序如下:#include<stdio.h>int a[100];int k;int num;int sequentialsearch(int a[100],int k){ int i; a[num]=k; i=0; while(a[i]!=k) { i++; } if(i<num) return i; else return -1;}int main(){ int i,j; in原创 2020-05-20 17:12:44 · 325 阅读 · 0 评论 -
最“笨”的方法—蛮力法
就像宝剑不是撬棍一样,科学也很少使用蛮力。——爱德华.利顿蛮力法的简单描述:它是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。这里的“力”指的是计算机的计算能力,一般来说,蛮力策略也是最容易应用的方法。虽然巧妙和高效的算法很少来自于蛮力法,但是不应该忽略它作为一种更重要的算法策略的地位。和其他策略不同,我们可以应用蛮力法解决广阔领域的各种问题。对于一些重要的问题,例如,排序,查找,字符串匹配,蛮力法可以产生一些合理的算法,而且不必限制实例的规模。如果要解决的原创 2020-05-20 16:21:25 · 492 阅读 · 0 评论 -
最基础排序方法—选择排序和冒泡排序
1原创 2020-05-20 16:08:19 · 202 阅读 · 0 评论