搜索子集,算法(最优或启发式)

时间:2013-10-18 02:12:05

标签: java c++ algorithm set-theory

我正在寻找有关问题的搜索算法的帮助。问题可以简化为以下内容。

我们有一个可以采用某些属性的对象 - X1,X2 ...... XN。 N的大小为5000.然而,特定对象采用这些属性的子集,例如Xi ... Xj(大约50)。

配置是属性的特定子集。有一些配置,编号Z(数量级为10万),是最佳的。

输入:

Configuration 1: X1, X2, X3.. Xf
Configuration 2: X4, X6, X7, .. Xz
:
:
Configuration Z: X10, X200… XN

问题:给定某个对象,ALPHA具有属性{Xi ... Xj}的子集,目标是找到最接近该对象的配置。配置可以是对象ALPHA配置的超集。也可能是没有配置具有ALPHA的所有属性。最近的定义为具有ALPHA数量属性最多的配置。

我基本上做了以下的天真解决方案

1. Take each configuration
2. Loop through each attribute of ALPHA
3. Keep track of the configuration with maximum number of matches to ALPHA
4. Pop out the configuration maximum matches.

我认为天真的解决方案是正确的,但它太慢了。有没有一种有效的方法来跨配置进行搜索?如果速度非常快,即使近似启发式也是如此。

添加C ++,Java标记以查看是否有软件可以执行此操作。

感谢。

1 个答案:

答案 0 :(得分:4)

这是一种更好的非启发式方法。反向存储您的最佳配置。 ie 将每个属性映射到它出现的配置。例如(与您的示例无关)

X1 : C1 C4 C5 C99999
X2 : C1 C2
X3 : C1
X4 : C1 C2
...
XN : C100 C200 C300

现在,您创建一个长度为Z的数组来存储您找到的匹配项数。您遍历ALPHA,并为每个属性执行相关配置。对于每个配置,您将一个添加到阵列中的相应位置。

最后,运行数组并选择计数最大的配置。如果您愿意,可以保持运行最大值,但如果您希望总共执行少于Z的比较(ALPHA中的元素数乘以相关配置的平均数),那么效率会更高。

这将找到最佳匹配,并且应该比您天真的解决方案快50倍。