算法
xiaoxieqingfa
Primary Coder
展开
-
如何判断单链表里面是否有环【转载】
这题目还是慢有意思的。题目:0.如何判断单链表里面是否有环?算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。这里主要理解一个问题,就是为什么当单链表存在环时,p和q一定会相遇呢?假定单链表的长度为n,并且该单链表是环状的,那么第i次迭代时,p指向元素i mod n,q指向2i转载 2012-08-17 21:29:55 · 185 阅读 · 0 评论 -
递归求全排列算法 8种算法 调试通过
数据结构课老师提出用递归方法求排列,要求只有一个循环语句,迷糊中,遂驾驭百度,得一篇宝文,摘记于此原博客地址:http://course.zjnu.cn/quyt/bbs/ftbbs.asp?id=115 感谢作者详尽的描述。另外由于近期使用C#,目标是尽快将例子中的C++程序改成C#全排列的生成算法全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗转载 2012-08-17 20:22:58 · 163 阅读 · 0 评论 -
分而治之算法--查找第K值(快速排序)
// find an element by rank#ifndef select_#define select_#include "indexOfMax.h"#include "myExceptions.h"using namespace std;template T select(T a[], int n, int k){// Return k'th smallest e原创 2012-08-01 17:21:59 · 935 阅读 · 0 评论 -
分而治之算法--归并排序
// iterative merge sort #ifndef mergeSort_#define mergeSort_using namespace std;template void mergeSort(T a[], int n){// Sort a[0 : n - 1] using the merge sort method. T *b = new T [n];原创 2012-08-01 15:33:19 · 173 阅读 · 0 评论 -
分而治之算法--覆盖残缺棋盘(递归)
// tile a defective chessboard #include #include #include "make2dArrayNoCatch.h"using namespace std;// global variablesint **board; // the chessboardint tile; // current tile to原创 2012-08-01 11:19:47 · 239 阅读 · 0 评论 -
贪婪算法--Kruskal算法(最小生成树)c++
templatebool UNetwork::Kruskal(EdgeNode t[]){ // 使用K r u s k a l算法寻找最小耗费生成树// 如果不连通则返回false// 如果连通,则在t [ 0 : n - 2 ]中返回最小生成树 int n = Ve r t i c e s ( ) ; int e = Edges();//设置网络边的数组原创 2012-07-31 17:10:25 · 225 阅读 · 0 评论 -
贪婪算法--Dijkstra算法(单源最短路径)c++
templatevoid AdjacencyWDigraph::ShortestPaths(int s, T d[], int p[]){ // 寻找从顶点 s出发的最短路径, 在d中返回最短距离// 在p中返回前继顶点 if (s n) throw OutOfBounds(); Chain L; // 路径可到达顶点的列表 ChainIterator I;原创 2012-07-31 16:27:21 · 294 阅读 · 0 评论 -
对KMP算法的理解
KMP算法是一种高效的模式匹配算法,复杂度可以达到O(m+n),而普通模式匹配算法的复杂度为O(m*n)。普通模式匹配算法 从主串的第一个字符(或者给定的第pos个字符)开始和子串的第一个字符开始比较,若相等,则继续比较后面的字符。若不相等,则从主串本次开始比较的字符的下一个字符开始,与子串的第一个字符进行比较(即主串需要回退到本次比较开始字符的下一字符,模式串回退到首字符,主串转载 2012-08-17 21:34:08 · 134 阅读 · 0 评论 -
全排列生成算法(一)
对于给定的集合A{a1,a2,...,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)。递归算法这里以A{a,b,c}为例,来说明全排列的生成方法,对于这个集合,其包含3个元素,所有的排列情况有3!=6种,对于每一种排列,其第一个元素有3种选择a,b,c,对于第一个元素为a的排列,其第二个元素有2种选择b,c;第一个元素为b的排列,第二个元素也有2种选择a,c,…转载 2012-08-18 16:33:12 · 368 阅读 · 0 评论 -
两个单向链表第一个公共节点
#include #include using namespace std;/**************************两个单向链表第一个公共节点***************************/typedef struct ListNode{ int data; struct ListNode *next;} ListNode;//创建两个原创 2012-09-24 10:45:35 · 182 阅读 · 0 评论 -
创新工场-字符串排列(按字典序)
#include #include #include using namespace std;//创新工场 字符串全排列(按字典序输出)//例如{a,b} 输出:aa,ab,ba,bb//字符串排列(从小到大)int compare(const void *a,const void *b){ return (*(char*)a-*(char*)b);}void st原创 2012-09-21 10:32:27 · 211 阅读 · 0 评论 -
创新工场-100个人按灯问题
#include using namespace std;//创新工场 100盏灯,100个人,分别编号:1,2,3,4.....//起始灯是灭的,第一个人按1,2,3,4...按灯,第二个2,4,6,8...//第n个按n,2n,3n,4n....//问:最后还剩几盏灯?void func(int aa[],int n){ for(int i=1; i<=n; i++)原创 2012-09-21 11:40:41 · 210 阅读 · 0 评论 -
组合和全排列递归和非递归实现
#include #include #include using namespace std;/*非递归方法,字典序法*/void Swap(char *a,char *b){ char temp=*a; *a=*b; *b=temp;}bool IsSwap(char *str,int start,int end){ for(int i=s原创 2012-09-11 16:07:22 · 421 阅读 · 0 评论 -
求数组最大子序列和
#include #include using namespace std;/*求数组最大子序列和*/bool GreatestSumOfSubArray(int *array,unsigned int length,int &result, unsigned int *begin,unsigned int *end){原创 2012-09-15 11:02:54 · 289 阅读 · 0 评论 -
百度笔试-字符串左移
#include #include using namespace std;/**********************************************************************字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate)比如:ABCDEFG,移3位变DEFGABC,原创 2012-09-28 22:00:42 · 277 阅读 · 0 评论 -
贪婪算法--货箱装船问题c++
// heap implementation of a max priority queue// derives from the ADT maxPriorityQueue#ifndef maxHeap_#define maxHeap_#include "maxPriorityQueue.h"#include "myExceptions.h"#include "changeLeng原创 2012-07-30 11:08:59 · 257 阅读 · 0 评论 -
算法题-大数相乘问题
http://www.cnblogs.com/jason-yang/archive/2012/04/26/2472755.html今天在网上看到一个大数相乘的问题,题目是这样的:输入两个整数,要求输出这两个数的乘积。输入的数字可能超过计算机内整形数据的存储范围。分析:由于数字无法用一个整形变量存储,很自然的想到用字符串来表示一串数字。然后按照乘法的运算规则,用一个乘数的转载 2012-08-13 20:24:21 · 295 阅读 · 0 评论 -
【算法复习二】0-1背包问题总结
一 ,问题描述: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。二,解决方案: 考虑使用dp问题 求解,定义一个递归式 opt[i][v] 表示前i个物品,在背包容量大小为v的情况下,最大的装载量。opt[i][v] = max(转载 2012-07-04 14:41:41 · 222 阅读 · 0 评论 -
【算法复习一】常见的算法策略汇总
一,概述 算法策略和算法是有区别的,它们是算法设计中的两个方面,算法策略是面向问题的,算法是面向实现的; 但二者又是不可分的,首先是通过算法策略才找出解决问题的算法,其次对于用不同算法求解的问题算法策略是自然不同的。二,算法策略 1)递推策略:“递推法”和贪心算法一样也是由当前问题的转载 2012-07-04 11:15:52 · 166 阅读 · 0 评论 -
【算法复习三】算法设计技巧与优化----算法设计技巧之中位数
题目:设计一个高效算法,求两个等长为L的升序序列A和B 的中位数。 例如:S1=(11,13,15,17,19) S2=(2,4,6,8,20) 则S1和S2的中位数是11。1)问题分析1: 简单的算法是将两个升序序列归并排序,然后求其中位数 算转载 2012-07-04 14:49:15 · 290 阅读 · 0 评论 -
【算法复习二】八皇后问题 ---- 回溯
一,问题描述 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 二,分析 采用逐步试探的方式,先从一个方向往前走,能进则进,不能进则退并尝试另外的路径。首先我们来分析一下国际象棋的规则,这些规则能够限制我们的前进,也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足转载 2012-07-04 14:43:39 · 225 阅读 · 0 评论 -
【算法复习二】货郎担(旅行售货商)动态规划
一,问题由来 货郎担问题也叫旅行商问题,即TSP问题(Traveling Salesman Problem),是数学领域中著名问题之一。 二,问题描述 1)货郎担问题提法:有n个城市,用1,2,…,n表示,城i,j之间的距离为dij,有一个货郎从城1出发到其他城市一次且仅一次,最后回到城市1,怎样选择行走路线使总路程最短?转载 2012-07-04 14:42:44 · 573 阅读 · 0 评论 -
【算法复习二】传统基本算法(分治----残缺棋盘问题)
• 问题描述: 残缺棋盘是一个有2k×2k(k≥1)个方格的棋盘,其中恰有一个方格残缺。如图给出k=1时各种可能的残缺棋盘,其中残缺的方格用阴影表示。• 残缺棋盘问题就是要用这四种三格板覆盖更大的残缺棋盘。在此覆盖中要求: 1)两个三格板不能重叠 2)三格板不能覆盖残缺方格,但必须覆盖其他所有的方格。转载 2012-07-04 14:40:03 · 478 阅读 · 1 评论 -
【算法复习】全排列专题
一,全排列算法 由于这部分十分重要,这里再次做一下总结。 更多详细内容参考博文组合数学-全排列 二,算法思想 这里采用递归算法,思路如下 固定第一个数,然后处理后面n-1的全排列。 第一个数的可能性有n种,故采用for循环依次将后面n-1个数swap到前面,递归处理。处理完成之后转载 2012-07-04 14:51:54 · 103 阅读 · 0 评论 -
【算法复习四】计算复杂性与算法分析---组合数学知识汇总
一,组合数学问题 1)排列定义 • 从n个不同的元素中,取r个不重复的元素,按次序排列,称为从n个中取r个的无重排列。 •排列的全体组成的集合用P(n,r)表示。当r=n时称为全排列。 组合定义 • 定义从n个不同元素中取r个不重复的元素转载 2012-07-04 14:50:04 · 452 阅读 · 0 评论 -
【算法复习三】算法设计技巧与优化----算法设计技巧
一,例题:找出n个自然数(1,2,3,…,n)中r个数的组合。 • 例如,当n=5,r=3时,所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2转载 2012-07-04 14:48:03 · 629 阅读 · 0 评论 -
【算法复习四】计算复杂性与算法分析---算法分析
一,生成函数与递推递推关系举例【例1】Hanoi问题:这是个组合数学中的著名问题。N个圆盘依其半径大小,从下而上套在A柱上,如下图示。每次只允许取一个移到柱B或C上,而且不允许大盘放在小盘上方。若要求把柱A上的n个盘移到C柱上请设计一种方法来,并估计要移动几个盘次。现在只有A、B、C三根柱子可用。| ||| | |A B C第一步把A转载 2012-07-04 14:50:55 · 421 阅读 · 0 评论 -
【算法复习二】传统基本算法(贪心、动态规划、回溯和分支限界)
一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。转载 2012-07-04 14:44:38 · 334 阅读 · 0 评论 -
AVL平衡树的旋转
为了方便讨论是做点记号X为插入的节点P为旋转轴(P有时候为X的父节点如LL,RR旋转;P有时候也为X,如LR,RL旋转)R为平衡因子绝对值=2的节点 看下面四种情况LL旋转当三个节点处于一条直线,并均是左节点时,需要以中间的节点为旋转轴向右侧(顺时针)旋转一次使得C成为B的右子节点B代替C的位置B的右子节点成为C的转载 2012-08-09 15:56:17 · 248 阅读 · 0 评论 -
各种查找汇总
二分查找//二分查找法(递归调用)erfenfa1.cpp#include#include#includeusing namespace std;double a[10]= {1.1,1.3,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9};void binsrch(int s,int r,double x){ int m; m=(s+r)/2;原创 2012-08-09 11:19:16 · 133 阅读 · 0 评论 -
各种排序汇总
插入排序 Insertion Sort插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i]騆[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L原创 2012-08-06 15:58:47 · 1164 阅读 · 0 评论 -
桶排序
从《基于比较的排序结构总结 》中我们知道:全依赖“比较”操作的排序算法时间复杂度的一个下界O(N*logN)。但确实存在更快的算法。这些算法并不是不用“比较”操作,也不是想办法将比较操作的次数减少到 logN。而是利用对待排数据的某些限定性假设 ,来避免绝大多数的“比较”操作。桶排序就是这样的原理。 桶排序的基本思想 假设有一组长度为N的待排关键字序列K[1..转载 2012-08-06 11:23:33 · 183 阅读 · 0 评论 -
分而治之算法--快速排序
// quick sort#ifndef quickSort_#define quickSort_#include "indexOfMax.h"using namespace std;template void quickSort(T a[], int n){// Sort a[0 : n - 1] using the quick sort method. if (n原创 2012-08-01 16:30:46 · 137 阅读 · 0 评论 -
寻找电路布线最短路径
//寻找电路布线最短路径bool FindPath(Position start,Position finish,int& PathLen,Position * &path){ //寻找从start到finish的路径 //如果成功,则返回true,否则返回false //如果空间不足,则引发异常NoMem if((start.row==finish.row)&原创 2012-07-12 19:56:06 · 141 阅读 · 0 评论 -
【算法复习三】算法设计技巧与优化----各种背包问题总结
一,算法策略应用 1)关于背包问题 按与利润关系划分 •与利润无关的背包问题 •与利润有关的背包问题 按物体装入背包的多少 •部分背包问题转载 2012-07-04 14:46:06 · 273 阅读 · 0 评论 -
【算法复习二】传统基本算法(迭代、递归、分治)
一,迭代与递推 1)迭代法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。例如:斐波那契数列 例子:兔子繁殖问题 一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个转载 2012-07-04 11:18:39 · 376 阅读 · 0 评论