数据结构与算法
灰太狼1号
C++,Java,数字图像处理,数据结构与算法,机器学习
展开
-
0009算法笔记——【动态规划】动态规划与斐波那契数列问题,最短路径问题
1、动态规划算法: 动态规划:通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。 基本思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的转载 2013-10-30 17:49:05 · 1369 阅读 · 0 评论 -
0007算法笔记——【分治法】最接近点对问题
问题场景:在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。 问题描述:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的转载 2013-10-30 17:48:30 · 1630 阅读 · 0 评论 -
0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
1、分治法分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的解。 分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3) 利用该问题分解出转载 2013-10-30 17:47:24 · 791 阅读 · 0 评论 -
0011算法笔记——【动态规划】最长公共子序列问题(LCS)
问题描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X= { x1, x2,…, xm},则另一序列Z= {z1, z2,…, zk}是X的子序列是指存在一个严格递增的下标序列 {i1, i2,…, ik},使得对于所有j=1,2,…,k有 Xij=Zj。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标转载 2013-10-30 17:49:38 · 1068 阅读 · 0 评论 -
0010算法笔记——【动态规划】矩阵连乘问题
问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。 问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一转载 2013-10-30 17:49:22 · 1474 阅读 · 0 评论 -
0008算法笔记——【分治法】循环赛事日程表
问题描述: 设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。 请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行,第j列处填入第i个选手在第j天所遇到的选手。其中1转载 2013-10-30 17:48:49 · 1012 阅读 · 0 评论 -
0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
递归的概念想必大家都清楚,概念神马的直接略过。这里介绍递归相关的几个问题。 1、排列问题 设R={r1,r2,...,rn}是要进行排列的n个元素,Ri=R-{ri}。集合x中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列。R的全排列可归纳如下: 当n=1时,Perm(R)=(r),其中r是集合中唯转载 2013-10-30 17:47:04 · 846 阅读 · 0 评论 -
0006算法笔记——【分治法】线性时间选择
线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。 1、随机划分线性选择 线性时间选择随机划分法可以模仿随机化快速排序算法设计。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。 程序清单如下:[cpp] vi转载 2013-10-30 17:48:15 · 2147 阅读 · 1 评论 -
0005算法笔记——【分治法】快速排序
1、未优化的快速排序 快速排序的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 程序清单如下:[cpp] view plaincopyprint?//2d8-1 未优化的快速排序转载 2013-10-30 17:47:57 · 579 阅读 · 0 评论 -
0004算法笔记——【分治法】合并排序
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,合并排序也叫归并排序。转载 2013-10-30 17:47:44 · 931 阅读 · 0 评论 -
0001算法笔记——NP完全理论
说来遗憾,在CSDN这么久,一直都是转载和收藏同行精英门写的好文章。这也许就是自己编程水平久久上不去的原因吧,是该改改东一榔头西一棒子的坏习惯了。耶稣说的对,“好记性不如烂笔头”,哥从现在开始要写原创文章了。这篇文章作为算法学习笔记开篇,本人学习算法是看的王晓东的《计算机算法设计与分析》。一开始是买了本《算法导论》,书到的时候翻了翻,砖头啊,那个难度恐怕乔帮主在世也未必能琢磨得透吧。还是看国产的书转载 2013-10-30 17:46:21 · 771 阅读 · 0 评论 -
0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题
1、蒙特卡罗算法 基本概述 蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。 在实际应用中常会遇到一些问题,不论采用确定性算法或随机化算法都无法保证每次都能得到正确的解答。蒙特卡罗转载 2013-10-29 18:08:32 · 1392 阅读 · 0 评论 -
0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题
问题描述 如果用有序链表来表示一个含有n个元素的有序集S,则在最坏情况下,搜索S中一个元素需要O(n)计算时间。提高有序链表效率的一个技巧是在有序链表的部分结点处增设附加指针以提高其搜索性能。在增设附加指针的有序链表中搜索一个元素时,可借助于附加指针跳过链表中若干结点,加快搜索速度。这种增加了向前附加指针的有序链表称为跳跃表。 应在跳跃表的哪些结点增加附加指针以及在该结转载 2013-10-29 18:06:44 · 1396 阅读 · 0 评论 -
0042算法笔记——【随机化算法】计算π值和计算定积分
1、计算π值 问题描述 设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为 。所以当n足够大时,k与n之比就逼近这一概率。从而。 程序具体代码如下:[cpp] view plaincopyprint?//随机化算转载 2013-10-29 18:02:38 · 3891 阅读 · 0 评论 -
0031算法笔记——【回溯法】旅行员售货问题和圆排列问题
1、旅行员售货问题 问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。 问题分析 旅行售货员问题的解空间是一棵排列树。对于排列树的回溯法与生成1,2,……n的所有排列的递归算法Perm类似。开始时x=[1,2,……n],则相应的排转载 2013-10-27 12:11:49 · 1558 阅读 · 0 评论 -
0014算法笔记——【动态规划】凸多边形最优三角剖分
1、问题相关定义: (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。 凸多边形三角剖分如下图所示: 2、最优子结构性质: 若凸(n+1)边形P={V转载 2013-10-28 21:49:34 · 1155 阅读 · 0 评论 -
红黑树 操作
插入节点:#include #include using namespace std; static int _rb_black_node = 0; static int _rb_red_node = 1; template struct RBNode { RBNode():left(NULL),right(NULL),parent(NULL),原创 2016-11-23 11:26:22 · 493 阅读 · 0 评论 -
平衡查找树之B树
维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度运行进行查找、顺序读取、插入和删除的数据结构。B树,概括来说是一个节点可以拥有多于2个子节点的二叉查找树。与自平衡二叉查找树不同,B-树为系统最优化大块数据的读和写操作。B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度。普遍运用在数据库和文转载 2016-11-14 12:44:58 · 459 阅读 · 0 评论 -
平衡查找树之红黑树
定义红黑树的主要是像是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息。红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个3-nodes节点。黑色链接用来链接普通的2-3节点。特别的,使用红色链接的两个2-nodes来表示一个3-nodes节点,并且向左倾斜,即一个2-node是另一个2-node的左子节点。这种做法的转载 2016-11-14 12:33:32 · 484 阅读 · 0 评论 -
二叉查找树
一 定义二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 任意节点的左、右子树也转载 2016-11-14 12:29:59 · 306 阅读 · 0 评论 -
平衡查找树之2-3树
前面介绍了二叉查找树(Binary Search Tree),他对于大多数情况下的查找和插入在效率上来说是没有问题的,但是他在最差的情况下效率比较低。本文及后面文章介绍的平衡查找树的数据结构能够保证在最差的情况下也能达到lgN的效率,要实现这一目标我们需要保证树在插入完成之后始终保持平衡状态,这就是平衡查找树(Balanced Search Tree)。在一棵具有N 个节点的树中,我们希望该树转载 2016-11-14 11:34:35 · 534 阅读 · 0 评论 -
最长公共子串问题的后缀数组解法
[最长公共子串]最长公共子串(Longest Common Substring ,简称LCS)问题,是指求给定的一组字符串长度最大的共有的子串的问题。例如字符串”abcb”,”bca”,”acbc”的LCS就是”bc”。求多串的LCS,显然穷举法是极端低效的算法。改进一些的算法是用一个串的每个后缀对其他所有串进行部分匹配,用KMP算法,时间复杂度为O(N*L^2),其中N为字符串个转载 2014-09-10 08:46:52 · 1008 阅读 · 0 评论 -
0012算法笔记——【动态规划】最长公共子串问题
1、问题相关定义: (1)字符串:一个字符串S是将n 个字符顺次排列形成的数组, n称为S的长度,表示为len(S) 。S的第i字符表示为S[ i ]。 (2)子串:字符串S的子串S[ i:j ] ( i ≤ j)表示S串中从i到j这一段,也就是排列S[ i ] , S[ i + 1 ] , ⋯,S[ j ] 形成的字符串。 (3)后缀:后缀是转载 2013-11-02 18:52:31 · 826 阅读 · 0 评论 -
动态规划的优化
动态规划的优化动态规划算法的优化技巧 福州第三中学 毛子青[关键词] 动态规划、 时间复杂度、优化、状态[摘要] 动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。转载 2014-01-05 20:03:02 · 911 阅读 · 0 评论 -
大数求余
#include using namespace std;int main(){ long b,p,k,result=1; cout<<"请输入底数 : "<<endl; cin>>b; cout<<"请输入指数 : "<<endl; cin>>p; cout<<"请输入余数 : "<<endl; cin>>k; long array[64]; long t=p;原创 2013-11-26 16:51:17 · 715 阅读 · 0 评论 -
种树问题
//N 为最多街道长度300 H最多居民数 50#include#include#includeusing namespace std;typedef vector::iterator v_it;typedef vector >::iterator vv_it;int totalT(int IsPlant[],int l,int r){ int t=0; for(int原创 2013-11-26 16:48:21 · 855 阅读 · 0 评论 -
八皇后问题 回溯法
八皇后:西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程序设计的结构性编程技巧。在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上解法:关于棋盘的问题,都可以用递回求解,然而如何减少递回的原创 2013-11-25 20:11:35 · 769 阅读 · 0 评论 -
河内塔(单色和双色)
双色河内塔是由之前所介绍过的河内塔规则衍生而来,双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置: 方法:每次移动n-2个,然后确定最后2个的位置 #includeusing namespace std;void move(int n,char a,char b,char c){ if(n==1) { cout"<<c<<endl; cout原创 2013-11-24 18:18:22 · 1092 阅读 · 0 评论 -
三色旗问题
三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数人会则使用Three-Color Flag来称之。假设有一条绳子,上面有蓝、白、红三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。原创 2013-11-24 17:00:13 · 1002 阅读 · 0 评论 -
0032算法笔记——【回溯法】电路板排列问题和连续邮资问题
1、电路板排列问题 问题描述 将n块电路板以最佳排列方式插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。设B={1, 2, …, n}是n块电路板的集合,L={N1, N2, …, Nm}是连接这n块电路板中若干电路板的m个连接块。Ni是B的一个子集,且Ni中的电路板用同一条导线连接在一起。设x表示n块电路板的一个排列,即在机箱的第i个插槽中转载 2013-11-02 18:49:39 · 1800 阅读 · 0 评论 -
0038算法笔记——【分支限界法】旅行员售货问题
问题描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。 算法思路 旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在图G中找出费用最小的周游路线。路线是一个带权图。图中各边的费用转载 2013-10-29 17:58:55 · 2127 阅读 · 0 评论 -
0037算法笔记——【分支限界法】最大团问题
问题描述 给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点转载 2013-10-29 17:58:10 · 4122 阅读 · 0 评论 -
0024算法笔记——【贪心算法】单源最短路径问题
1、问题描述 给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。 2、Dijkstra算法 Dijkstra算法是解单源最短路径问题的贪心算法。 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充转载 2013-10-28 21:31:31 · 1075 阅读 · 0 评论 -
0029算法笔记——【回溯法】n后问题和0-1背包问题
1、n后问题 问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。 问题解析:用n元数组x[1:n]表示n后问题的解。其中,x[i]表示皇后i放在棋盘的第i行的第x[i]列。由于不允许将2个皇转载 2013-10-28 21:24:14 · 812 阅读 · 0 评论 -
0017算法笔记——【动态规划】电路布线问题
1、问题描述: 在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i)) 将上端接线柱i与下端接线柱π(i)相连,如下图。其中,π(i),1≤ i ≤n,是{1,2,…,n}的一个排列。导线(I, π(i))称为该电路板上的第i条连线。对于任何1 ≤ i ≤ j ≤n,第i条连线和第j条连线相交的充要条件是π(i)> π(j).π(i)={8,7转载 2013-10-28 21:44:54 · 1548 阅读 · 0 评论 -
0018算法笔记——【动态规划】流水作业调度问题与Johnson法则
1、问题描述: n个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的最优加工顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。 2、问题分析 直观转载 2013-10-28 21:42:41 · 4106 阅读 · 0 评论 -
0019算法笔记——【动态规划】0-1背包问题
1、问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问:应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 形式化描述:给定c >0, wi >0, vi >0 , 1≤i≤n.要求找一n元向量(x1,x2,…,xn,), xi∈{0,1}, ∋ ∑ wi xi≤c,且∑ vi xi达最大.即一个特殊的整数规划问题。转载 2013-10-28 21:40:46 · 1533 阅读 · 0 评论 -
0021算法笔记——【贪心算法】贪心算法与活动安排问题
1、贪心算法 (1)原理:在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。 (2)特性:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模转载 2013-10-28 21:37:48 · 1503 阅读 · 0 评论 -
0022算法笔记——【贪心算法】背包问题,最优装载问题
1、背包问题 (1)0-1背包问题:给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 注:在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。 0-1背包问题可用动态规划算法来求解,具体过程可参看笔者转载 2013-10-28 21:34:45 · 2167 阅读 · 0 评论 -
0023算法笔记——【贪心算法】哈夫曼编码问题
1、问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。一个包含100,000个字符的文件,各字符出现频率不同,如下表所示。 有多种方式表示文件中的信息,若用0,1码表示字符的方法,即每个字符用唯一的一个0,1串表示。若采用定转载 2013-10-28 21:32:49 · 1167 阅读 · 0 评论