找到等于目标加权平均值和目标总和的数字子集

时间:2015-02-08 18:03:22

标签: sql sql-server algorithm

有一个包含100万行的SQL服务器表。样本数据如下所示。 百分比列计算为=((Y / X)* 100)

+----+--------+-------------+-----+-----+-------------+
| ID | Amount | Percentage  |  X  |  Y  |      Z      |
+----+--------+-------------+-----+-----+-------------+
|  1 |     10 | 9.5         | 100 | 9.5 | 95          |
|  2 |     20 | 9.5         | 100 | 9.5 | 190         |
|  3 |     40 | 5           | 100 | 5   | 200         |
|  4 |     50 | 5.555555556 |  90 | 5   | 277.7777778 |
|  5 |     70 | 8.571428571 |  70 | 6   | 600         |
|  6 |    100 | 9.230769231 |  65 | 6   | 923.0769231 |
|  7 |    120 | 7.058823529 |  85 | 6   | 847.0588235 |
|  8 |     60 | 10.52631579 |  95 | 10  | 631.5789474 |
|  9 |     80 | 10          | 100 | 10  | 800         |
| 10 |     95 | 10          | 100 | 10  | 950         |
+----+--------+-------------+-----+-----+-------------+

现在我需要找到行,使得它们的金额值与给定的金额相加,加权平均值与给定的百分比相匹配。 例如,如果目标Amount = 365并且目标百分比= 9.84,那么从给定数据集中,我们可以说ID = 1,2,6,8,9,10的行形成将匹配给定目标的子集。

Amount = 10+20+100+60+80+95
       = 365 
Percentage = Sum of (product of Amount and Percentage)/Sum of (Amount)
(I am using Z column to store the products of Amount and Percentage to make the calculations easier)
       = ((10*9.5)+(20*9.5)+(100*9.23077)+(60*10.5264)+(80*10)+(95*10))/     (10+20+100+60+80+95)
       = 9.834673618

因此,行1,2,6,8,9,10与给定的目标总和和目标加权平均值相匹配。

建议的算法应该在100万行上工作,主要目标是实现加权平均值(百分比)的匹配,金额尽可能接近目标金额。

我发现stackoverflow上几个与匹配目标总和相关的问题。但我的问题是匹配两个目标属性Sum和加权平均值。

可以用哪种算法来实现这个目标?

1 个答案:

答案 0 :(得分:0)

由于目标"百分比"只是近似值(因此不是实际约束条件),让我们尝试删除它并找到Amount的解决方案。这只会使问题更容易。

剩下的是Subset Sum Problem,它是NP-complete。有简单的指数时间解决方案和偷偷摸摸的伪多项式时间解决方案,但我不认为它们中的任何一个对于10 6 行的表都是实用的。

如果这是一个学术练习,我建议你写出你能想出的最聪明的伪多项式时间解决方案。如果它是现实世界中的任务,我建议你回到给你的人,解释一个确切的解决方案是不切实际的,并协商一个近似的解决方案。