======Algorithms======
文章平均质量分 69
gaoxiangnumber1
热爱技术,热爱分享。
展开
-
Permutation_Subset
Please indicate the source if you want to reprint: http://blog.csdn.net/gaoxiangnumber1. Permutation 设R = {r1, r2, … , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为 Permutation(X), (ri)Permutation(X)表示在原创 2015-11-03 00:25:02 · 288 阅读 · 0 评论 -
线段树
View Code CPP ?【完全版】线段树2011/07/25, 12:54很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队转载 2015-03-04 23:51:19 · 393 阅读 · 0 评论 -
最大连续和算法分析
1. 描述:给出一个长度为N的序列:a1,a2,……,an,求最大连续和。找到1=2. 算法一:先求出所有的和S[1],S[2],……,ai+a(i+1)+……+aj=S[J]-S[I-1].代码:s[0]=0;int best=a[1];for(int i=1;i{ s[i]=s[i-1]+a[i];}for(int i=1原创 2015-03-06 17:29:09 · 586 阅读 · 0 评论 -
动态规划算法:硬币问题
1. 问题描述:n种硬币,面值分别是:v[1],v[2],……v[n]。给定非负整数s,可以选用多少个硬币,使得面值之和恰好为s?求出硬币数目的最大值和最小值。2. 分析:初始状态为:S,目标状态为0。若当前状态在i,每使用一个硬币j,状态便转移到i-v[j]。我们用d(i)表示求总和为i的最少硬币数量(其实就是动态规划中的“状态”),那么怎么从前面的状态(并不原创 2015-03-13 15:37:23 · 991 阅读 · 0 评论 -
八数码路径寻找算法
1. 使用全排列的编码/解码(最高效)代码:#include#includeusing namespace std; typedef int State[9]; //State相当于 int [9]const int MAXSTATE = 1000000;// 最多的状态数目State st[MAXSTATE], goal; //st相当于intst[原创 2015-03-04 23:50:25 · 664 阅读 · 0 评论 -
归并排序算法
1. 算法概述:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。2. 过程分析:其操作的步骤如下:Divide:把n个元素的序列分为两个元素个数为n/2的子序列。Conquer:递归的调用归并原创 2015-03-06 23:23:34 · 484 阅读 · 0 评论 -
算法分析渐进符号(O、o、Θ、Ω、ω)总结
用“渐近记号”来表示“渐近复杂度”。1. 渐近记号包括:(1)Θ(西塔):紧确界。 相当于"="(2)O (大欧):上界。 相当于"(3)o(小欧):非紧的上界。 相当于"(4)Ω(大欧米伽):下界。 相当于">="(5)ω(小欧米伽):非紧的下界。 相当于">"给出这些记号的定义:原创 2015-04-15 23:40:41 · 19629 阅读 · 0 评论 -
全排列算法
1. 递归生成1—n的全排列示例程序:#includeusing namespacestd; void print(intn,int *A,int cur); int main(){ int num; while(cin>>num) { int A[30]; print(num,A,0);原创 2015-03-01 23:48:08 · 338 阅读 · 0 评论 -
埃及分数:IDA星算法
埃及分数问题:将一个分数(非单位分数:单位分数是分子是1,分母是自然数)分解成若干个单位分数的和,输出最优的分解方案。首先:分解的项数少的比多的好,项数相同,最小的分数最大的最好。注意不准出现重复项思路解析:理论上可以用回溯法求解,但是解答树没有明显的深度上限,而且项数在理论上是无限的。如果用宽搜,连一层都扩展不完,因为每一层都是无限大的。对于:可以用回溯法求解但是解答树的深度原创 2015-03-04 23:49:01 · 1268 阅读 · 0 评论 -
动态规划算法:嵌套矩形
描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a输入第一行是一个正整数N(0输出每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行样例输入1101 22 45 86 107 93 15 812 109 72 2样例输出5方法一:先按原创 2015-03-13 12:57:37 · 1199 阅读 · 0 评论 -
二分搜索
1. 思想:算法采用分治思想,二分查找从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。2. 输入:查找表必须为有序状态(递增排列或递减排列),本文使用的表中数据是递增的。3. 注意:查找表为数组形式(内存连续)的数据原创 2015-03-01 23:51:21 · 426 阅读 · 0 评论 -
选择排序算法
直接选择排序将数据分为有序区和无序区,从无序区选一个最小的元素直接放到有序区的最后。设数组为a[0…n-1]。1. 初始时,数组全为无序区为a[0..n-1]。令i=0 2. 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。3. i++并重复第二步直到i==n-1。排序完成。 示原创 2015-03-08 00:14:35 · 326 阅读 · 0 评论 -
子集生成算法
方法一:增量构造法 一次选出一个元素放到集合中示例程序:#includeusing namespacestd; void print(intn,int *A,int cur); int main(){ int A[90]; print(5,A,0); return 0;} void print(intn原创 2015-03-01 23:49:53 · 521 阅读 · 0 评论 -
模运算
基本的模运算公式:(a + b) % p = (a % p + b % p) % p (a - b) % p = (a % p - b % p) % p(a * b) % p = (a % p * b % p) % pa ^ b % p = ((a % p)^b) % p a^b% m = (...((a % m) * a) % m) ......* a) % m其中a原创 2015-03-01 23:46:52 · 885 阅读 · 0 评论 -
快速幂
以下以求a的b次方来介绍把b转换成二进制数。该二进制数第i位的权为例如,11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1因此,我们将a¹¹转化为算代码实现:int pow(int a,int b){ int result=1; int base=a; while(b!=0) { if(b&原创 2015-03-01 23:46:17 · 383 阅读 · 0 评论 -
Bubble_Sort & Select_Sort
Please indicate the source if you want to reprint: http://blog.csdn.net/gaoxiangnumber1. Bubble Sort: O(n2) 以从小到大排序举例:设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一原创 2015-11-04 00:33:47 · 278 阅读 · 0 评论 -
计数排序算法
1. The precondition and The scope of applicationCounting sort assumes that each of the n inputelements is an integer in the range[0,k], for some integer k.2. Algorithm thoughtCount原创 2015-04-25 00:19:20 · 482 阅读 · 0 评论 -
二分搜索算法
1. 算法思想:分治,从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。2. 前提条件:1) 查找表必须为有序状态(递增排列或递减排列),本文使用的表中数据是递增的。2) 查找表为数组形式(内存连续)原创 2015-04-16 23:18:29 · 622 阅读 · 0 评论 -
递归与递推
1. 递归的算法思想:1) 原问题可分解子问题(必要条件);2) 原问题与分解后的子问题相似(递归方程);3) 分解次数有限(子问题有穷);4) 最终问题可直接解决(递归边界);2. 对于递归的应用与优化:直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出。优化递归就是以不做重复的事儿为原则原创 2015-04-16 23:12:46 · 509 阅读 · 0 评论 -
求最大连续子序列和4种算法解析
1. 题目描述:给出一个长度为N的序列:a1,a2,……,an,求最大连续和。找到1=2. 算法11) 思路解析:枚举所有可能的子序列的和,通过三重循环每次求出一个数组下标范围为[index1, index2]的子序列的和,每次求出和后进行判断,更新最大值。2) 时间复杂度O(N^3);空间复杂度O(1)代码:void原创 2015-04-16 23:29:34 · 6850 阅读 · 0 评论 -
稀疏矩阵(三元组顺序表存储)6种操作的实现
/* 数据结构分析与学习专栏* Copyright (c) 2015, 山东大学 计算机科学与技术专业 学生* All rights reserved.* 作 者: 高祥* 完成日期: 2015 年 4 月 9 日* 版 本 号:015*任务描述:针对稀疏矩阵,实现10个基本操作* 1:建立稀疏矩阵 ;* 2:输出稀疏矩阵 ;*原创 2015-04-09 23:29:51 · 9081 阅读 · 1 评论 -
欧几里得算法求最大公约数
1. 算法思路:源自欧几里得的辗转相除法。设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除r2,……如此下去,直到能整除为止。其最后一个非零除数即为(原创 2015-04-16 23:29:30 · 1749 阅读 · 0 评论 -
快速幂算法
1. 递归版:int RecursiveQuickPow(int base,int expo){ if(expo==0) { return 1;} if(expo%2) { return RecursiveQuickPow(base*base,expo/2)*base;} return Recursive原创 2015-04-16 23:16:08 · 425 阅读 · 0 评论 -
素数筛法
根据素数的性质,有这样的定理:1、设 n 是一个正合数,p 是 n 的一个大于1的最小正因数,则 p 一定是素数。2、设 n 是一个正整数,如果对所有的素数 p ≤ √n,都有 p 不整除 n,则 n 一定是素数。1. 原始版本原理:先把n个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没原创 2015-03-01 23:48:21 · 672 阅读 · 0 评论 -
动态规划算法:数字三角形问题
问题描述:有一个有非负整数组成的三角形,第一行只有一个数,除了最下行之外的每个数的左下方和右下方各有一个数。如下图:从第一行的数字开始每次可以向左走或者向右走,直到走到最下行,把沿途经过的所有数字全部加起来,如何走才能使这个和最大?1. 回溯法:可以求出所有的路线,然后从所有的路线中选择最好的,但是效率太低。2. 动态规划:1)原创 2015-03-12 21:26:48 · 1380 阅读 · 0 评论 -
回溯算法
使用回溯算法解决N皇后问题.1. 问题描述:棋盘为N*N的,在该棋盘上放置N个皇后,使得任意两个皇后不在同一行或者同一列或者同一对角线(主对角线和副对角线)。2. 解题思路:分析得:必定使得棋盘的每一行每一列均存在且只存在一个皇后,所以遍历所有的行,对每一行,遍历所有的列,使用判断条件排除。3. 原始程序:#includeusi原创 2015-03-01 23:45:07 · 355 阅读 · 0 评论 -
背包问题
背包问题九讲 2.0 alpha1崔添翼 (Tianyi Cui, a.k.a. dd_engi)September 15, 2011本文题为《背包问题九讲》,从属于《动态规划的思考艺术》系列。这系列文章的第一版于2007年下半年使用EmacsMuse制作,以HTML格式发布到网上,转载众多,有一定影响力。2011年9月,本系列文章由原作者用LATEX重新制作并全面修订,您转载 2015-03-04 23:52:38 · 401 阅读 · 0 评论 -
快速排序算法
1. 算法概述:快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1) 先从数列中取出一个数作为基准数。2) 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3) 再对左原创 2015-03-07 11:06:32 · 439 阅读 · 0 评论 -
算法时间复杂度与空间复杂度分析
时间复杂度:一、时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。二、推导大O阶:1. 用常数1取代运行时间中的所有加法常数2. 在修改后的运行次数函数中,只保留最高阶项。3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数原创 2015-03-11 14:00:51 · 774 阅读 · 0 评论 -
顺序栈10种操作的实现
操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)得到长度O(1) O(1)得到栈顶元素O(1)O(1) 压入元素O(1) O(1)不需要开辟新内存或者开辟为常量的内存原创 2015-04-04 00:13:15 · 629 阅读 · 0 评论 -
链式栈10种操作的实现
操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)得到长度O(n) O(1)得到栈顶元素O(1)O(1) 压入元素O(1) O(1) 弹出元素原创 2015-04-04 00:12:53 · 641 阅读 · 0 评论 -
数据结构概述
1. 定义数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:Data_Structure=(D,R)其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。2. 研究对象1) 数据的逻辑结构指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后关系,而与他们在原创 2015-03-22 20:17:32 · 573 阅读 · 0 评论 -
将两个有序链表合并成一个有序链表
问题定义: 写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。比如:这里有两个链表,分别是list1: 5->10->15list2: 2->3->20Sort转载 2015-03-22 13:15:59 · 761 阅读 · 0 评论 -
线性表概述
1. 结构线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。一般地,一个线性表可以表示成一个线性序列:k1,k2,…,kn,其中k1是开始结点,kn是终端结点。2. 特征1) 集合中必存原创 2015-03-22 21:42:14 · 508 阅读 · 0 评论 -
单链表模拟一元多项式加减乘运算
第一个多项式有n项,第二个多项式有m项。以下均为最坏的情况。操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)得到长度O(n)O(1)求和O(n+m)O(1)求差O(原创 2015-03-28 22:30:51 · 1915 阅读 · 0 评论 -
线性表链式存储(双向循环链表)及其14种操作的实现
操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)得到长度O(n)O(1)转置链表O(n)O(1)得到指定下标的元素O(n)O(1)得到指定元素的下标原创 2015-03-27 00:22:06 · 972 阅读 · 0 评论 -
单链表插入删除元素时间复杂度探究
单链表相比数组的优势在于插入删除元素快,不需要移动大量的元素,只需要改变指针的指向,那么插入删除操作的时间复杂度应该是O(1),但是这是不对的,应该分情况讨论。单链表结构体声明:typedefstruct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;1. O(n)的情况:1)原创 2015-03-26 00:50:07 · 25566 阅读 · 0 评论 -
线性表顺序存储(数组)及其15种操作的实现
该表格中的所有复杂度均指的是当前程序中算法的复杂度,同一个操作算法不同复杂度不同。对于空间复杂度:没有程序的空间复杂度为0,任何程序的运行必须要空间。当所需的空间是常数的,就是O(1);是线性的,就是O(n),以此类推。操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)原创 2015-03-26 00:46:43 · 770 阅读 · 0 评论 -
链表概述
1. 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域(data),另一个是存储下一个结点地址的指针域(next)。┌───┬───┐│data │next │└───┴───┘data原创 2015-03-26 00:46:34 · 639 阅读 · 0 评论 -
线性表链式存储(单链表)及其15种操作的实现
该表格中的所有复杂度均指的是当前程序中算法的复杂度,同一个操作算法不同复杂度不同。对于空间复杂度:没有程序的空间复杂度为0,任何程序的运行必须要空间。当所需的空间是常数的,就是O(1);是线性的,就是O(n),以此类推。操作时间复杂度(T(n))空间复杂度(S(n))判断是否为空O(1)O(1)原创 2015-03-26 00:44:51 · 1119 阅读 · 0 评论