数据结构
文章平均质量分 61
菜鸟进击
这个作者很懒,什么都没留下…
展开
-
串的模式匹配算法
串的模式匹配算法,从下标0开始计算的。 void GetNext(char s[], int length, int next[]) { int i = 0, j = -1; next[0] = -1; while(i < length) { if(-1 == j || s[i] == s[j]) { i++; j++; next[i] = j; } e原创 2014-02-25 11:38:58 · 509 阅读 · 0 评论 -
图的一些基本算法
#include #include using namespace std; #define MAXSIZE 100 #define INFINITY 65535 typedef char VertexType; typedef int EdgeType; /*用链表表示*/ typedef struct EdgeNode { int adjvex; EdgeType weight;原创 2014-03-10 21:36:50 · 434 阅读 · 0 评论 -
寻找数组中的第k个数(序)
在上篇博客中寻找数组中的第k个数时每次排序所选择的pivot是随机选择的,在这篇博客中,我采用的是算法导论中讲的一种方法(算法导论上论证了该方法在最坏的情况下其运行时间都是线性的),尽可能使得划分后pivot两边数的个数差不多,具体步骤如下: 将数组中[low,high]之间的数以长度5为单位,分成1 + (high - low) / 5组("/"表示整数除)寻找每一组中的中位数,先将每原创 2014-03-06 19:54:28 · 504 阅读 · 0 评论 -
快速排序
PartitionOne是一种常规的划分方法,使用low和high指针从数组的两端进行处理。 PartitionTwo是从low到high的方向进行处理,当数组部分有序时,[0-j]表示小于sentinel的元素,[j+1,i]表示大于sentinel的元素,当某个待处理的数小于sentinel时(下标为i+1),就将数组中j+1与i+1位置上的数互换,那么此时[0-j+1]就表示小于senti原创 2014-03-06 11:33:08 · 365 阅读 · 0 评论 -
poj1050-求二维数组子数组和的最大值
题意:给定一个二维数组,值有正有负,矩阵的规模不超过100*100,矩阵元素在-127到127之间,求该二维数组的一个子数组,使得该数组的元素之和在所有的子数组中是最大的。 解法一: 对整个矩阵进行枚举,采用四重循环,计算每个子矩阵的元素之和,在计算所有的子矩阵之和是有很多重复的计算,可以考虑用“空间换时间”的方法,先计算出以(1,1)为左上点,(i,j)为右下点所表示的矩阵元素之和为part原创 2014-03-07 21:52:14 · 1393 阅读 · 0 评论 -
poj2479-在一个数组中求任意不相交的两个子数组之和的最大值
该题的重点在于求一个数组中子数组之和的最大值,采用动态规划的方法求解,已知数组A[n] 假设已求得了A[i,n]中子数组之和的最大值,那么将A[i-1]加入进来后就出现了3种情况。A[i-1]就是A[i-1,n]中子数组之和的最大值A[i-1,...,j](iA[i-1]加进来后对子数组之和的最大值没有影响令A[i,n]子数组之和的最大值为nAll,以A[i]开头的,且是A[i,n]的子原创 2014-03-07 10:29:46 · 862 阅读 · 0 评论 -
最长公共子序列(poj1458)
本题来自poj1458,题目大意:给定两个字符串X,Y,求X,Y的最长公共子序列,不要求子序列连续,但子序列在X,Y中的位置是严格单调递增的。 例如 abcfbc与abfcab的最长公共子序列就是abcd,其长度为4;programming和contest的最长公共子序列就是on,其长度为2;abcd和mnp的最长公共子序列为空 可以采用动态规划的方法来解该题,计算字符串A、B的最长公共子序列原创 2014-03-09 11:09:33 · 675 阅读 · 1 评论 -
二叉树的定义
Binary.h#include using namespace std; typedef struct BiTNode { struct BiTNode *lchild; struct BiTNode *rchild; int data; }BiTNode, *BiTree; void CreateBinaryTreeNode(BiTree *pNode, int原创 2014-04-24 08:36:53 · 508 阅读 · 0 评论 -
寻找数组中的第k个数
寻找数组中第k个最大的数跟快速排序的原理是类似的,快速排序的一次排序中是将数组的[i,j]段分为三部分[i,pivot-1],pivot,[pivot+1,j],那么pivot就是[i,j]中的第pivot-i+1个元素。那么把数组进行一次排序后,如果pivot就是第k个元素,则就达到了目的;如果pivot比k大,则表示第k大的元素在[i,pivot-1]中,因此现在就需要在[i,pivot-1]原创 2014-03-06 15:24:03 · 554 阅读 · 0 评论