Algorithm 如何在层次结构中定位数据项位置?

Algorithm 如何在层次结构中定位数据项位置?,algorithm,Algorithm,我需要开发一种算法,可以在某些层次结构中定位数据项的位置。我有对一些数据集的元素进行分类的层次结构。层次结构是分类的-top元素是最通用的类,它匹配数据集的任何元素,较深的元素包含与数据集的某个子集匹配的更具体的类 例如,考虑游艇的等级结构。我们有一流的游艇在顶层。在下一级,我们有帆船和机动游艇。帆船有两个孩子——游船和赛艇。巡洋舰可按制造商进一步划分,例如巴伐利亚游艇和杜福尔游艇。然后根据船体类型、长度、帆面积等进一步划分每一类 这是数据集中的一个示例: Drive Class Man

我需要开发一种算法,可以在某些层次结构中定位数据项的位置。我有对一些数据集的元素进行分类的层次结构。层次结构是分类的-top元素是最通用的类,它匹配数据集的任何元素,较深的元素包含与数据集的某个子集匹配的更具体的类

例如,考虑游艇的等级结构。我们有一流的游艇在顶层。在下一级,我们有帆船和机动游艇。帆船有两个孩子——游船和赛艇。巡洋舰可按制造商进一步划分,例如巴伐利亚游艇和杜福尔游艇。然后根据船体类型、长度、帆面积等进一步划分每一类

这是数据集中的一个示例:

Drive   Class   Manufacturer   Hull type Len  Sails Area ... Model
Sailing Cruiser Bavaria Yachts Mono-hull 25ft 560sqft    ... Bavaria 32
Sailing Cruiser Dufour Yachts  Mono-hull 27ft 580sqft    ... Dufour 32 Classic
通过按深度优先顺序搜索,我可以轻松地将每个样本映射到层次结构

乍一看,这是一个简单的搜索问题,但也有一些困难

第一个困难:数据项不一定包含所有元素。数据项通常缺少10%到50%的元素。这些元素中的许多都不是很重要,例如游艇驱动只能是马达或帆,因此它不会带来很多信息(只有1位)。使用更重要的元素可以很容易地推断出这些元素,例如,如果我们知道游艇模型,我们可以推断出数据项的所有其他元素(或字段)

第二个困难:某些元素在不同的数据项之间可能会有所不同,即使它们对应于层次结构中的相同位置(相同的游艇模型)。例如,船帆的面积可能会有很大的变化,因为船主会以不同的方式修改游艇的装备,或者只是调整面积值

正如我已经提到的,我需要在层次结构中从数据集中定位不同的数据项。每个数据项可以以不同的精度定位。精度是层次结构中搜索过程停止的深度。换句话说,我需要在层次结构中获取对应于每个数据项的路径,并且该路径可能不完整。例如,算法可以发现数据项对应于Juliet 23游艇,但生产年份仍然未知

如果我能得到多条路径,每个路径都有概率度量,那就太酷了。例如,该算法可以为Juliet 23返回4条不同生产年份的路径,每条路径的概率为25%


现在,我使用深度优先搜索和一些启发式方法来解决这个问题。它给出了很好的结果,但我认为有可能得到更好的结果。也许你可以用更一般的方式来描述这个问题,这样我就可以搜索一些关于它的学术论文。

我认为SQL真的可以帮助你解决困难

第一个困难:使用NVL(字段,如果为空则使用值)

示例:赛艇的打印类型和生产年份(如果存在)

示例:获得生产年份超过2000年的所有游艇

第二个困难是:使用GROUP BY\CASCADING-SQL\DISTINCT\NVL

示例:看看有多少种赛艇

SELECT Y.TYPE, NVL(Y.PRDYEAR, 'UNKNOWN')
FROM T_YACHT Y WHERE Y.CLASS = 'RACING'
SELECT * FROM T_YACHT Y WHERE
NVL(Y.PRDYEAR,TO_TIMESTAMP('01-01-0001','DD-MM-YYYY'))
    > TO_TIMESTAMP('01-01-2000','DD-MM-YYYY')
SELECT Y.TYPE, COUNT(Y.ID) AS YACHT_TYPE
FROM T_YACHT Y
WHERE Y.CLASS = 'RACING'
GROUP BY Y.TYPE