huawei 2021笔试 查找知识图谱中的实例知识 C++ 2021-09-01

通过测试用例供参考

2、查找知识图谱中的实例知识
知识图谱是一种结构化的语义网络, 用于描述物理世界中的概念及其实例的相关关系。可以把知识图谱看成是一种有向图, 图中的点是概念或实例,图中的边是概念及其实例的相关关系。现定义一种简单的知识图谱:概念:包括父概念及其子概念,通过subClassOf关系关联,父子概念可以有多个层级; 实例:仅和概念之间通过instanceOf关系关联;关系:以三元组的形式表示,三元组是一个以空格为成员间分隔符的字符串.例如"student subClassOf person"表示student是person的子概邻念; “apple instanceOf fruit"表示apple是概念fruit的实例。给定一个知识图谱,请编写-个方法,可以根据-个概念看找其所有的实例。如果-个概念拥有子概念,那么返回的结果需要包含其所有子概念的实例;如果输入的概念没有实例,则返回字符串"empty” (说明:输出字符串文本不需要包含引号)。
给定的图谱满足以下限制:
1、有向图中不存在环路;
2、所有点和关系的定义对大小写敏感;
解答要求
时间限制:CIC++ 1000ms,其他语言:2000ms
内存限制:CIC++ 32MB,其他语言:64MB
输入
输入第1行,表示图谱中关系的数量n,取值范围[1,10000];
从第2行到n+1行,表示图谱中的关系,每一行是一个关系三元组。第n+2行,表示待查找的元节点,是关系三元组中存在的点。
每行字符的长度不超过100.
输出
按字典序升序排列的字符串数组,其内容是概念及其子概念的所有实例。

样例1
输入:
3
student subClassOf personTom instanceOf studentMarry instanceOf personperson
输出:Marry Tom
解释: student是person的子概念,Tom是student的实例,Marry是person的实
例,Marry的字典序小于Tom,所以返回Marry Tom。

样例2
输入:
1
apple instanceOf fruitfruit
输出:
apple
解释: apple是fruit的唯—实例,所以返回apple。

#include <bits/stdc++.h>
using namespace std;

vector<string> split(string str)
{
    vector<string> res;
    int pos = 0;
    int i = 0;
    for ( ; i < str.size(); ++i)
    {
        if (str[i] == ' ')
        {
            res.push_back(str.substr(pos, i - pos));
            pos = i+1;
        }
    }
    res.push_back(str.substr(pos, i - pos));
    return res;            
}

void fun(vector<vector<string>>& input, string& gn)
{
    unordered_map<string, vector<string>> gainian;//以父概念为键 子概念为值
    unordered_map<string, vector<string>> shiti;//以概念为键 实体为值

    for (int i = 0; i < input.size(); ++i)
    {

        if (input[i][1] == "subClassOf")//如果是概念 0是子概念 2是父概念
        {
            gainian[input[i][2]].push_back(input[i][0]);
            // cout << "gainian[" << input[i][2] << "] :"  << gainian[input[i][2]].back() << endl;
        }
        else
        {
            shiti[input[i][2]].push_back(input[i][0]);
            // cout << "shiti[" << input[i][2] << "] :"  << shiti[input[i][2]].back() << endl;
        }
    }


    if (gainian.find(gn) != gainian.end())//判断是父概念
    {
        cout << "find....................................................................." << endl;
        // cout << "typeof(gainian[gn]): " << typeid(gainian[gn]).name() << endl;
        for (auto x : gainian[gn])
        {
            // cout << "gainian................." << x <<  endl;
            if (shiti.find(x) != shiti.end())
            {
                for (auto y : shiti[x])
                {
                    // cout << "shiti................." <<  y << endl;
                    cout << y << " ";
                }
            }  
        }
        return;
    }

    if (shiti.find(gn) != shiti.end())//此概念不是父概念
    {
         cout << "finddddddddddddd......................................................" << endl;
        for (auto y : shiti[gn])
        {
            cout << y << " ";
        }
    } 
    return;
  
}



int main()
{

    int n = 1;
    cin >> n;
    cin.ignore();//这个换行有用啊
    
    vector<vector<string>> input(0, vector<string>(3));
    string str;

    for (int i = 0; i < n; i++)
    {    
        getline(cin, str);
        input.push_back(split(str));
    }
    getline(cin, str);
    fun(input, str);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值