Java 中显示二进制矩阵中的唯一行

2025年3月17日 | 阅读 15 分钟

在本节中,我们将讨论如何在 Java 中显示二进制矩阵的唯一行。在此问题中,给出了一个二进制矩阵,我们需要识别并打印给定的二进制矩阵的唯一行。

示例 1

Display Unique Rows in a Binary Matrix in Java

解释

在上面的输入矩阵中,有 5 行

R1 = {0, 1, 1, 0, 0},R2 = {1, 0, 0, 1, 1},R3 = {0, 1, 1, 1, 1},R4 = {0, 1, 1, 0, 0, 0},以及

R5 = {0, 0, 1, 0, 1}。在这 5 行中,R1 和 R4 行相同,其余行是唯一的。因此,输出中舍弃了 R4 行。

示例 2

Display Unique Rows in a Binary Matrix in Java

解释

在上面的输入矩阵中,有 4 行

R1 = {0, 1, 1, 0},R2 = {1, 0, 1, 0},R3 = {0, 1, 1, 0},R4 = {1, 0, 0, 1}。在这 4 行中,R1 和 R3 行相同,其余行是唯一的。因此,输出中舍弃了 R3 行。

朴素方法

朴素方法很简单。首先,打印第一行,然后检查第二行是否与已打印的行(第一行)匹配。如果匹配,则丢弃第二行;否则,打印第二行。对于第三行,检查它是否与已打印的行(第一行和第二行)匹配。如果不匹配,则不打印第三行;否则,打印第三行。其他行也以相同的方式处理。

实现步骤

以下是实现朴素方法所需的步骤。

步骤 1:逐行遍历矩阵的元素。

步骤 2:对于当前行,检查它是否与任何前一行匹配。

步骤 3:如果当前行与前一行匹配,则不打印当前行。

步骤 4:否则,显示当前行。

让我们看看上述算法的实现。

文件名:UniqueRowsMatrix.java

输出

For the following matrix: 
0 1 1 0 0 
1 0 0 1 1 
0 1 1 1 1 
0 1 1 0 0 
0 0 1 0 1 

The unique rows are: 
0 1 1 0 0 
1 0 0 1 1 
0 1 1 1 1 
0 0 1 0 1 

For the following matrix: 
0 1 1 0 
1 0 1 0 
0 1 1 0 
1 0 0 1 

The unique rows are: 
0 1 1 0 
1 0 1 0 
1 0 0 1

复杂度分析:在上面的程序中,我们将每一行与之前出现的行进行比较,以检查该行是否唯一。在行比较中,我们需要检查一行中的每个元素是否与另一行(列大小)匹配。因此,上述程序的 time complexity 为 O(R2 x C),其中 R 是矩阵中的总行数,C 是矩阵中的总列数。由于我们没有在程序中使用任何辅助数组,因此程序的 space complexity 是常数,即 O(1)。

如果我们观察上述程序,我们会发现有许多子问题被计算了不止一次,导致了指数级的时间复杂度。观察以下内容。

方法:使用二叉搜索树

在此方法中,第一个要求是计算每一行的十进制等效值,并将它们推入二叉搜索树。请注意,二叉搜索树的每个节点包含两个字段:一个用于十进制值,另一个用于行号。

实现步骤

以下是实现二叉搜索树方法所需的步骤。

步骤 1:创建一个不存储重复节点的二叉搜索树。

步骤 2:创建一个方法,将一行转换为十进制,并将十进制值转换为二进制数组。

步骤 3:遍历输入矩阵,并将行插入二叉搜索树。

步骤 4:对二叉搜索树进行中序遍历,将十进制转换为二进制数组,然后显示它。

让我们看看上述算法的实现。

文件名:UniqueRowsMatrix1.java

输出

For the following matrix: 
0 1 1 0 0 
1 0 0 1 1 
0 1 1 1 1 
0 1 1 0 0 
0 0 1 0 1 

The unique rows are: 
0 1 1 0 0 
0 0 1 0 1 
1 0 0 1 1 
0 1 1 1 1

For the following matrix: 
0 1 1 0 
1 0 1 0 
0 1 1 0 
1 0 0 1 

The unique rows are: 
0 1 1 0 
1 0 1 0 
1 0 0 1

复杂度分析:在上面的程序中,我们遍历矩阵的每一行和每一列,time complexity 为 O(R * C)。另外,在二叉搜索树中插入一行的 time complexity 为 O(R)。由于我们插入每一行,因此插入消耗的时间为 R * O(log(R))。因此,上述程序的 overall time complexity 为 O(R * C + R * (log(R)))。在程序中,我们使用辅助空间来存储二叉搜索数组,导致 space complexity 为 O(R),其中 R 是输入矩阵的行大小,C 是输入矩阵的列大小。

方法:使用 TRIE

在此方法中,我们将使用 TRIE 数据结构来查找唯一行。我们知道 TRIE 数据结构是一种高效的数据检索数据结构。使用 TRIE 数据结构,可以优化搜索的复杂性。我们知道输入矩阵是二进制矩阵;因此,我们将对 TRIE 数据结构进行一些定制,其中每个节点将有两个子节点,一个用于 1,另一个用于 0。

实现步骤

步骤 1:创建一个 TRIE 数据结构来存储行。

步骤 2:遍历每一行,并将其插入到上一步创建的 TRIE 数据结构中。由于 TRIE 永远不能包含任何重复条目;因此,当我们遍历重复行以将其插入 TRIE 时;它不会影响 TRIE 数据结构。因此,在遍历完输入矩阵的每一行后,TRIE 中存在的都是唯一行。

步骤 3:遍历 TRIE 数据结构并显示行。

让我们看看上述算法的实现。

文件名:UniqueRowsMatrix2.java

输出

For the following matrix: 
0 1 1 0 0 
1 0 0 1 1 
0 1 1 1 1 
0 1 1 0 0 
0 0 1 0 1 

The unique rows are: 
0 1 1 0 0 
0 0 1 0 1 
1 0 0 1 1 
0 1 1 1 1

For the following matrix: 
0 1 1 0 
1 0 1 0 
0 1 1 0 
1 0 0 1 

The unique rows are: 
0 1 1 0 
1 0 1 0 
1 0 0 1

复杂度分析:在上面的程序中,我们遍历矩阵的每一行和每一列,time complexity 为 O(R * C)。在程序中,我们使用辅助空间来存储 TRIE 数据结构,导致 space complexity 为 O(R * C),其中 R 是输入矩阵的行大小,C 是输入矩阵的列大小。

方法:使用 HashSet

在此方法中,我们将使用 HashSet 数据结构来查找唯一行。我们知道 HashSet 数据结构实现了 Set 接口。因此,HashSet 中不能存在任何重复数据。该方法是将 HashSet 的每一行转换为 String 并将其插入 HashSet。

实现步骤

步骤 1:创建一个 HashSet 数据结构来存储行。

步骤 2:遍历每一行,并将其插入到上一步创建的 Hash 数据结构中。由于 HashSet 永远不能包含任何重复条目;因此,当我们遍历重复行以将其插入 HashSet 时,它不会影响 HashSet 数据结构。因此,在遍历完输入矩阵的每一行后,HashSet 中存在的都是唯一行。请注意,在将行插入 HashSet 之前,将其转换为 String。例如,

对于以下行

Display Unique Rows in a Binary Matrix in Java

我们将得到字符串“10011”。

步骤 3:遍历 HashSet 数据结构并显示行。

让我们看看上述算法的实现。

文件名:UniqueRowsMatrix3.java

输出

For the following matrix: 
0 1 1 0 0 
1 0 0 1 1 
0 1 1 1 1 
0 1 1 0 0 
0 0 1 0 1 

The unique rows are: 
0 1 1 0 0 
0 0 1 0 1 
1 0 0 1 1 
0 1 1 1 1

For the following matrix: 
0 1 1 0 
1 0 1 0 
0 1 1 0 
1 0 0 1 

The unique rows are: 
0 1 1 0 
1 0 1 0 
1 0 0 1

复杂度分析:在上面的程序中,我们遍历矩阵的每一行和每一列,time complexity 为 O(R * C)。在程序中,我们使用辅助空间来存储 Hash 数据结构,导致 space complexity 为 O(R * C),其中 R 是输入矩阵的行大小,C 是输入矩阵的列大小。