如何比较两个数组之间的所有元素?

时间:2017-08-27 07:53:47

标签: java math graph

我试图编写一个程序,该程序可以识别图中不共享任何公共邻居的所有节点,并且其中所有顶点都包含在图中的各个子系统中。为简单起见,假设所有节点都用数字标记。

例如,在立方体的图形中,最远的角不共享公共节点,并且是共同包含所有顶点的子系统的一部分。

我希望编写一个程序,将每个潜在的子系统与所有其他潜在的子系统进行比较,无论图形,节点数或边数,并找到中心节点不共享的子系统组邻居。为简单起见,假设图形通常不对称,与立方体示例不同,因为这引入了功能相当的系统。但是,子系统中的节点数或阵列中的元素数可能会有所不同。

该程序的目标是找到一组中心节点,其邻居对于子系统都是唯一的,即没有邻居出现在另一个子系统中。这也意味着所有子系统,中心节点和邻居中的节点总数将等于图中顶点的总数。

我最初的计划是使用2d数组,其中行充当子系统的替身。它会将数组中的各个元素与所有其他数组中的所有其他元素进行比较。如果两个数组不包含相似的元素,则索引比较的数组并记录其中心节点,否则将丢弃此迭代。在程序完成对第一行的2d数组迭代之后,它会累计所有记录行中的元素数,以查看是否表示了图中的所有节点。因此,如果一个图包含x个节点,并且记录行中的元素数小于x,那么程序会向下迭代一行到下一个子系统,并将该行中的所有值与之前的所有其他值进行比较。

最终,该系统应该打印出哪些节点可以构成一组子系统,这些子系统包含所有顶点,并且其中心节点不共享共同的邻居。

我对CS的有限接触使得这样的任务变得令人生畏,因为它只是我解决教授提出的难题的方式。我通过猜测和检查方法手动找到系统,但是使用60+节点阵列...

感谢您提供任何帮助,我们非常感谢您提供正确方向的指示。

1 个答案:

答案 0 :(得分:0)

我没有一个好的解决方案(可能没有;它听起来非常接近顶点覆盖)。所以你可能需要采取回溯方式。这个想法如下:

保留未覆盖顶点列表和潜在中心节点候选列表。两个列表最初都包含所有顶点。然后开始从候选列表中放置一个随机中心节点。这将从未覆盖的列表和节点加上来自候选列表的单环和双环中擦除节点及其单环。这样做直到未覆盖的列表为空或者你的候选人用完了。如果你犯了错误,请恢复最后一步(可能还有更多)。

在伪代码中,如下所示:

findSolution(uncoveredVertices : list, centralNodeCandidates : list, centralNodes : list)
    if uncoveredVertices is empty
        return centralNodes //we have found a valid partitioning
    if centralNodeCandidates is empty
        return [failure] //we cannot place more central nodes
    for every n in centralNodeCandidates
        newUncoveredVertices <- uncoveredVertices \ { n } \ one-ring of n
        newCentralNodeCandidates <- centralNodeCandidates \ { n } \ one-ring of n \ two-ring of n
        newCentralNodes = centralNodes u { n }
        subProblemSolution = findSolution(newUncoveredVertices, newCentralNodeCandidates, newCentralNodes)
        if subProblemSolution is not [failure]
            return subProblemSolution
    next
    return [failure] //none of the possible routes to go yielded a valid solution

此处,\是设置减号运算符,u设置为联合。

有几种可能的优化:

  • 如果您知道最大节点数,则可以将列表表示为位图(对于最多64个节点,这甚至适合64位整数)。
  • 您可能会多次检查相同的状态。为避免这种情况,您可能希望缓存导致失败的状态。这是动态编程的精神。