查找阵列B中阵列A的哪些元素的有效方法

时间:2017-07-25 15:23:37

标签: arrays algorithm

在我的粒子情况下,我需要一个JavaScript代码,它可以找到阵列B中的数组A的字符串。

但问一般问题更有意思:

给定长度为function Hello() { function HelloAgain(){ } } function MyFunction(){ ... } 且数组为A的数组N,返回长度为B的{​​{1}}数组,以便Boolean[]N iff Boolean[i]项目位于true

该问题最有效的解决方案是什么?两个数组都是未排序的,数组A[i]可以为空,它可以比数组B更大或更小。

4 个答案:

答案 0 :(得分:1)

将数组B转换为哈希集(或其他快速搜索集合),然后对数组A的每个元素进行循环,并检查该元素是否存在于集合中。

答案 1 :(得分:1)

Tosters的答案非常适合随机输入。但是,由于您询问了通用算法,我想到了以下方法。

您需要在其他元素中搜索一个元素,因此需要对其中一个元素进行排序才能获得最佳解决方案。让我们考虑两种情况。为简单起见,我们用相同的字母表示它们的大小。我在步骤描述之后提到了括号中步骤的时间复杂度。

排序B:

1. Sort B O(B log B).
2. Iterate over each element of A and check if element exists in B, O(A log B)
Time complexity: O(A log B) + O(B log B) = O((A+B) log B)

排序A:

1. Sort array A also maintaining original position in sorted array, O(A log A). 
2. Iterate on each element of B and find all A's containing B. Now iterate over each searched element to get original index and update Boolean array. Also keep a marker in sorted A that the element has been searched to avoid searching if same number appears again. O(B log A)
Time complexity: O(A log A) + O(B log A) = O((A+B) log A)

结果,解决方案因阵列大小的对数而不同。因此,为了获得最佳解决方案,请使用较小的大小对数组进行排序并使用相应的算法。

答案 2 :(得分:1)

有几种不同的方法可以解决不同的复杂问题。

首先,当您在A中找到相应的解决方案时,您可以在两个列表上执行嵌套循环并打印B中的元素。这是O(ab)时间和O(1)空间。

其次,您可以对两个列表进行排序,然后以锁步方式查找列表以查找匹配项(想象一下mergesort中的合并操作)。这是O(aloga + blogb)时间以及O(1)O(a+b)空格,具体取决于您是否要在原地排序。

第三,你可以只排序第二个列表,然后一次二进制搜索A中的元素。这是O(blogb + alogb)时间和O(1)O(b)空间,这取决于您是否就地排序。

Tosters提出了一个解决方案,您可以创建一个哈希集并对其进行重复查询。根据散列集如何解决冲突,在最坏的情况下,这是渐近等效的第一个或第三个解决方案(底层存储桶可以是列表或二叉搜索树)。

答案 3 :(得分:0)

在JS中这样做非常容易,我甚至不称它为算法:)

A.map(x => B.includes(x));