有一个包含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和加权平均值。
可以用哪种算法来实现这个目标?
答案 0 :(得分:0)
由于目标"百分比"只是近似值(因此不是实际约束条件),让我们尝试删除它并找到Amount
的解决方案。这只会使问题更容易。
剩下的是Subset Sum Problem,它是NP-complete。有简单的指数时间解决方案和偷偷摸摸的伪多项式时间解决方案,但我不认为它们中的任何一个对于10 6 行的表都是实用的。
如果这是一个学术练习,我建议你写出你能想出的最聪明的伪多项式时间解决方案。如果它是现实世界中的任务,我建议你回到给你的人,解释一个确切的解决方案是不切实际的,并协商一个近似的解决方案。