从一组对

时间:2017-06-22 21:54:25

标签: algorithm set load-balancing cardinality

我有一组像

这样的ID
(123;1765)
(1212;8977)...

我需要将这些对分成n组,每组具有个体大小(对数)。这些集应该具有最小基数(=每组中应该尽可能少的不同ID)。 有没有解决这个问题的现有算法?我不知道在哪里/如何搜索它。 这是必要的,因为我目前正在处理我的一个项目的负载平衡,并且由于RAM有限(每个ID连接到更大的数据集),每个节点都必须加载尽可能少的ID。

编辑:
一些背景: 群集中的不同节点必须比较由ID标识的数据集。每个比较都是一对ID(比较ID1与ID2的数据集)。每个节点都获得一堆对,以了解它必须比较哪些ID,并将相应的数据集加载到RAM中。主节点将一大堆对分成较小的串并将它们分配给从节点。由于每个节点只能存储有限数量的数据集,因此这些较小的数据集需要包含尽可能少的不同ID。但是节点具有不同的RAM量,因此具有最小基数的组应该具有不同的大小。 比较是对称的,因此比较(ID1,ID2)与比较(ID2,ID1)相同,因此每对都是唯一的。需要比较的数据集由客户端进行定位,客户端将这些作业作为一堆ID对象发送给主服务器。

一个例子: 客户希望比较数据集(1;2)(7;9)(9;105)(7;105)(2;4)(4;1)(通常这里应该进行更多比较,所以数百万通常) 客户端将这些对发送给主服务器,主服务器有两个已注册的从服务器。现在主人需要将这一堆工作分成两组,但每组中更多不同的ID,从属装置需要加载的数据集越多(ID对应于特定的数据集,还记得吗?)。

理想情况下,主人会创建一个像((1;2), (2;4), (4;1))这样的组(只包含3个不同的ID,因此奴隶只需要加载3个数据集)和((7;9), (9;105), (7; 105))(再次只有三个ID),而不是: ((1;2), (9;105)...)((2;4), (7;105)...)。这两个从设备需要加载4个ID以及更多,例如两个奴隶都需要加载数据集号。 2和105。 这需要以某种方式进行优化..

1 个答案:

答案 0 :(得分:2)

我的第一直觉是,也许这可以通过特殊的聚类分析来解决,您可以在其中自定义聚合和距离函数。

  • 群集成员将成对。
  • 群集聚合将是所有对中的集合 - 理论联合 群集(这不是标准方法中的平均值或中值)。
  • 与群集相比,任何一对的距离函数都是 集群中未找到的元素数量 (所以设定差异的基数;这取代了欧几里德 标准方法中的距离)。
  • 您可以使用某些群集算法设置所需群集的数量 提前,所以你要把它设置为两个。
  • 最后,因为你需要平衡事物以便群集 聚合具有相同数量的元素,进一步调整,但仍然 可行的。

但是,你说你将有数百万点可以比较。群集分析所需的处理按指数增加,您输入的输入越多。在这种情况下,值得研究您的问题是NP还是NP-complete。我并不精通这一点,但我怀疑它是,在这种情况下,真正的最佳状态总会让你失望。

但是,如果你发现你的问题实际上是NP完全的,那么你仍然可以优化,你只是能够保证在合理的时间内达到全局最优。因此,例如,您可以将您的一组对分解为子集,并在子集上运行如上所述的算法。这可能仍然是一种改进。