搜索子集、算法(最优或启发式)
Posted
技术标签:
【中文标题】搜索子集、算法(最优或启发式)【英文标题】:searching through subsets, algorithm (optimal or heuristic) 【发布时间】:2013-10-18 02:12:04 【问题描述】:我正在寻求有关问题的搜索算法的帮助。问题可以简化为以下。
我们有一个可以获取某些属性的对象——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
问题:给定一个特定对象,具有属性子集 Xi…Xj 的 ALPHA 的目标是找到最接近该对象的配置。配置可以是对象 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】:这是一种更好的非启发式方法。反向存储您的最佳配置。 ie 将每个属性映射到它出现的配置。eg(与您的示例无关)
X1 : C1 C4 C5 C99999
X2 : C1 C2
X3 : C1
X4 : C1 C2
...
XN : C100 C200 C300
现在,您创建一个长度为Z
的数组来存储您找到的匹配数。您遍历 ALPHA,并为每个属性遍历关联的配置。对于每个配置,您将一个添加到数组中的相应位置。
最后,您遍历数组并选择计数最多的配置。如果您愿意,您可以保持一个运行最大值,但只有当您希望进行的比较总数少于 Z(ALPHA 中的元素数乘以相关配置的平均数)时,这才会更有效。
这将找到最佳匹配,并且应该比您的幼稚解决方案快约 50 倍。
【讨论】:
谢谢稻田。您的解决方案在直觉上是有意义的。我必须在早上考虑清楚:-)。在较小的测试用例中,它的运行速度确实快了大约 10-20 倍。明天将进行更大的测试并接受您的答案。 不用担心。祝你好运。我建议根据你提到的典型数字加速 50 倍,假设配置均匀分布在这个空间中。情况可能并非如此,但它仍然应该快得多。 好消息!!。程序大约快 25 倍。非常感谢稻谷。以上是关于搜索子集、算法(最优或启发式)的主要内容,如果未能解决你的问题,请参考以下文章