从N个集合中找到k个值集合的算法,从而使k个集合中唯一值的数量最大化

时间:2019-03-26 22:13:51

标签: optimization combinations combinatorics

我有一个<?xml version="1.0" encoding="utf-16"?> <Records count="2"> <Record contentId="1442264" levelId="98" levelGuid="b085b230-e20f-41df-a849-f5d6811447ea" moduleId="167" parentId="0"> <Record contentId="1608202" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0"> <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16913</Field> <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608202</Field> </Record> <Record contentId="1608204" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0"> <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16915</Field> <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608204</Field> </Record> <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" type="6">1442264</Field> </Record> <Record contentId="1445144" levelId="98" levelGuid="b085b230-e20f-41df-a849-f5d6811447ea" moduleId="167" parentId="0"> <Record contentId="1608203" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0"> <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16914</Field> <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608203</Field> </Record> <Record contentId="1608205" levelId="155" levelGuid="20b8e343-96c0-4aed-804c-7e40b489f31b" moduleId="537" parentId="0"> <Field id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" type="6">16916</Field> <Field id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" type="6">1608205</Field> </Record> <Field id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" type="6">1445144</Field> </Record> <Metadata> <FieldDefinitions> <FieldDefinition id="2260" guid="a69370c5-b6a7-4e20-a073-dd6bbd131e43" name="Issue ID" alias="Finding_ID" /> <FieldDefinition id="17169" guid="ed20bfb9-d2e9-44c2-9b22-5e39d26beae4" name="CAP ID" alias="Remediation_Plan_ID" /> <FieldDefinition id="17182" guid="e950ebab-1bf6-4fc8-818b-88a54fd12f89" name="CAP Title" alias="Name" /> <FieldDefinition id="27556" guid="d378d42e-42da-4a23-906a-722fcb7d761e" name="X - Tracking ID" alias="X__Tracking_ID" /> </FieldDefinitions> </Metadata> <LevelCounts> <LevelCount id="98" guid="b085b230-e20f-41df-a849-f5d6811447ea" count="2" /> <LevelCount id="155" guid="20b8e343-96c0-4aed-804c-7e40b489f31b" count="4" /> </LevelCounts> </Records> 个广告牌数据库,其中提供了看到每个广告牌的所有人的ID。我需要找到N个广告牌中最多的唯一身份人员看到的k个广告牌。

例如:

  • 我有k个广告牌:N = 3'a''b'的人看到了广告牌1,广告牌2是 'c''b'的人看到了'c'和广告牌3的人
  • 'd'
  • 解决方案是1个广告牌和3个广告牌,四个人(k = 2'a''b''c'一起看过

因此,每个广告牌代表一组值,我需要从'd'中找到具有最高唯一值的k个广告牌。

由于潜在的组合数量众多(我的数据库中有超过1万个广告牌),我无法用蛮力做到这一点,有一种算法可以更快地找到最佳解决方案或接近最佳解决方案?速度比获得正确答案要重要得多。

最好,我还希望能够对算法进行约束,以使选定广告牌的成本总和低于某个值,但这并不是严格要求的。

我认为这类似于here中描述的某些组合优化问题,尤其是背包问题here,除了这些问题是针对数字集而不是集合集的问题。我的数学技巧很粗略,因此我无法确定是否可以修改这些方程式以满足自己的需求。

谢谢

0 个答案:

没有答案