1.概述

在本教程中,我们将讨论找到链接列表的交点。一开始,我们将讨论发现两个列表交叉点的不同方法。

之后,我们将展示如何概括这些方法来查找多个列表的交叉点。

最后,我们将结束比较,以显示讨论的方法之间的主要差异。

2.定义

我们需要定义多个列表的交点。让我们参加以下例子:

在该示例中,我们有三个列表一种B., 和C。此外,我们有R.,这代表了前三个的交叉点。

要计算多个列表的交叉点,我们需要确定它们之间的相互元素。在上面的示例中,相互元素用红颜色标记。

这里有一件事是重复超过一次值的情况。在这种情况下,结果R.必须包含它的最小重复数量。例如,如果值重复两次值一种,三次B.和两次C, 然后R.将包含两次。

因此,问题减少了找到一些给定列表的交叉点。为简单起见,我们将首先讨论在两个列表的情况下解决问题的许多方法。

之后,我们将看到如何概括所有讨论的方法,以便他们可以处理多个列表。

3.天真的方法

在天真的方法中,我们将遍历第一个列表的所有元素。对于每个元素,我们检查它是否存在于第二个内部。

考虑实施天真的方法:

QuickLatex.com呈现

首先,我们定义R.作为一个空名单,它将持有问题的答案。此外,我们设置了一个迭代器it这一点到了一种

之后,我们遍历所有元素一种。对于每个元素,我们检查是否B.包含相同值的元素。如果是这样,我们将元素添加到结果R.

此外,我们删除了该元素B.请注意\ boldsymbol {erase}函数应该只删除元素的第一个外观\ boldsymbol {b}。原因是,如果元素在两者中重复多次一种B.,我们需要两次添加两次R.

一旦完成元素检查,就移动迭代器it转发到下一个元素。

最后,我们返回结果R.

天真方法的复杂性是\ boldsymbol {o(n \ times m)}, 在哪里N是元素的数量一种m是元素的数量B.

原因是B.没有排序。因此,我们需要执行线性搜索以检查每个元素的存在。

4.更快的方法

4.1。大概的概念

在简单的方法中,我们在内部执行一个线性搜索操作B.找到元素是否存在于它内部。让我们考虑如何改进此搜索雷竞技app官网网站。

我们可以在里面添加元素B.到A.树瓣然后在它内部执行快速搜索。但是,这将导致重复的元素仅添加一次。因此,我们将无法处理重复元素的情况。

另一种方式是在里面添加所有元素B.到A.treemp.或者Hashmap.。在本教程中,我们将使用treemp.

这个想法是计算里面的每个元素的重复次数\ boldsymbol {b}。例如,如果在内部重复值五次重复B.然后我们有地图[5]= 3

现在,我们可以简单地检查内部一些值的存在B.通过检查其重复。如果重复大于零,则该值存在,并且我们可以将其添加到答案中。

此外,从中删除第一个出现值B.变得更容易。擦除一个元素\ bolsymbol {B},我们将重复一对一减少。

4.2。执行

让我们来看看更快的方法的实施:

QuickLatex.com呈现

与天真的方法类似,我们初始化空列表R.这将使结果答案对此问题。此外,我们初始化零的地图。原因是,如果我们要查找重复一些值,并且尚未添加,则该地图应返回默认值,零。

接下来,我们遍历内部的所有元素B.。对于每个元素,我们在映射中增加其值的重复次数,然后移动到下一个元素。

之后,我们遍历里面的所有元素一种。对于每个元素,我们检查内部的值是否重复地图大于零。如果是这样,我们将它添加到结果中R.减少一次重复。同样,我们移动迭代器it向前一步到达下一个元素。

最后,我们返回结果R.

这种方法的复杂性是\ boldsymbol {o(n \ times log(m)+ m)}, 在哪里N是第一个列表中的元素数量,以及m是第二个内部的元素数量。

请注意,将较大的列表添加到地图始终是最佳的,并遍历较小的列表。原因是o(log(n))<o(n)

5.特殊情况

让我们描述一些特殊情况。由于较快的方法具有更好的复杂性,我们将讨论它的改进而不是天真的方法。

5.1。小整数方法

假设列表中的元素是小的整数值。在这种情况下,我们不需要使用atreemp.。相反,我们可以使用一系列大小maxvalue., 在哪里maxvalue.是里面的最大值一种B.

因此,变量\ boldsymbol {map}内部算法2应该是阵列,而不是作为一个treemp.。对于初始化,我们必须使用zeroes初始化此数组中的所有元素。之后,我们迭代的元素B.并通过一个增加重复其价值。

除了概念之外,实施保持不变地图现在是一个数组。

请注意,如果其中一个列表包含较小的值,则可以最佳计算此数组的重复。原因是值的maxvalue.会更小。

此外,我们需要更新算法一点。在迭代的元素时\ boldsymbol {a},如果其中一个元素大于\ boldsymbol {maxvalue},我们立即继续检查重复。原因是它的重复肯定会为零,我们不想超出数组的范围地图

这种方法的复杂性是\ boldsymbol {o(n + m + maxvalue)}, 在哪里N是第一个列表的大小,m第二个的尺寸是多少maxvalue.是其中一个的最大值,以最低的是那么最低。

5.2。排序列表方法

第二个特例是我们有两个列表排序。在这种情况下,我们可以提出一种全新的方法。

我们会同时遍历两个列表。在每个步骤中,我们将移动值较小的迭代器。如果两个迭代器达到相同的值,我们将其添加到结果并移动两个迭代器。

看看这种方法的实现:

QuickLatex.com呈现

与以前一样,我们初始化空列表R.包含得到的答案。但是,在这种方法中,我们获得了两个迭代器答案毕伯里迭代两者一种B.

在每个步骤中,我们向前移动指向较小值的迭代器。尽管如此,如果两个迭代器指向两个值,其中值相等,那么我们将此值添加到结果并移动两个迭代器。

这种方法背后的想法是,如果两个迭代器都指向不同的值,那么我们必须移动其中一个。但是,由于两个列表都是排序的,因此在其他列表中不再找到较小的值。原因是另一个迭代器已经指向更大的值。

因此,将指向较小值的值始终是最佳的。

这种方法的复杂性是\ boldsymbol {O (n + m)}, 在哪里N是第一个列表中的元素数量m是第二个内部的元素数量。

6.多个列表的交叉点

如果我们有两个以上的列表并且需要计算所有这些列表,我们可以更新任何先前描述的方法。

在开始,我们可以使用任何所述方法计算前两个列表的交叉点。接下来,我们可以计算结果的交叉点,第三个,等等。

这个操作继续进行,直到我们得到最终结果。

使用这种方法的复杂性与计算每两个列表的交叉点的复杂性有关。但是,我们应该单独增加每个步骤的复杂性

例如,如果我们有三个列表,我们能够使用排序的列表方法,复杂性将是O(n + m + k), 在哪里N是第一个的大小,m第二次的大小是多少K.是第三个的大小。

7.比较

让我们看一下所有先前讨论的方法之间的比较:

QuickLatex.com呈现

请注意,内存复杂性描述了算法分配的额外内存。因此,它没有描述两个列表分配的内存。

正如我们所看到的,在一般情况下,总是推荐使用更快的方法,因为它具有较低的复杂性,并且不会比已经被两个列表消耗的内存更大。

然而,小型整数方法和排序的列表方法都在其各自的特殊情况下是有用的。

当列表中的至少一个的值很小时,我们应该考虑使用小整数方法。但是,我们必须注意,在这种情况下,我们正在分配记忆o(maxvalue)。这种内存必须相对较小,能够使用这种方法。

另一方面,如果它们排序,那么我们应该使用排序列表方法,因为它提供了最低的复杂性,并且不会消耗额外的内存。

结论

在本教程中,我们讨论了找到链接列表的交叉点的问题。首先,我们描述了天真的方法并改善了它以获得更好的方法。

其次,我们提出了一些特殊情况,并显示了实现每个人所需的更新。

第三,我们解释了如何更新所有方法以获取多个列表的交点。

最后,我们总结了一个比较表,该表列出了所有讨论的方法之间的主要差异。

1评论
最老的
最新
内联反馈
查看所有评论
史蒂夫
史蒂夫
7个月前

谢谢今天早上的精神刺激!

评论在本文上关闭!