检查是否存在两个相等的集合

时间:2014-06-04 12:54:19

标签: algorithm set

我有一组J客户和一组设施I。对于每个客户j,设施的K_j<=|I| 距离不同。让这些(已排序的)距离为D_j^1 < D_j^2 < ... < D_j^ {K_j}。对于每个距离,我们定义了一组设施比(顾客j)距离D_j^k距客户j更近(在软意义上)。该集由V_j^k={ i\in I | d_{ij}<=D_j^k }给出。我的问题是,是否有一种智能方法可以检查i,j,k,l是否存在V_j^K=V_i^l?可以假设V_j^k中的索引被排序。我唯一的解决方案就像

for(j in J) do
  for(k in {1,...,K[j]} ) do
    V=V[j][k];
      for(i in J\{j} )
        for(l in {1,...,K[i]} ) do
          compare(V,V[i][l])

其中compare函数只比较两组中的条目。但这有很长的运行时间。有没有一些很好的方法来执行这项任务?

1 个答案:

答案 0 :(得分:1)

你有一个矩阵(M),其中一行对应一个客户。该矩阵的元素是一组设施。 M_cf =包含与客户c最近的设施的集合。在此矩阵中,第一列的元素将是仅包含一个工具的集合,该工具始终是最接近客户的工具。在第二列中,每组都有2个设施等。现在我们将找到具有相同设施的集合。这些集必须在同一列中,否则每个集合中的元素数量将不同,因此集合不能相等。在列f中,您通常需要将所有集合与所有其他集合进行比较以找到相等的集合,这将导致O(f ^ 2)时间复杂度。如果您使用适当的算法对此列中的集进行排序,则可以将其减少为O(f * log(f))。假设O(1)进行比较,总时间复杂度将为O(j * f * log(f)),这比当前的O(j ^ 2 * f ^ 2)更好。