algorithm
文章平均质量分 68
埋头
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
快速排序各种版本(record)
#includeusing namespace std;#define N 1000000int a[N];//选取枢纽元(3种方法)//1:选左端//int select_pivot(int p, int q)//{// return a[p];//}//2:取中数//void swap_ab(int p, int q)//{// int temp = a[p];原创 2015-01-15 15:32:43 · 679 阅读 · 0 评论 -
最大值最小化问题
问题描述可参考最大值最小化问题,问题在刘汝佳老师的算法竞赛入门经典书上的p151页,核心算法是二分法猜最大值,猜对了继续小化,猜错了增大数字,初始左值为序列第一个元素值,右值为序列和。下面是我的C++实现代码#includeusing namespace std;#define N 1000000int a[N];int search_min(int n,int k){ i原创 2015-01-15 21:59:22 · 3608 阅读 · 0 评论 -
hiho上的一些线段树问题总结
概念:线段树(Segment Tree)是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+b)/2],右子树表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树。叶节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。——摘自维基百科原创 2015-05-18 21:16:07 · 713 阅读 · 0 评论 -
范围最小值问题(Range Minimum Query,RMQ)
问题描述给定一个n个元素的序列{A1,A2,……,An},在要求的区间Query(L,R)内找到最小值:min{AL,AL+1,……,AR}。hiho16算法描述在这里介绍最常用的Tarjan的Sparse-Table算法,它的预处理时间复杂度为O(nlogn),而查询时间只需要O(1)。令calc(i,j)表示从i开始的,长度为2j 的一段子序列的最小值,则使用循环的方式计算:calc[i][j]原创 2015-05-19 13:39:41 · 1056 阅读 · 0 评论 -
最近公共祖先(LCA):离线&在线算法
Tarjan算法适用于离线批量处理多个查询请求。基本思想是以深度优先搜索的顺序访问这颗树,给这棵树的结点染色,一开始所有结点都是白色的,而当第一次经过某个结点的时候,将它染成灰色,而当第二次经过这个结点的时候——也就是离开这棵子树的时候,将它染成黑色。原创 2015-05-19 11:02:08 · 3616 阅读 · 2 评论 -
KMP算法解决字符串匹配
该算法由D.E.Knuth ,J.H.Morris和 V.R.Pratt提出,用于解决字符串匹配问题。思想:设目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为0。若有s[i]=t[j],则i和j分别加1。否则,i不变,j退回到j=next[j-1]的位置,再比较s[i]和t[j],若相等,则i和j分别加1。否则,i不变,j再次退回到j=n原创 2015-08-27 20:47:00 · 1569 阅读 · 0 评论 -
数据结构基础笔记(二)【严蔚敏】
动态存储管理:伙伴系统分配内存算法思想:当程序提出大小为n的内存分配请求时,首先在可利用表中查找大小与n相匹配的子表. ◆ 若存在2^(k-1)< n ≤ 2^k-1的空闲子表结点:则将子表中的任意一个结点分配之; ◆ 若不存在2^(k-1) < n ≤ 2^k-1的空闲子表结点:则从结点大小为2^k的子表中找到一个空闲结点,将其中一半分配给程序,剩余的一半插入到结点大小为2k-1的子表中。原创 2015-08-30 22:30:42 · 1067 阅读 · 0 评论 -
数据结构基础笔记(一)【严蔚敏】
广义表广义表相关概念: ◆ a1(表中第一个元素)称为表头; ◆ 其余元素组成的子表称为表尾;(a2,a3,…,an) ◆ 广义表中所包含的元素(包括原子和子表)的个数称为表的长度。 ◆ 广义表中括号的最大层数称为表深 (度)。 根据对表头、表尾的定义,任何一个非空广义表的表头可以是原子,也可以是子表, 而表尾必定是广义表。 只要广义表非空,都是由表头和表尾组成,即一个确定的表头和原创 2015-08-29 14:23:12 · 1667 阅读 · 0 评论 -
数据结构基础笔记(三)【严蔚敏】
(一)内部排序所有的记录都能存放在内存中进行排序,称为内部排序; 对内部排序地而言,其基本操作有两种: ◆ 比较两个关键字的大小;<必不可少> ◆ 存储位置的移动:从一个位置移到另一个位置。<不一定:链式存储>【1】插入排序2-路插入排序 2-路插入排序是对折半插入排序的改进,以减少排序过程中移动记录的次数。附加n个记录的辅助空间,方法是: ① 另设一个和L->R同类型的数原创 2015-08-31 17:24:02 · 1149 阅读 · 0 评论 -
最长递增子序列
#include#include#includeusing namespace std;/************************************************ 求最长递增子序列长度*************************************************///O(n^2)//int LIS(int array[], int n原创 2015-10-08 14:03:30 · 545 阅读 · 0 评论 -
集合的子集生成(无重复元素)
1:增量构造法#include #include using namespace std;#define N 100000int p[N];int a[N];//子集生成void print_subset(int n, int *p, int *a ,int cur,int index){ if (cur != 0) { for (int i = 0; i <原创 2015-01-04 15:49:54 · 877 阅读 · 0 评论 -
八数码问题
利用哈希表来查重广度优先来取得最少步数参考再论八数码文章对八数码问题有无解的讨论下面是八数码实现代码#include#include#includeusing namespace std;#define M 1000000typedef int state[9];int st[M][9];int goal[9];int dist[M];//set vis;const in原创 2015-01-12 20:00:24 · 876 阅读 · 0 评论 -
hiho一下 第二十七周:最小生成树二·Kruscal算法
时间限制:10000ms单点时限:1000ms内存限制:256MB描述随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大。所以问题变成了——小Hi现在手上拥有N座城市,且已知其中一些城市间建造道路的费用,小Hi希望知道,最少花费多少就可以使得任原创 2015-01-08 12:58:00 · 784 阅读 · 0 评论 -
算法竞赛入门:埃及分数问题
方法:迭代加深解答树并进行剪枝剪枝点:要表示的分数与已经分配到分数总和的差值要大于0才会继续根据剩余深度和上面的差值确定每层尝试分数分母的上限,下限即前一分配好的分数的分母加1#include #include using namespace std;#define N 10000000int array[N];double is_equal(int a, int b, int cur原创 2015-01-05 23:23:18 · 1184 阅读 · 0 评论 -
空瓶子装水解谜游戏
#include #include #include using namespace std;#define N 1000000#define M 10int array[N][M];int bfs(int *a, int cur, int x, int d , int n){ if (cur == d) return 0; for (int i = 0; i < n;原创 2015-01-06 19:49:35 · 1396 阅读 · 0 评论 -
hiho #1066并查集问题
#1066 : 无间道之并查集时间限制:20000ms单点时限:1000ms内存限制:256MB描述这天天气晴朗、阳光明媚、鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小Ho决定趁着这朗朗春光出去玩。但是刚刚离开居住的宾馆不久,抄近道不小心走入了一条偏僻小道的小Hi和小Ho就发现自己的前方走来了几个彪形大汉,定睛一看还都是地地道道的黑人兄弟!小Hi原创 2015-01-08 12:51:35 · 916 阅读 · 0 评论 -
输出困难的串
#include using namespace std;#define N 100000int str[N];int tot;char t;int is_hardstr(int n, int *str){ int i = 1,j; while (2 * i <= n) { for (j = 0; j < i; j++) { if (str[j + n -原创 2015-01-05 14:33:50 · 749 阅读 · 0 评论 -
回溯法解决素数环问题
#include #include using namespace std;#define N 100000int isp[2 * N];int a[N];int visited[N];int is_prime(int n){ int i; int flag = 0; for (i = 2; i <= (int)sqrt(n) + 1;i++) { if (n%i原创 2015-01-04 23:39:47 · 2862 阅读 · 1 评论 -
回溯法解决八皇后问题
回溯法:全排列并进行剪枝#include #include using namespace std;#define N 100000int C[N];int tot;int visited[3][N];//列访问,副对角线访问,主对角线访问//八皇后问题void search(int n, int cur){ if (cur == n) tot++; else f原创 2015-01-04 21:44:58 · 653 阅读 · 0 评论 -
生成可重集的排列
自己重写的下一个排列函数#include #include using namespace std;#define N 100000int p[N];int _next_permutation(int *first, int *last){ int *p,*q; for (p = last; p != first; p--) { if (*p > *(p - 1))原创 2015-01-03 17:04:16 · 707 阅读 · 0 评论 -
#1014 : Trie树
http://hihocoder.com/problemset/problem/1014#include #include #define MAX 26typedef struct TNode{int count;struct TNode *head;struct TNode *tail;struct TNode *next;char value原创 2014-12-19 11:24:50 · 634 阅读 · 0 评论 -
最长公共子序列&最长公共子串
#include#include#include#includeusing namespace std;/************************************************ 求最长公共子序列长度*************************************************/int LCS(string str1, string原创 2015-10-08 15:55:31 · 690 阅读 · 0 评论
分享