![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法导论
文章平均质量分 64
yuanjianchuan
这个作者很懒,什么都没留下…
展开
-
描述一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数 X 时,判断出S中是否存在有两个其和刚好等于 X 的元素。
/*暴力O(n^2):n个整数的集合S和另一个整数x,确定S中是否存在两个其和刚好为x的元素*/#includeint S[1000000];int judge(int S[],int n,int x){ int i,j; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(S[i]+S[j]==x)原创 2015-03-09 12:17:18 · 2154 阅读 · 0 评论 -
10.2-3 用单链表实现队列
//用单链表实现队列,设head和tail指针#include#includetypedef struct NODE{ char key;struct NODE* next;}NODE;NODE *head=NULL,*tail=NULL;void enqueue(NODE* p){//入队到tail后面 if(!tail) head=tail=p;//链表为空原创 2015-08-15 15:52:30 · 297 阅读 · 0 评论 -
permute by sorting
//将数组A:1~n,随机重排#include#include#includeconst int N=100;using namespace std;struct FOO{ int priority;int initial_index; bool operator <(const FOO&another)const{ return priority<a原创 2015-02-22 15:11:59 · 743 阅读 · 0 评论 -
10.1-6 两个栈实现一个队列
/*两个栈实现一个队列设两个栈为s1,s2入队:元素入栈到s1。出队:若s2非空,弹出s2栈顶元素;否则,将s1的所有元素倒入s2(s1栈底元素会到s2栈顶),再弹出s2栈顶元素*/#include#includeusing namespace std;typedef char ElemType;stack s1;stack s2;void enqueue(ElemTyp原创 2015-08-15 15:47:59 · 227 阅读 · 0 评论 -
带哨兵的双向链表
//带哨兵的双向链表#include#includetypedef struct NODE{ struct NODE*prev;char key;struct NODE*next;}NODE;NODE*NIL=NULL;//双链表L的哨兵结点。NODE*search(char key)//每次循环省略对p!=NULL的检查{/*查找双链表L中第一个关键字为key的元素,并返回原创 2015-08-15 15:50:39 · 1343 阅读 · 0 评论 -
10.2-5 带哨兵的单向循环链表
//带哨兵的单向循环链表。NIL的next是头结点,尾结点的next是NIL#include#includetypedef struct NODE{ char key;struct NODE* next;}NODE;NODE *NIL=NULL;void insert(NODE* p){//插入到头结点 p->next=NIL->next; NIL->next原创 2015-08-15 15:53:26 · 459 阅读 · 0 评论 -
10.2-7 O(n)非递归逆转单向链表的n个元素。
//10.2-7 O(n)非递归逆转单向链表的n个元素。#include#includetypedef struct NODE{ char key;struct NODE* next;}NODE;NODE *L=NULL;void insert(NODE* p){//插入到头结点 p->next=L; L=p;}NODE* createnode(char原创 2015-08-16 11:16:31 · 234 阅读 · 0 评论 -
10.3-2 10.3-3
10.3-2ALLOCATE和FREE函数无需变化。free自由表的初始化:每个元素存放一段长度为要分配的对象所占空间的连续地址的首地址。假设要分配的对象所占空间为size,则free自由表存放的地址为0, size, 2size, 3size, … , ksize, …当对象成功分配空间后,它得到以ksize为首地址,size为长度的一段连续空间。 注意:只有分配的空间都是一组同构对象,才能使用原创 2015-09-01 21:31:33 · 263 阅读 · 0 评论 -
10.3-4 实现ALLOCATE和FREE,使双向链表在多数组表示法中在存储器保持紧凑,占前n个位置。
10.3-4实现ALLOCATE和FREE,使双向链表在多数组表示法中在存储器保持紧凑,占前n个位置。自由表Free初始化:0,1,2,...其实是一个stack。0是栈顶元素,Free是栈顶指针。下一个被分配之对象是最后被释放的。自由表只使用next数组。Free和双链表L交错。地址是数组下标,int类型。看了这篇blog,我就有灵感了。#include#def原创 2015-09-12 07:56:03 · 405 阅读 · 0 评论 -
用顺序统计树(红黑树扩张)解决逆序对POJ1804
#include#include#include#include//#includeusing namespace std;enum RBCOLOR{RED,BLACK};class RBNODE{public: int key; RBNODE* left; RBNODE* right; RBNODE* parent; RBCOLOR col原创 2016-02-05 17:06:28 · 482 阅读 · 0 评论 -
poj 1458 最长公共子序列
迭代版:#include#include#include#includeusing namespace std;const int M=310;typedef char ELEM;ELEM X[M];ELEM Y[M];int c[M][M];int LCS_LENGTH(int XLen,int YLen){//cout<<XLen<<" "<<YLen<<endl;原创 2016-02-10 15:25:39 · 264 阅读 · 0 评论 -
22.5-5求有向图的分量图
22.5-5求有向图的分量图1.求出强连通分量(1)第1次dfs,求出(逆)拓扑序(2)第2次对以逆图的逆拓扑序dfs,得到的DFS森林,便求出强连通分量。期间要记录结点v所属的强连通分量为scc_count。2.对于原图的每条边,若两个端点不属同一强连通分量,即!stronglyreachable(v,t),便加进DAG中参考资料:C++算法--图算法(第3版原创 2016-03-19 09:45:16 · 613 阅读 · 0 评论 -
图的BFS
#include#include#include#include#include#includeusing namespace std;const int M=100;enum COLOR{WHITE,GRAY,BLACK};struct VERTEX{ int index;//点的编号 int distance; int previous;//前驱结点编原创 2016-03-06 14:29:02 · 254 阅读 · 0 评论 -
不带哨兵的双向链表
//不带哨兵的双向链表#include#includetypedef struct NODE{ struct NODE*prev;char key;struct NODE*next;}NODE;NODE*L=NULL;//双链表L的表头NODE*search(char key){/*查找双链表L中第一个关键字为key的元素,并返回指向该元素的指针,不存在key则返回NULL原创 2015-08-15 15:51:28 · 384 阅读 · 0 评论 -
heapsort堆排序
#include#includeint A[10000000];using namespace std;inline int PARENT(int i){ return i>>1;//return i/2;}inline int LEFT(int i){ return i<<1;//i*2}inline int RIGHT(int i){ return原创 2015-02-22 15:21:12 · 262 阅读 · 0 评论 -
10.2-2 用单链表实现栈
//用单链表实现栈#include#includetypedef struct NODE{ char key;struct NODE* next;}NODE;NODE *L=NULL;void push(NODE* p){//插入的结点成为新的链表头 p->next=L;L=p;}void pop(void){//删除头结点 if(!L) puts("s原创 2015-08-15 15:55:12 · 311 阅读 · 0 评论 -
min heap priority queue 最小堆实现的优先队列
#include#include#includeint A[10000000];using namespace std;inline int PARENT(int i){ return i>>1;//return i/2;}inline int LEFT(int i){ return i<<1;//i*2}inline int RIGHT(int i){原创 2015-02-22 17:00:07 · 789 阅读 · 0 评论 -
d叉堆 d-ary
#include#include#includeint A[10000000];int d=3;//3叉堆using namespace std;//n个元素的d叉堆高度为logd n向下取整(2<=n<=d-1时不成立)inline int PARENT(int i){ return (i-2)/d+1;}inline int CHILD(int i,int orde原创 2015-02-22 15:56:46 · 642 阅读 · 0 评论 -
10.1-5 双端队列deque
/*双端队列deque,可在两端插入、删除。有MAX+1个位置(MAX个可用)*/#include#define MAX 6typedef char ElemType;typedef int bool;struct DEQUE{ int head;//指向第一个元素,初值0 int tail;//指向最后元素的下一个位置,初值0 ElemType q[MAX原创 2015-08-15 15:49:38 · 315 阅读 · 0 评论 -
hat check
/*the hat-check problem. Each of n customers gives a hat to a hat-check person at arestaurant. The hat-check person gives the hats back to the customers in a randomorder. What is the expected number原创 2015-02-22 15:18:14 · 442 阅读 · 0 评论 -
priority queue 优先队列
#include#include#includeint A[10000000];using namespace std;inline int PARENT(int i){ return i>>1;//return i/2;}inline int LEFT(int i){ return i<<1;//i*2}inline int RIGHT(int i){原创 2015-02-22 15:22:46 · 241 阅读 · 0 评论 -
10.1-7 两个队列实现一个栈
/*两个队列实现一个栈设两个队列为q1,q2入栈、出栈操作完成后,都会至少有一个队列为空。入栈:元素入队到非空队列(若q1,q2都空,入任意一队)出队:非空队列Q的元素出队,入队到空队列eQ。当非空队列Q剩下一个元素时,直接出队。此时,原来的空队列eQ变成非空队列Q,原来的非空队列Q变成空队列eQ。*/#include#includeusing namespace std;ty原创 2015-08-15 15:44:20 · 282 阅读 · 0 评论 -
算法导论 10.2-6 带哨兵的双向链表合并两个不相交的集合
/*O(1)合并S1、S2。S1、S2集合不相交。*//*需要能在O(1)时间内访问到S1、S2的头和尾的链表:带头结点和尾结点的单链表;双向循环链表。*///带哨兵的双向链表:S1头接S2尾,S2头接S1尾。#include<stdio.h>#include<stdlib.h>typedef struct NODE{ struct NODE*prev;char key;str原创 2015-08-15 15:32:09 · 587 阅读 · 0 评论 -
算法导论9.3-8 找出已排序的2个数组X[1..n]和Y[1..n]的共2n个数的中位数
//O(nlgn)找sorted的X[1..n]和Y[1..n]的共2n个数的中位数//先排序,再找第n大的数(下中位数)#include#include#includeusing namespace std;const int M=5000000;struct FOO{ int num; int status;}A[M*2+5];bool cmp(const F原创 2015-03-11 16:55:43 · 1105 阅读 · 0 评论 -
矩阵乘法的三个版本实现
version1#include//Matrix multiplication O(n^3) 按照定义算const int N=200;void Multiply(int A[][N],int B[][N],int C[][N],int n){//C=A*B int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++){原创 2015-02-24 15:35:35 · 455 阅读 · 0 评论 -
RANDOMIZE IN PLACE
//将数组A:1~n,随机重排#include#include#includeusing namespace std;int main(void){ int T=100; while(T--){ int n=3; int A[n]; for(int i=1;i<=n;i++) A[i]=i; for(int原创 2015-02-22 15:07:17 · 594 阅读 · 0 评论 -
同时找出数组的最大值和最小值
虽说第一个方法在时间复杂度的分析上比第一个要少n/2,但是我在电脑上测试的结果,运行时间是差不多的。搞不懂~//朴素算法:分别找出最大值和最小值。2n次比较#includeint A[50000010];int FIND_MINIMUM_AND_MAXIMUM(int A[],int n){ int min=A[0],max=A[0],i; for(i=1;i<n;i+原创 2015-03-10 10:52:38 · 933 阅读 · 0 评论 -
10.1-2 在一个数组A[1..n]中实现两个栈,使得两个栈元素个数之和不为n时,两者不会上溢
/*在一个数组A[1..n]中实现两个栈,使得两个栈元素个数之和不为n时,两者不会上溢*/#include#define n 6typedef char ElemType;typedef int bool;ElemType A[n];int top1=1;//栈1的栈顶指针int top2=n;//栈2的栈顶指针//永远都指向栈顶元素的下一个位置/*栈1的栈底是A[1],元素原创 2015-08-15 15:41:09 · 999 阅读 · 0 评论 -
quicksort
#include#includeusing namespace std;int A[100000];/*At the beginning of each iteration of the loop , for any arrayindex k,1. If p <= k <= i, then A[k]<= pivot.2. If i+1 pivot.3. If k = r, th原创 2015-02-25 17:20:25 · 280 阅读 · 0 评论