1.概述

在本教程中,我们将讨论从包含的数组配对Socks的问题N袜子对。

首先,我们将定义问题并提供解释它的示例。

其次,我们将呈现一个天真的方法。然后我们将讨论两种不同的方法来改进它,并获得更好的解决方案。

2.定义问题

假设我们有N一对袜子随机分布在长度阵列内2 \ times n。每个袜子可以具有一个或多个规格,例如尺寸,颜色等;因此,我们必须将每个袜子配对另一个相同的规格。

要更清楚地了解这一点,让我们看看一个简单的例子。

让我们说我们有一个数组8.袜子。此外,每个袜子都有特殊颜色和特殊尺寸:

现在假设每个单元格的颜色代表相应袜子的颜色,而在单元内写入的数字表示袜子大小。因此,我们可以找到配对袜子的解决方案:

请注意,在本教程中,我们只会讨论只有一个可能的解决方案;我们不会考虑我们可能有多个答案的情况。

3.天真的方法

3.1。大意

这里的主要想法是迭代袜子。对于每个袜子,我们将尝试找到一个类似于之前配对的类似。

3.2。执行

让我们来看看这样的实现:

QuickLatex.com呈现

最初,我们声明一个名列名单回答,这将作为袜子的成对存储结果。此外,我们声明了一个叫做阵列拍摄,表达了每个袜子是否在之前服用过。此外,我们初始化此数组错误的价值观。

接下来我们迭代袜子。如果之前尚未采取袜子,我们会尝试通过迭代剩余的袜子并检查相似性来找到类似的袜子。如果找到匹配项,我们将类似的袜子添加到回答,并将它们两张挂在一起。

最后,我们回来了回答,它存储给定阵列中类似的袜子对。

3.3。复杂

这里的时间复杂性是\ boldsymbol {o(n ^ 2)}让我们检查这种复杂性背后的原因。

要开始,我们遍历所有的袜子。对于每个人,我们迭代位于阵列内部的所有袜子。我们会发现(2 \ times n)^ {th}袜子会迭代0.袜子因为没有袜子。同样,(2 \ times n  -  1)^ {th}袜子会迭代1袜子,等等。结果,这一步骤将成本0 + 1 + 2 + ... + 2 \ times n  -  1,这等于\ frac {(2 \ times n  -  1)*(2 \ times n)} {2}

4.分拣方法

4.1。大意

这里的主要想法是首先对袜子进行排序。当我们对此进行排序时,类似的袜子将彼此相邻;因此,我们只需要迭代排序的阵列并检查每个袜子。

4.2。执行

让我们来看看这样的实现:

QuickLatex.com呈现

最初,我们声明一个名列名单回答,这将作为袜子的成对存储结果。然后我们对给定的数组进行排序并将其存储在分类

接下来我们迭代袜子,并检查相似之处我^ {th}袜子和袜子{i + 1} ^ {th}一。如果它们是相似的,我们将类似的袜子添加到回答,并增加迭代器一世经过1防止袜子加入多个对。

最后,我们回来了回答,它存储给定阵列中类似的袜子对。

4.3。复杂

这里的时间复杂性是\ boldsymbol {o(n.log_2(n))}让我们检查这种复杂性背后的原因。

这种方法的主要复杂性是排序算法,所以我们更愿意选择一种算法O(n.log_2(n))复杂性作为合并排序。

然后我们遍历所有的袜子一次,我们只需要上)要做到这一点。

5.哈希方法

5.1。大意

这里的主要想法是使用一个hashset.存储类似袜子的最后一个外观。因此,我们迭代袜子,在每一步中,我们检查是否hashset.包含类似的袜子。

5.2。执行

让我们来看看这样的实现:

QuickLatex.com呈现

最初,我们声明一个名列名单回答,这将作为袜子的成对存储结果。我们还宣布hash_set.作为空的hashset.

然后我们迭代袜子,并检查是否hash_set.包含类似的袜子我^ {th}一。如果它,我们添加了两个我^ {th}袜子和类似的袜子hash_set.结果。此外,我们删除了类似的,以防止袜子加入多个对。如果是hashset.不包含类似的袜子,我们添加了我^ {th}袜子hash_set.

最后,我们回来了回答,它存储给定阵列中类似的袜子对。

5.3。复杂

这里的时间复杂性是\ boldsymbol {o(n)}

首先,我们遍历所有的袜子一次,我们只需要上)要做到这一点。在每一步,我们检查是否hash_set.包含一个特殊的袜子,有一个O(1)复杂。此外,从添加和删除的操作hash_set.有一个O(1)复杂。

六,结论

在本文中,我们提出了配对袜子的问题。我们还解释了解决这个问题的三种不同方法背后的主要想法,并通过了他们的实现。

来宾
0.注释
内联反馈
查看所有评论