在我的粒子情况下,我需要一个JavaScript代码,它可以找到阵列B中的数组A的字符串。
但问一般问题更有意思:
给定长度为function Hello()
{
function HelloAgain(){
}
}
function MyFunction(){
...
}
且数组为A
的数组N
,返回长度为B
的{{1}}数组,以便Boolean[]
为N
iff Boolean[i]
项目位于true
。
该问题最有效的解决方案是什么?两个数组都是未排序的,数组A[i]
可以为空,它可以比数组B
更大或更小。
答案 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));