有这两个表:
TableA
ID Opt1 Opt2 Type
1 A Z 10
2 B Y 20
3 C Z 30
4 C K 40
和
TableB
ID Opt1 Type
1 Z 57
2 Z 99
3 X 3000
4 Z 3000
在这两个表之间找到任意关系的好算法是什么?在这个例子中,我希望找到TableA中包含Op1 = C
和TableB中Type = 3000
的记录之间的明显关系。
我能以某种方式想到先验,但似乎不太实际。你们说什么?
感谢。
答案 0 :(得分:1)
这听起来像关系数据挖掘问题。我建议尝试Ross Quinlan的FOIL:http://www.rulequest.com/Personal/
答案 1 :(得分:1)
在伪代码中,一个天真的实现可能看起来像:
1. for each column c1 in table1
2. for each column c2 in table2
3. if approximately_isomorphic(c1, c2) then
4. emit (c1, c2)
approximately_isomorphic(c1, c2)
1. hmap = hash()
2. for i = 1 to min(|c1|, |c2|) do
3. hmap[c1[i]] = c2[i]
4. if |hmap| - unique_count(c1) < error_margin then return true
5. else then return false
这个想法是这样的:对每列的元素与彼此列进行成对比较。对于每对列,构造链接两列的相应元素的哈希映射。如果哈希映射包含与第一列的唯一元素相同数量的链接,那么您将拥有完美的同构;如果你还有一些,你就有一个近同构;如果你有更多,直到第一列中的元素数量,你可能没有代表任何相关性。
输入示例:
ID & anything : perfect isomorphism since all of ID are unique
Opt1 & ID : 4 mappings and 3 unique values; not a perfect
isomorphism, but not too far away.
Opt1 & Opt1 : ditto above
Opt1 & Type : 3 mappings & 3 unique values, perfect isomorphism
Opt2 & ID : 4 mappings & 3 unique values, not a perfect
isomorphism, but not too far away
Opt2 & Opt2 : ditto above
Opt2 & Type : ditto above
Type & anything: perfect isomorphism since all of ID are unique
为了获得最佳结果,您可以双向执行此过程 - 即将table1与table2进行比较,然后将table2与table1进行比较 - 以查找双射映射。否则,你可以被琐碎的情况抛弃......第一个中的所有值都是不同的(完美的同构)或者第二个中的所有值都是相同的(完美的同构)。另请注意,此技术提供了一种排序或测量列相似或不相似的方式。
这是朝着正确的方向发展吗?顺便说一下,这是O(ijk),其中table1有i列,表2有j列,每列有k个元素。从理论上讲,如果你能在不进行成对比较的情况下找到相关性,你可以为方法做的最好的是O(ik + jk)。