C++实现属性集闭包算法

本文介绍如何使用C++实现属性集闭包算法。针对关系R(A,B,C,D)及FD集(AB->C,D->A,C->D),探讨如何求解{A,B}的属性闭包。" 96838938,5747818,RecyclerView万能适配器详解,"['RecyclerView', '适配器', 'Android开发', '布局', '泛型']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

input:关系R(A,B,C,D)以及R的FD(函数依赖)集,如AB->C,D->A,C->D

inout:求出{A,B}的闭包
源码:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> DivideFD(vector<string> fd){
    vector<string> v1;
    for(size_t i=0;i<fd.size();i++){
        //我只能用迭代器的方式截取字符串吗?
        //利用find()实现
        //找到'>'出现的位置ok
        auto position1=fd[i].find(">")+1;
        auto position2=fd[i].find("-");
        string sRight(fd[i].begin()+position1,fd[i].end());
        //cout<<sRight<<endl;
        string sLeft(fd[i].begin(),fd[i].begin()+position2);
        //cout<<sLeft;
        if(sRight.size()>1){//开始分割。
            for(size_t j=0;j<sRight.size();j++){
                string s1="->";
                string sLeft1=sLeft;
                sLeft1+=s1+sRight[j];
                //cout<<sRight[j]<<endl;
                v1.push_back(sLeft1);
                //cout<<v1[i]<<endl;
            }
        }else{
            v1.push_back(fd[i]);
            //cout<<v1[i]<<endl;
        }
    }
    return v1;
} 
bool HaveIt(string s,string s1){
    for(size_t i=0;i<s1.size();i++){
        //cout<<s1[i]<<"   "<<s.find(s1[i])<<endl;
        if(s.find(s1[i])>=s.size()){//没找到返回false
            return false;
        }
    }
    return true;
}
int main(){
    
    vector<string> fd;
    int numFD=0;
    cin>>numFD;
    for(int i=0;i<numFD;i++){
        string s11;
        cin>>s11;
        fd.push_back(s11);
    }
    string s;
    cin>>s;
    //转换为一般输入形式
    //求{A,B}+
    vector<string> v1=DivideFD(fd);
    // for(auto v11:v1){//测试分割函数
    //     cout<<v11<<endl;
    // }
    for(int i=0;i<2;i++){
        for(auto v11:v1){
            auto position1=v11.find(">")+1;
            auto position2=v11.find("-");
            string sRight(v11.begin()+position1,v11.end());
            string sLeft(v11.begin(),v11.begin()+position2);
            if(HaveIt(s,sLeft)&&!HaveIt(s,sRight)){
                s+=sRight;
            }
        }
    }
    
    cout<<s<<endl;

    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值