我有一组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函数只比较两组中的条目。但这有很长的运行时间。有没有一些很好的方法来执行这项任务?
答案 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)更好。