经典算法及分析
经典算法及分析
~青萍之末~
弱者总有弱者的理由
展开
-
最优化算法之粒子群算法(PSO)
一、粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制...原创 2018-08-03 10:26:45 · 447681 阅读 · 100 评论 -
最优化算法之模拟退火算法(SA)
一、爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动...原创 2018-08-03 09:55:01 · 53089 阅读 · 9 评论 -
教你彻底学会动态规划——进阶篇
在我的上一篇文章中已经详细讲解了动态规划的原理和如何使用动态规划解题。本篇文章,我将继续通过例子来让大家更加熟练地使用动态规划算法。 话不多说,来看如下例题,也是在动态规划里面遇到过的最频繁的一个题,本题依然来自于北大POJ: &nbs...转载 2018-06-22 22:01:43 · 545 阅读 · 0 评论 -
教你彻底学会动态规划——入门篇
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从...转载 2018-06-22 22:00:53 · 2859 阅读 · 2 评论 -
经典算法总结
一、递归1、基本思想 递归算法将一个不好解决的大问题转化为若干小问题,再把这些小问题进一步分解为更小的小问题,直至每个小问题可以直接解决为止。【Note】: (1)递归体:使问题向边界条件转化的过程; (2)边界条件:程序终止的条件,也称为递归出口。2、应用 示例:阶乘、斐波纳契数列、汉诺塔问题。二、分治1、基本思想 待解决复杂的问题能够简化为几个若干个小...转载 2018-06-21 20:59:24 · 379 阅读 · 0 评论 -
经典算法之动态规划(Dynamic Programming)
1、动态规划的定义 动态规划,dynamic Programming,是一种高效解决问题的方法,使用与具有重复子问题和最优子结构的问题。2、动态规划的思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这...原创 2018-06-21 20:40:45 · 2829 阅读 · 0 评论 -
经典算法之分治(Divide)
1、分治的定义 分治即分而治之。分治算法就是把一个大的问题分为若干个子问题,然后在子问题继续向下分,一直到base cases,通过base cases的解决,一步步向上,最终解决最初的大问题。分治算法是递归的典型应用。 2、分治的思想分治法的设计思想是: 1. 分–将问题分解为规模更小的子问题; 2. 治–将这些规模更小的子问题逐个击破; 3. 合–将已解决的子问题合并...原创 2018-06-21 20:14:04 · 1724 阅读 · 0 评论 -
经典算法之回溯(BackTracking)
1、回溯的定义 回溯算法的定义:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。一个典型的应用是走迷宫问题,当我们走一个迷宫时,如果无路可走了,那么我们就可以退一步,再在其他的路上尝试一步,如果还是无路可走,那么就再退一步,尝试新的路,直到走到终点或者退回到原点。2、回溯的思想 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 1. 定义一个...原创 2018-06-18 16:59:55 · 1569 阅读 · 0 评论 -
经典算法之贪心(Greedy)
1、贪心的定义 贪心算法是什么意思?举个例子就很清楚了:现在你有一个能装4斤苹果的袋子,苹果有两种,一种3斤一个,一种2斤一个,怎么装才能得到最多苹果?当然我们人考虑的话当然是拿两个2斤的苹果,就刚好装满了,但是如果按贪心算法拿的话,首先就要把最重的苹果拿下(是不是很符合贪心两个字?),但并没有得到最多苹果。 贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最...原创 2018-06-18 16:26:44 · 8994 阅读 · 0 评论 -
经典算法之递归(Recursion)
1、递归的定义 递归:你打开面前这扇门,看到屋里面还有一扇门(这门可能跟前面打开的门一样大小(静),也可能门小了些(动)),你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开,。。。, 若干次之后,你打开面前一扇门,发现只有一间屋子,没有门了。 你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这钥匙开了几扇门。 循环:你打开面前...原创 2018-06-18 16:06:50 · 6859 阅读 · 0 评论 -
双指针法及其应用
一、双指针法简介 所谓双指针,指的是在遍历对象的过程中,不是普通的使用单个指针(索引、游标、指针或可迭代对象皆可)进行访问,而是使用两个相同方向或者相反方向的指针进行扫描,从而达到相应的目的。 换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。二、双指针法的应用(1)和为sum的两个数#include <iostream>#incl...原创 2018-06-17 20:07:45 · 976 阅读 · 0 评论 -
字符串算法之Manacher(最长回文子串)
一、背景 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个。 计算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,显然无法令人满意,稍微优化的一个算法是枚举回文...转载 2018-06-17 16:50:16 · 1029 阅读 · 0 评论 -
字符串算法之KMP(字符串匹配)
一、背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题。 Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常用算法之一,这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终三人于1977年联合发表。 在继...转载 2018-06-17 16:15:34 · 23588 阅读 · 9 评论 -
查找算法之哈希查找
哈希也称散列,哈希表是一种与数组、链表等不同的数据结构,与他们需要不断的遍历比较来查找的办法,哈希表设计了一个映射关系f(key)= address,根据key来计算存储地址address,这样可以1次查找,f既是存储数据过程中用来指引数据存储到什么位置的函数,也是将来查找这个位置的算法,叫做哈希算法。1、相关名词 1. 桶:哈希表中存储数据的位置,每一个位置对应唯一的一个地址,桶就好...原创 2018-06-11 21:04:22 · 7537 阅读 · 1 评论 -
查找算法之二分查找
如果要查找的数据已经事先排序好了,则可以使用二分查找法来进行查找。1、算法描述 二分查找法是将数据分割成两等份,再比较键值与中间值的大小,如果键值小于中间值,可确定要查找的数据在前半段,如果键值大于中间值,可确定要查找的数据在后半段。2、算法图解3、算法demo#include <bits/stdc++.h>using namespace std;...原创 2018-06-11 20:13:29 · 277 阅读 · 0 评论 -
排序算法总结
1、算法分类 常见排序算法可以分为两大类: 1. 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 2. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。 2、算法复杂度3、相关概念稳定:如果a原本在...转载 2018-06-11 19:59:01 · 237 阅读 · 0 评论 -
排序算法之桶排序和基数排序
一、桶排序 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。 假设你有五百万份试卷,每份试卷的满分都是100分,如果要你对这些试卷按照分数进行排序,天噜啦,五百万份试...原创 2018-06-11 19:43:25 · 2178 阅读 · 0 评论 -
排序算法之堆排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。1、算法描述 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 1. i =L; j = R; 将基准数挖出形成第一个坑a[i]; 2. j–由后向前找比它小的数,找到...原创 2018-06-11 09:30:42 · 238 阅读 · 0 评论 -
排序算法之快速排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。1、算法描述 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 1. i =L; j = R; 将基准数挖出形成第一个坑a[i]; 2. j–由后向前找比它小的数,找到...原创 2018-06-11 09:30:09 · 317 阅读 · 0 评论 -
排序算法之归并排序和外部排序
一、归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。1、算法描述 1. 把长度为n的输入序列分成两个长度为n/2的子序列; 2. 对这两个子序列分别采...原创 2018-06-11 09:29:12 · 6019 阅读 · 1 评论 -
排序算法之插入排序和希尔排序
一、插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。1、算法描述 1. 从第一个元素开始,该元素可以认为已经被排序; 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描; 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置; ...原创 2018-06-11 09:28:41 · 215 阅读 · 0 评论 -
排序算法之冒泡排序和选择排序
一、冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1、算法描述 1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 2. 对每一对相邻元素作同样的工作,...原创 2018-06-07 20:43:28 · 393 阅读 · 0 评论