算法的序列
A. 银行算法怎么求出全部安全序列
先说一下银行家的算法:
设进程cusneed提出请求REQUEST
[i],则银行家算法按如下规则进行判断。
(1)如果REQUEST
[cusneed]
[i]<=
NEED[cusneed][i],则转(2);否则,出错。
(2)如果REQUEST
[cusneed]
[i]<=
AVAILABLE[i],则转(3);否则,等待。
(3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i];
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
=================================================
题目中的计算过程:
先算出每个进程还需要多少进程才能满足,即Request的值
=
Need
-
Allocation
进程名
Allocation
Need
Request
Available
ABC
ABC
ABC
ABC
P1
4
0
5
4
0
11
0
0
6
2
3
3
P2
4
0
2
5
3
6
1
2
4
P3
2
1
4
4
2
5
2
1
1
P4
2
1
2
5
5
9
3
4
7
P5
3
1
3
4
2
4
1
1
1
第一题A项p3
p1
p4
p2
p5
先分配给P3,其Request(2,1,1)
<
available(2,2,3)
满足,分配资源等待P3完成,P3进程完成之后,Available
=
(2,1,4)
+
(2,3,3)
=
(4,4,7)
然后分配给p1,其Request(0,0,6)
<
available(4,4,7),可以满足资源,分配资源给P1,P1完成任务释放资源Available
=
(4,0,5)
+(4,4,7)
=
(8,4,12)
接着P4,request(3
4
7)
<
available(8,4,12),可以满足资源,分配资源给P4,P4完成任务释放资源Available
=
(2,1,2)
+(8,4,12)
=
(10,5,14)
接着p2,request(1
2
4)
<
available(10,5,14)可以满足资源,分配资源给P4,P4完成任务释放资源Available
=
(4,0,2)+
(10,5,14)
=
(14,5,16)
最后P5,request(1
1
1)
<
available(14,5,16)可以满足资源,分配资源给P4,P4完成任务,资源全部释放,变为(3
1
3
)+
(14,5,16)
=
(17,6,19)
所以A是安全序列。
同理分析B
p1
p3
p5
p2
p4,先分配给P1的话Request(0,0,6)
>
available(2,3,3),C资源不满足,所以该序列不安全。
分析C项p4
p2
p3
p5
p1,先分配给p4,
Request(3,4,7)
>
available(2,3,3),ABC资源都不满足,该序列不安全。
分析D项p2
p3
p1
p4
p5,先分配给P2,Request(1,2,4)
>
available(2,3,3),C资源不满足,所以该序列不安全。
第二题,分析方法跟上面的一样,只是比较费时。如果单选的话,看一下答案,D项,先分配给P4,显然完成P4还需(
3
4
7)
,其大于
available,所D项不安全。
B. . 写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
分析分析,研究研究。
要判断输入的序列的模式是不是----序列1&序列2。用==来判断肯定是不行地。那就只要判断判断当中有且只有一个&。且&不在第一个位置上和最后一个位置上就可以了。
具体的做法么~
char s[20]//来个存放的位置,当然你可以更加专业的malloc来节约空间
fget(s,20,stdin);//好了,放进去了。
然后我不高兴一个命令一个命令写了
来个指针指到s[0];
然后遍历就可以了。要记录的是&出现了几次以及他们出现的位置。比如指针指到5的时候 发现了&。先把&的统计+1,然后把5记录下来。只要统计只有1 而且&出现数不是1或者strlen(序列)的位置,那就可以了。
C. 设计算法,判断输入序列12。。。n的任一排列p1p2…pn是否是栈的正确输出序列。 求编程,c语言
等价为能否构造树(前序+中序)代码晚上奉上
D. 序列号算法
下载一个对应软件、对应版本的注册机,自己就可以计算了。
E. 设一个栈的输入序列为1,2,3,...,n-1,n。请编写一个算法,判断一个序列p1,p2,p3,...,pn
#include<stdio.h>
#define StackLen 50
#define DLen 10
int Pop[DLen]={7,10,9,8,6,5,4,3,2,1},pPop=0;
int DS[StackLen],pDS=-1;
int pPush=0,iStep=0;
int fPush(int d);
int fPop();
void main()
{
int i;
for(;pPop<DLen;pPop++)
{
for(i=pPush;i<Pop[pPop];i++)
{
fPush(pPush+++1);
//pPush++;
}
if(fPop()!=Pop[pPop])
{
printf("ERROR! I Can not find a way to pop the data!\n");
return;
}
}
printf("Mission is well done!\n");
}
int fPush(int d)
{
if(pDS>=StackLen){printf("Stack Overflow!\n");return -1;}
DS[pDS++]=d;
printf("%d:Push %d in Stack[%d]\n",iStep++,d,pDS);
return d;
}
int fPop()
{
int d;
if(pDS<0){printf("Stack empty!\n");return -1;}
d=DS[--pDS];
printf("%d:Pop %d from Stack[%d]\n",iStep++,d,pDS+1);
return d;
}
F. 设计算法以判断对输入序列1,2,3…n,序列a1,a2,a3…an是否是该栈的合法的输出序列
模拟这个过程,搞一个栈,向栈中加数直到ai然后去掉ai,然后如果ai+1在栈中而不在栈顶,则不合法,若在栈顶则直接删掉,否则重复刚才的过程。
G. 写一个算法,判断依次读入的一个以@为结束符的字母序列 ,是否为形如“序列1&序列2”模式的字符序列。
#include<stdio.h>
#include<string.h>
int main()
{
char s[200];
char m[100];
char n[100];
int i,j;
while(scanf("%s",s) == 1) {
int len = strlen(s);
for(i = 0;i<len;i++) {
if(s[i] == '&'){
m[i] = '\0';
break;
}
else m[i] = s[i];
}
for(j = len-1;j>=0;j--) {
if(s[j] == '&') {
n[len-1-j] = '\0';
break;
}
else n[len-1-j] = s[j];
}
if(i == j && strcmp(m,n) == 0) printf("YES\n");
else printf("NO\n");
}
return 0;
}
H. 计算机中,算法指的是解决某一问题的有限运算序列,它必须具备什么
计算机中,算法指的是解决某一问题的有限运算序列,它必须具备确定性、有效性、有穷性、0个或者多个输入、1个或者多个输出。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
(8)算法的序列扩展阅读:
算法的分类
算法可大致分为基本算法、数据结构的算法、数论与代数算法、计算几何的算法、图论的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法,厄米变形模型,随机森林算法。
1、有限的,确定性算法 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。
2、有限的,非确定算法 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。
3、无限的算法,是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。
I. 求一个序列号生成的算法
机器码字符串直接求MD5就可以,然后截到需要的长度,嫌简单可以再加异或之类的