Algorithm 用于将矢量与“合并”的快速数据结构;don';“你不在乎吗?”;

Algorithm 用于将矢量与“合并”的快速数据结构;don';“你不在乎吗?”;,algorithm,vector,time-complexity,cluster-analysis,Algorithm,Vector,Time Complexity,Cluster Analysis,我有一个相当大的具有整数坐标的nD维向量集合(d约为50),除了在某些情况下坐标是一个特殊的哨兵“不在乎”值,我将用*表示。我试图找到一种有效的算法来合并所有相互比较相等的向量,其中“相等”表示“向量中的每对坐标匹配,假设*项可以匹配任何东西。”例如,给定这些行向量: [* 1 2 * *] [1 1 * 2 *] [2 1 3 * 1] [2 * 3 * *] [1 * 3 4 *] 我们将它们分为以下几类: [* 1 2 * *], [1 1 * 2 *] [2 1 3 * *], [2

我有一个相当大的具有整数坐标的nD维向量集合(d约为50),除了在某些情况下坐标是一个特殊的哨兵“不在乎”值,我将用*表示。我试图找到一种有效的算法来合并所有相互比较相等的向量,其中“相等”表示“向量中的每对坐标匹配,假设*项可以匹配任何东西。”例如,给定这些行向量:

[* 1 2 * *]
[1 1 * 2 *]
[2 1 3 * 1]
[2 * 3 * *]
[1 * 3 4 *]
我们将它们分为以下几类:

[* 1 2 * *], [1 1 * 2 *]
[2 1 3 * *], [2 * 3 * *]
[1 * 3 4 *]
要求是所有集群中的所有向量都必须成对相等。可能有很多方法可以将符合这些标准的事物聚集在一起,因此对于“不太多”的松散定义,应该有“不太多”的聚集

当然,可以通过两两比较所有向量并配对匹配的向量,然后重复这个过程,直到所有向量都聚集在一起。另一个选项(我们目前使用的)是从它自己的集群中的第一个向量开始,然后为每个向量检查它是否匹配任何现有集群,或者是否需要进入它自己的集群。这些方法要么是二次的,要么是与向量数乘以集群数的乘积成正比的,这对于我们的应用程序来说不够快


有没有有效的算法来解决这个特殊的问题?

所以看起来这个问题是NP-难的-而且不仅是NP-难的,它是NP-难的问题之一,很可能很难得到一个近似的答案

为了说明这一点,这里有一个从色数问题(给定一个图,给它上色所需的最小颜色数是多少?)到这个问题的快速简化。我将用一个例子来说明。假设我们有这个图表:

   A -- B -- C
   |    |    |
   D -- E -- F
我将从这个图开始,用“不关心”形成一组向量,这样每个集群对应于一组节点,它们之间没有边(一个独立的集合)。总的来说,每个簇将代表一组可以赋予相同颜色的节点,因此找到最小簇对应于找到图的色数

由于图中有六个节点,每个向量将有六个分量。我们将在图中每个节点形成一个向量。例如,节点A的向量将为

[ 0 1 * 1 * * ]
向量的列依次表示节点A、B、C、D、E和F。A列中的0表示“这是A的向量”。B和D列中的1表示“从该节点到节点B和D有边”。其他列中的*”表示“该节点和其他节点之间没有任何边。”如果我们形成图中所有节点的向量集,我们将得到:

     A B C D E F
A: [ 0 1 * 1 * * ]
B: [ 1 0 1 * 1 * ]
C: [ * 1 0 * * 1 ]
D: [ 1 * * 0 1 * ]
E: [ * 1 * 1 0 1 ]
F: [ * * 1 * 1 0 ]
现在,想象一下试图将这些向量聚类。请注意,如果选取任意两个相邻节点(例如,B和E),它们的向量不匹配,因为B向量在B列中有一个0,而E向量在B列中有一个1。但是,如果您选择任何不相邻的节点,则它们将匹配,因为

  • 节点本身的列在一个向量中有0,在另一个向量中有*,因为每个向量都标记了它是哪个节点,并且它们之间没有边,并且
  • 每个向量中的每一列都是1或*
总的来说,这意味着向量的集群对应于节点的集合,这些节点之间没有边,因此找到一个最小的集群可以为图着色。在这种情况下,请注意,通过使A、C和E为相同颜色,B、D和F为另一种颜色,原始图形可以是2色的。如果我们看一下向量,它们可以聚集成A、C、E和B、D和F:

     A B C D E F
A: [ 0 1 * 1 * * ]
C: [ * 1 0 * * 1 ]
E: [ * 1 * 1 0 1 ]

B: [ 1 0 1 * 1 * ]
D: [ 1 * * 0 1 * ]
F: [ * * 1 * 1 0 ]
更一般地,给定一个具有n个节点的图,这种形式的n个向量(其中每个向量对应于一个节点)在该节点的列中有一个0,在每个相邻节点的列中有一个1,在所有其他列中有一个*。簇的最小数目对应于原始图的色数,这种减少可以在多项式时间内完成

问题是,求图的最小色数的问题是NP难的,并且没有已知的近似算法能够接近常数因子近似。因此,除非P=NP,否则对于我描述的原始问题可能没有好的近似算法


我需要解决的问题的特殊情况可能更容易近似,因此我可能会发布一个后续问题,其中包含我试图做的事情的更多细节。

您有关于整数坐标范围的一些信息吗?还有什么是“相当大的”?向量的数量是几十万,整数坐标的范围大概是几万到几十万。有一点我不清楚:V1可以匹配V2,V2可以匹配V3,但V1可能不匹配V3。那么,这里是否有一些选择,例如最小化向量组(每个向量只属于一个组)?或者你想在这个例子中有两个组(V1,V2)和(V2,V3)?好问题!每一个向量都必须只属于一个组,所以我们的目标是尽量减少组的数量,或者只是“随它来”吗?