问题描述
到目前为止我做过的事情:我有一组地图(数据库的一种),其中每个集合都是字符串的集合(由医生测量的不同特征)。看起来像这样:
{{"temperature","blood pressure"}: Model1,{"temperature","weight"}: Model2,"blood pressure","weight"}: Model3}
每个集合都映射到用于该特定测量的ML模型。集合可能具有不同数量的要素,要素重叠(例如,“温度”频繁出现)。
任务:医生进行了一些测量,例如G。有人只测量{"temperature","weight"}
。我必须检查数据库中的哪些集合在此集合中包含在内,所以我知道该数据可以使用哪种模型。 G。对于此示例,有Model2可用。如果模型不需要所有测得的特征也可以-我只要求模型不需要比测得的特征更多的特征。我需要一种数据结构来有效地进行此类查询。
数据:尚未以任何方式进行组织,我也未绑定到特定语言(我更喜欢Python,因为应用程序的其余部分都在其中,但这不是必需的)。我可以按要求的任何方式对其进行修改,例如G。通过字符串ID识别模型,或将其扔到一些关系/非关系数据库中。
问题:哪种数据结构/数据库类型/数据组织对此类查询有效?我愿意自己实现数据结构,也可以使用sql,MongoDB或任何其他解决方案。
解决方法
您想要的数据结构是特里。也就是说,以规范的顺序对特征进行排序(字母顺序,模型中特征的出现频率更为有效),然后将它们放入嵌套结构(models,further_lookups)
中,如下所示:
([],{
'blood pressure': ([],{
'temperature': ([Model1],{
'weight': ([Model3],{})
}),}),'temperature': ([],{
'weight': ([Model2],{})
}),})
现在给定了一组特定的字段,您可以沿自己的路径导航并收集您遇到的所有模型。也就是说,[]
开始,{{1}之后的[]
和'temperature'
之后的[Model2]
。
请注意,您必须尝试使用和不使用任何特定字段。因此,如果您也有'weight'
,则需要同时尝试搜索有'blood pressure'
和没有'blood pressure'
的模型。递归很容易做到这一点。从理论上讲,您所拥有的功能数量可能要花费指数时间,但实际上却不太可能。
我不建议在数据存储中良好地实现Trie。