算法导论答案
文章平均质量分 60
1054512666
在读学生
展开
-
算法导论课后题 2.3-7答案
题目:请给出一个运行时间为O ( n lg n ) 的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。解决该问题的算法如下:1.对S中的元素进行排序(需要运行时间为O ( n lg n ) 的算法);2.构造一个集合S'={{ z : z = x − y }.(其中x我们要判断的元素,y为S中的所有元素);3.对S'中的元素进原创 2013-07-22 22:33:26 · 1227 阅读 · 0 评论 -
算法导论12.1-3答案
//12.1-3 给出一个非递归的中序树遍历算法#include using namespace std;//二叉树结点的结构体struct node{ int key;//值 node *left;//指向左孩子 node *right;//指向右孩子 node(){}//默认构造函数 node(int x):key(x),left(NULL),right(NULL){}/原创 2013-08-28 11:39:14 · 1031 阅读 · 0 评论 -
算法导论15.4-5 答案
//15.4-5请给出一个O(n的平方)的算法,使之能找出一个n个数的序列中最长的单调递增子序列#include #include using namespace std;int c[10][10];int b[10][10];#define x 10#define y 10int A[10]={0,2,4,5,9,8,7,6,8,9};int partition(int A原创 2013-09-10 10:40:48 · 2257 阅读 · 0 评论 -
算法导论15.1 装配线调度问题
//15.1装配线调度问题#include using namespace std;#define I 2#define J 6int a[I+1][J+1],e[I+1],x[I+1],t[I+1][J+1],n=J;int f[I+1][J+1],l[I+1][J+1],rf,rl;void Input()//输入{ int i,j; for(i=1;i<=I;++i原创 2013-09-03 10:02:16 · 1032 阅读 · 0 评论 -
15.2 矩阵链乘法
//15.2矩阵链乘法# include using namespace std;#define Length 7int P[7],M[7][7],S[7][7];void Input()//输入矩阵的维数{ int i; for(i=0;i<7;++i) cin>>P[i];}void Matrix_Chain_Order()//求矩阵的链乘法序列{ int i原创 2013-09-03 20:32:59 · 485 阅读 · 0 评论 -
算法导论答案 思考题15-1 双欧几里德旅行商问题
解题思路:根据简化后的双调欧几里得旅行问题的性质,将点集依据各点x坐标单调递增来进行编号,我们设b[i,j]是最短双调闭合旅程P(i,j)的长度(iP(i,j)是指从点P[i]开始,严格地向左走(即是每次经过的点的x坐标都比前一个点的x坐标要小),直到最左点P[1],然后再严格向右走,直到终点P[j]为止,在从P[i]到P[j]过程中的点有且只经过一次。设distance[i,j]是点原创 2013-09-16 11:06:24 · 1418 阅读 · 0 评论 -
算法导论思考题答案 思考题15-2 整齐打印
解决思路: 由问题描述可知道,我们需要做的就是n个单词分成若干份,这与矩阵连乘问题有相似之处。行尾的额外空格符数量M-j+i-∑lk(iM-(j-i)-∑lk,其中j-i是表示该行各个单词之间相隔的空格数量。我们设lc[i,j]是第i个单词到第j个单词的额外空格符数量的立方,即是(M-j+i-∑lk)3(ilc[i,j]=∞,当M-j+i-∑lklc[i,j]=0,当M-j原创 2013-09-16 18:56:57 · 1849 阅读 · 0 评论 -
算法导论 16.1-1活动选择问题的动态规划算法 答案
//16.1-1 活动选择问题的动态规划算法#include #include #define N 11void dynamic_activity_selector(int *s,int *f,int c[N+1][N+1],int ret[N+1][N+1]);void trace_route(int ret[N+1][N+1],int i,int j);void dynam原创 2013-09-17 11:01:31 · 3160 阅读 · 1 评论 -
算法导论答案 16.2-2 0-1背包问题的动态规划算法
//16.2-2 动态规划算法求解0-1背包问题#include using namespace std;#define W 50#define N 3int v[N+1]={0,60,100,120};//物品价值int w[N+1]={0,10,20,30};//物品重量int c[N+1][W+1]={0};//c[i][j]表示在剩余容量为j的情况下,对于物品1.....原创 2013-09-18 10:20:16 · 2224 阅读 · 0 评论 -
算法导论11.1-4答案
//11.1-4#include #include int Search(int Array[],int Stack[],int x){ int p=Array[x]; if(p>0&&p<Stack[0]&&x==Stack[p]) return p; return 0;}int Insert(int Array[],int Stack[],int x){ int原创 2013-08-25 11:56:13 · 961 阅读 · 0 评论 -
算法导论10.2-7答案
//10.2-7请给出一个O(n)时间的非递归过程,它对含n个元素的单链表的链进行逆转。除了链表本身占用的空间外,该过程应仅使用固定量的存储空间#include #include #define NULL 0typedef struct CirList{ int Element; CirList *Next;}*Cl;Cl InitCirList(){ Cl list;原创 2013-08-24 18:43:20 · 937 阅读 · 0 评论 -
用一个单链表L实现一个栈 要求PUSH和POP操作的时间仍为O(1) 算法导论10.2-2答案
#include #include #define NULL 0typedef struct Stack *S1;typedef struct Node{ int Element; Node *next;}Snode,*node;struct Stack{ Snode *top;};S1 InitStack(){ S1 s; s=(S1)malloc(sizeo原创 2013-08-23 19:41:11 · 2860 阅读 · 2 评论 -
算法导论10.1-2答案
//10.1-2 说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)#include #include struct Stack;typedef struct Stack *St;#define N 10struct Stack{ int Left_Top; int Right_Top;原创 2013-08-22 22:34:31 · 1464 阅读 · 0 评论 -
算法导论第二版2.2-2 答案
#include #include using namespace std;int main(){vector A;int x;coutwhile(cin>>x)A.push_back(x);for(vector::size_type i=0;i{int m=i;for(vector::size_type j=i+1;j{if原创 2013-07-19 09:37:42 · 1303 阅读 · 0 评论 -
算法导论2.3-5答案 分别采用递归与非递归方式实现二分查找 c++实现
//2.3-5 采用递归方式的二分查找,注意输入的数组是有顺序的#include #include using namespace std;vector::size_type Binary_Search(vector A,int key,vector::size_type first,vector::size_type last){if(first>last)r原创 2013-07-20 10:51:41 · 886 阅读 · 0 评论 -
算法导论第二版 习题2.1-4答案
#include #define n 5void main(){int A[n]={0,1,1,0,1},B[n]={0,0,1,1,0};int C[n+1]={0};for(int i=0;i{if((A[i]+B[i]+C[i])==2){C[i+1]=1;C[i]=0;}elseif((A[i]+B[i]+C[i])==3)原创 2013-07-18 20:24:41 · 1479 阅读 · 0 评论 -
归并排序 (不采用哨兵) 算法导论2.3-2答案
# include#define NULL 0void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; w原创 2013-07-19 16:35:35 · 1329 阅读 · 0 评论 -
寻找逆序对的算法,要求运行时间为O(nlgn),算法导论答案
#include int merge_inversion(int A[],int p,int q,int r){int n1,n2,i,j,k,num=0;n1=q-p+1;n2=r-q;int L[10],R[10];for(i=0;i!=n1;++i)L[i]=A[p+i];for(j=0;j!=n2;++j)R[j]=A[q+j+1];L[n1]=原创 2013-07-23 23:54:41 · 1075 阅读 · 0 评论 -
10.2-5 用环形单链表来实现字典操作INSERT、DELETE和SEARCH,并给出它们的运行时间 算法导论答案
//10.2-5 用环形单链表来实现字典操作INSERT、DELETE和SEARCH,并给出它们的运行时间#include #include typedef struct CirList{ int Element; CirList *Next;}*Cl;Cl InitCirList(){ Cl list; list=(Cl)malloc(sizeof(struct Cir原创 2013-08-23 22:12:56 · 1045 阅读 · 0 评论 -
算法导论10.2-6答案
//10.2-6 动态集合Union以两个不相交的集合S1和S2作为输入,输出集合S=S1US2包含了S1和S2的所有元素。该操作常常会破坏S1和S2。//说明应如何选用一种合适的表数据结构,以便支持在O(1)时间内的UNION操作。方法是在链表中设置尾指针,然后将其中一个链表的尾指针连接到另一个链表的表头#include #include typedef struct CirList原创 2013-08-23 23:28:09 · 1119 阅读 · 0 评论 -
算法导论答案 16.2-4
//16.2-4#include using namespace std;#define N 6int x[N+1]={0,10,40,60,90,120,140},f[N+1]={0};//f用于标记某一站是否加油,x[i]表示第i个加油站距离起始点的距离void Greedy_Select(int x[],int f[])//选择在哪一个加油站停车{ int n=30;//邮箱原创 2013-09-19 10:51:11 · 4149 阅读 · 0 评论