查找行之间矩阵的公共元素

时间:2017-02-17 07:58:36

标签: algorithm matrix

如果有4 * 2矩阵: A = [1,2; 3,4; 5,6; 7,1] 我需要找到至少包含这些行之间共同元素的行。例如,在上面的例子中,1行和4行共有1个。这个矩阵行可以很长。什么是最好的算法/逻辑

我尝试了以下算法:

for(i=0;i<N;i++){
    for(j=i+1;j<N;j++){
        if(ipArr[i][0] == ipArr[j][0] || ipArr[i][0] == ipArr[j][1] ||
           ipArr[i][1] == ipArr[j][0] || ipArr[i][1] == ipArr[j][1]){
              //code to perform for repeating row, having atleast 1 common element.
        }
    }
}

对我来说,矩阵只有2列,只有2列。它有N行

没用完

2 个答案:

答案 0 :(得分:0)

我没有详细的算法,但我会将其作为图算法问题。将每一行视为图的顶点。如果两行具有至少一个共同的元素,则顶点之间存在边缘。然后,如果我正确理解您的问题,您将尝试查找图表的连接组件。 (图形的连通分量是一个子图,其子属性中子图中的所有顶点都通过路径相互连接,并且不连接到超图的任何其他顶点。)

这分为两部分:

  1. 找到一种计算边是否连接两行的方法,并根据该方法构建图形表示。
  2. 查找图表的连接组件。
  3. 对于第二部分,有标准算法,如this Wikipedia article中所述。让我们转到第一部分。

    判断两行是否具有共同元素的一种方法是将元素转储到两个集合结构中,并检查两个集合的交集是否为空。许多编程语言都具有内置的集合数据结构(通常基于散列),以便相当容易地完成此任务(在编程工作方面)。但是,这不会非常有效,特别是对于大量行。但是,它可能足以满足您的目的。

    如果时间复杂度很重要,我倾向于尝试稍微不同的方法:对每一行进行排序。这会在开始时创建额外的工作,但在成对比较所有行时会得到回报。例如,通过比较最小值和最大值,您可以快速检测两行是否具有不相交的值范围(因此不可能具有共同的元素)。此外,如果对行进行排序,您可以(通过一些仔细的簿记)对两行进行耦合线性扫描,以便在线性时间内搜索公共元素。

答案 1 :(得分:0)

此解决方案假设您的主要目的是找到您在评论中提到的人与人之间的相似之处

让每个人(数字)成为一个节点,一行成为权重为1的边缘。

现在用这个构建一个无向图。

让每个节点也存储它的相似性&#39;与每个其他节点。这可以通过从该节点到每个其他节点的最短路径找到。 (每个节点需要O(n)空间)

使用Floyd Warshall算法获取从一个节点到每个其他节点的最短路径。

如果最短路径是Inf,则表示没有相似性,最小最短路径是最大相似度

时间复杂度:O(n ^ 3)其中n是人数/数字

空间复杂度:O(n ^ 2)