algorithm - 在子集上定义的函数总和
问题描述
我想知道它们是否是解决以下问题的任何快速方法。我有数千个代码列表(A0, A1, A2, ...)
。大约有一百万种不同的组合具有正值(A0-A1, A2-A10, A1-A2-A10, ...)
。让值表示f(A0-A1)
。请注意,并非所有组合都有附加值。
对于每个列出的组合,我想计算附加到包含给定组合的每个集合的值的总和。例如,对于A2-A10
,计算
g(A2-A10) = f(A2-A10) + f(A1-A2-A10) + ...
我想以最小的时间复杂度做到这一点。一个更简单的相关问题是找到所有g(C)
大于阈值的组合。
解决方案
使用位图对现有组合进行键控,其中位n
表示 An
是否在该特定编码中。将位图键控的值存储在您最喜欢的散列图结构中。因此,f(A0, A1, A10, A12) 将是combo_val[11000000001010000...]
要汇总所有所需的组合,请构建根的位图。例如,使用上面的组合,我们将有root = 1100000000101000
(为了说明起见,总共截取 16 个元素。
现在只需循环遍历哈希图的键,root
用作掩码。对所需值求和:
total = 0
for key in combo_val.keys()
if root && key == root
total += combo_val[key]
这会让你感动吗?
推荐阅读
- oracle11g - 从 CLOB 列中提取某些行
- php - PHP - 将相同长度的数组合并为关联
- sqlite - 如何在 Raspberry 上的 SQLite 中创建表
- datediff - 如何计算 apache Drill sql 中的日期差异以在几分钟内获得输出?
- recursion - 在递归函数中使用局部变量
- bash - 如何使用shell脚本运行exe
- python - 如何根据osmnx上的一些“手动选择”节点绘制路径?
- spotify - 希望从经过身份验证的 Spotify 用户帐户中获取 Artist_id
- typescript - 如何使用 Protractor 从 TypeScript 中的函数返回数组?
- c++ - C++中结构数组的clang格式奇怪的缩进