#求属性闭包的实现
属性闭包:
关系模式 R < U , F > R R<U,F>中, U U U代表全部属性集合, U U U为一组函数依赖关系。
现设属性集 X X X属于 U U U,对 X X X求属性闭包,即为根据推导规则从属性集合 X X X推导出属性集合(闭包) X F + XF^+ XF+
###问题描述:
对于给定的属性集合U,函数依赖集F,都以string类型表示,求某一属性集合X的属性闭包
例题:U={ABCDE},F={A→B, B→C,DA->BC,A->BC,DB->C}, 求属性BC的闭包。
求属性闭包的算法
针对上述例题来讲:
- 令 X i = B C X_i=BC Xi=BC,求取 X i X_i Xi的子集(这里不包含空集而且子集划分为只要元素不同,不考虑顺序),为 B , C , B C B,C,BC B,C,BC,遍历函数依赖集找到左部为 X i X_i Xi的子集部分,找到把函数依赖的右部加入 P P P.
- 令 X i + 1 = X i U P X_{i+1}=X_iUP Xi+1=XiUP,判断 X i + 1 X_{i+1} Xi+1是否和 X i X_i Xi或者和 U U U相等,若相等跳出循环, X i + 1 X_{i+1} Xi+1即为所求闭包,不相等调到步骤1.
思路:
首先是分割字符串提取信息保存函数依赖关系。
对于函数依赖要明确的是如何存储函数依赖。
第一考虑的是用图的邻接矩阵来存储属性之间的依赖关系,但发现用图的思路去思考问题有错误的地方:若AD->C,并不能化为A->C,D->C;所以采用MultiMap保存映射关系。
A->DC 可以变为A->D,A->C
是因为在关系模式中属性列A有相等的两行,属性列DC都有对应位置相等的两行。
但DC->A,不能变化为D->A,C->A.
是因为在关系模式中要求属性列D和C同时有相等的两行时,属性列A也有相等的两行才成立。但D->A,C->A,成立的条件中没有同时的条件,所以上述是不相等的。
####MultiMap
与 map 类似,所不同的是它允许重复键.
基本使用方法:
1.定义:
multimapMap;
2.插入:
Map.insert(make_pair("we","student"));
3.遍历:
for (multimap::iterator it = Map.begin(); it != Map.end(); it++)
{
cout <<(*it).first<< endl;
cout << (*it).second << endl;
}
4.多值查找:
typedef std::multimap::iterator it;
pairres;
res = map.equal_range("we");
while (res.first != res.second)
{
cout << res.first->second << endl;
++res.first;
}
Note:
1.vector重载的赋值运算符必须要求顺序内容和长度都相等
2.二维数组的传地址问题:
//void Process(string F,int (*FD)[MaxLen])
void Process(string F, int FD[][MaxLen])
3.s.substr(0,5);
//获得字符串s中 从第0位开始的长度为5的字符串,默认时的长度为从开始位置到尾.
代码:
注:没有做输入非法处理,假定输入合法
#include
#include
#include