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

Algorithm 在行之间查找矩阵的公共元素,algorithm,matrix,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][

如果有一个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.
        }
    }
}

用于(i=0;i我没有为您提供详细的算法,但我会将其视为一个图形算法问题。将每一行视为一个图形的顶点。如果这两行至少有一个共同元素,则顶点之间存在一条边。然后,如果我正确理解您的问题,您将尝试查找图形的连接组件。(图的连接组件是一个子图,其特性是子图中的所有顶点通过路径相互连接,而不连接到父图的任何其他顶点。)

这可分为两部分:

  • 找到一种计算两行是否由边连接的方法,并在此基础上构建图形表示
  • 查找图形的连接组件
  • 对于第二部分,有标准算法,如中所述。因此,让我们转到第一部分

    决定两行是否有一个共同元素的一种方法是将元素转储到两个集合结构中,并检查两个集合的交集是否为空。许多编程语言都有内置的集合数据结构(通常基于散列),这样做相当容易(就编程工作而言)。但是,这将不是非常有效,特别是对于大量行。但是,对于您的目的来说,它可能已经足够好了


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

    此解决方案假定您的主要目的是找到人与人之间的相似性,正如您在评论中提到的那样

    让每个人(数字)都是一个节点,一行是权重为1的边

    现在用这个建立一个无向图

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

    使用Floyd-Warshall算法计算从一个节点到另一个节点的最短路径

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

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


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

    您是指所有具有共同元素的行对吗?还是想要一对行?还是想要更大的行组,所有行都共享一个共同元素?(这些问题都不容易,但我认为最后一个问题要难得多,而且还需要进一步定义。)还有,“最佳”是什么意思?时间性能?内存使用?其他?它主要是一种算法,用于分类并找出有多少组行具有公共元素,一个组可以有>=2行,我需要找到属于每个组的每一行。详细信息越多越好。如果1,2,3行具有公共元素,那么1,2,3一起形成一个组,问题就越少这是一些定义。假设您有行(1,2,3),(2,5,6),(3,5,7)。每行都有一个与其他两行相同的元素,但没有一个元素对所有三行都是公共的。这应该如何分组?如果第三行是(4,5,7),那么它不再有一个与(1,2,3)相同的元素呢?这种分组在这里形成了一种隐含分组,所有上述9个元素都属于同一组。如果元素在至少2行(即>=2行)中表现出公共性,则实现公共性属性。主要目的是找出有多少行具有重复元素,可以是相同的元素,也可以是不同的元素请确保倒立。如果,比方说,我是按顺序将行分类为组,那么新行只有在它没有与任何现有组的任何行相同的元素时才会启动新组。另一方面,如果它至少有一个元素与某个组的至少一行相同,它就会进入该组。如果它至少有一个与行相同的元素从多个组中,所有这些组与新行合并为一个组。对吗?