实现判别一个分解的无损连接分解课程设计文档Word文档下载推荐.docx
- 文档编号:16428381
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:10
- 大小:83.05KB
实现判别一个分解的无损连接分解课程设计文档Word文档下载推荐.docx
《实现判别一个分解的无损连接分解课程设计文档Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实现判别一个分解的无损连接分解课程设计文档Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
a)用一种高级语言实现判别一个分解的无损连接性:
二、设计要求
a)按算法5.2和定理5.4实现(P190);
b)能给出根据模式的分解形成初始表格;
c)给出根据每一个函数依赖表格的变化情况;
三、设计说明
a)数据结构设计
typedefstructDate//用于存储表格内的数据
{
charname;
//存储a或b
intnum;
//存储下标,若下表为01、02等均省略0记为1、2
};
typedefstructFunction//用于存储函数依赖
charx[5],y[5];
structFunction*next;
typedefstructRelation//用于存储关系
charU[11];
//用于存储属性组,属性名称必须为单个字母,属性组内不超过10个属性
FunctionF;
Dated[10][10],d1[10][10];
//用于存储n列k行的表
b)函数设计
voidshowR();
显示关系R的内容
voidInitR();
建立关系R
voidInitd(intn,intk);
建立一张n列k行的表
intlocate(chars[11],charm);
查询字母m在字符串s中的位置
voidshowd(intn,intk);
显示表中的内容
voiddof(charx[5],chary[5],intk);
函数依赖对表的操作
voidcopy(intn,intk);
表的复制
intcompare(intn,intk);
表的比较
voidInitR()
cout<
<
"
输入U(例如'
ABCDEF'
)"
endl;
//输入格式必须按照格式输入
cin>
>
R.U;
chara;
输入F(例如'
(AB->
C,D->
E)'
cin>
a;
//输入格式必须按照格式输入,每个单元必须用空格隔开
Function*q=&
R.F;
while
(1)
{
q->
x;
a>
y;
if(a=='
)'
)break;
Function*p;
p=newFunction;
q->
next=p;
q=q->
next;
}
next=NULL;
}
voidInitd(intn,intk)
输入分解组(AB,AC,DEF,)"
//输入格式必须按照格式输入,最后一个‘,’不能省
inti,j;
for(i=0;
i<
n;
i++)
for(j=0;
j<
k;
j++)
d[j][i].name='
b'
;
d[j][i].num=j*10+i;
charm;
//cout<
====---========"
m;
//cout<
===...======="
if(m=='
'
======;
===="
j=locate(R.U,m);
d[i][j].name='
a'
d[i][j].num=j;
voiddof(charx[5],chary[5],intk)
inta=strlen(x),b=strlen(y);
inti,j,p,q;
intm[5],n[5];
i++)m[i]=locate(R.U,x[i]);
记录属性在表中的列
b;
i++)n[i]=locate(R.U,y[i]);
k-1;
i++)寻找有相同分量的列,
for(j=i+1;
for(p=0;
p<
p++){
if(d[i][m[p]].name!
=d[j][m[p]].name||d[i][m[p]].num!
=d[j][m[p]].num)break;
对相同的项进行处理,若有ai则都为ai否则填上bij
if(p==a)
for(q=0;
q<
q++)
{
if(d[i][n[q]].name=='
){d[j][n[q]].name='
d[j][n[q]].num=d[i][n[q]].num;
continue;
if(d[j][n[q]].name=='
){d[i][n[q]].name='
d[i][n[q]].num=d[j][n[q]].num;
intcompare(intn,intk)相同返回1否则为0
if(d[i][j].name!
=d1[i][j].name||d[i][j].num!
=d1[i][j].num)break;
if(j<
n)break;
if(i<
k)return0;
return1;
c)整体算法说明
1、建立一张n列k行的表,每一列对应一个属性,每一行对应分解中的一个关系模式。
若属性Aj属于Ui,则在j列i行交叉处填上aj,否则填上bij.
2、对于每一个函数依赖做下列操作:
找到Xi所对应的列中具有相同符号的那些行。
考察这些行中li列的元素,若其中ai,有则全改为ai,否则全部改为blmi,m是这些行的行号最小值。
应当注意的是,若某个btli被改动,那么该表的li列中凡是btli的符号均应作相应更改。
对所有函数依赖都逐一进行这样的处置,称为对F一次扫描。
3、比较扫描前后,表有无变化,如有变化,返回2歩。
否则算法终止。
有一行成为a1a2….an。
具有无损连接性,否则不具有。
四、运行结果及分析
例如R<
U,F>
U={A,B,C,D,E},F={AB->
C,C->
D,D->
E},R的一个分解为R1(A,B,C),R2(C,D),R3(D,E)
首先构造初始表,如表1;
A
B
C
D
E
a0
a1
a2
b3
b4
b10
b11
a3
b14
b20
b21
b22
a4
每一个函数对表进行处置得
输入关系的属性组U和关系的函数依赖F
图1
图2
图3
可见改变函数依赖顺序,虽然运行过程变长,但结果不变
图4
此分解不是无损连接分解,最后结果中没有出现a1a2….an序列
五、总结
由于时间紧迫,设计内容减少,没有考虑一些边界问题,而且程序输入格式需要严格输入。
而且存储空间申请很低,所以计算量很小,属性组过多不能计算。
程序对错误输入和超标输入不作任何处理。
但程序在一定程度上完成了判断一个分解是否为无损连接分解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 判别 一个 分解 无损 连接 课程设计 文档