【发布时间】:2016-02-24 00:40:03
【问题描述】:
我有一个二维数组。我需要从每一列中选择一个最佳集合。
最优集合是这样的,即所有这些最优集合中唯一项目的数量最少。
我正在使用 python,但我认为这应该与语言无关。
我当前的方法非常原始,搜索所有可能的选项,这会创建一个非常大的搜索空间。 (10^15 的顺序)
我正在寻找一种不那么天真的方式来查看数据,并减少搜索空间。
在下面的代码中,我知道我可以改进性能,但我对改进算法更感兴趣。
for comb in itertools.product(*value_options):
comb_length = len(set(itertools.chain(*comb)))
if comb_length < best_count:
best = comb
best_count = comb_length
关于数据的更多信息,集合很小,目前它们是两个值但我希望能够支持更多,一组集合中可以有任意数量的集合
我添加了一些测试数据。为了使文件更符合逻辑,文件中的每一行都是上面提到的列之一,每组都用括号括起来。
小套装 http://www.importsoul.net/static/testdata.csv
从这组数据我得到结果
332000.000,348000.000
95300.000,787000.000
48700.000,332000.000
31600.000,64900.000
12700.000,64900.000
5620.000,95300.000
10000.000
我还有一组更大的输入数据,尚未完成运行。 http://www.importsoul.net/static/testdata-large.csv
为了方便导入,这里将测试数据作为 json 格式
【问题讨论】:
-
这可能更适合代码审查 (codereview.stackexchange.com)
-
value_options的样本数据会很有帮助。 -
如果有可能发生,如果发现一个长度最小(0, 1, ?),您可以添加
break条件。 -
集合的大小是否相等?集合中的数字是否限制在某个范围内?
-
这听起来 NP-complete。不过,目前没有想到任何证据。
标签: python algorithm optimization set