假设我有一个数组const series = [0,4,8]和另一个数组const positions = [0,3,4,7,8]
如何检测positions中是否包含series的所有值
我最初的反应是创建一个for loop,它将遍历positions中的所有值,并检查它们是否等于series的值,但这似乎非常低效。
发布于 2021-03-29 00:43:16
Javascript Set object缺乏集合论方法,从好的方面来说,它们很容易实现:
class RealSet extends Set {
isSuperSet(iterable) {
for (let x of iterable) {
if (!this.has(x))
return false;
}
return true;
}
// @TODO: union, intersect, isSubSet, etc.
}
series = [0,4,8]
positions = [0,3,4,7,8]
console.log(new RealSet(positions).isSuperSet(series))
另请参阅: set方法的TC39 proposal。
发布于 2021-03-29 00:40:20
最坏的情况是复杂度是n * log(n)。用于循环series array中所有元素的n和用于二进制搜索的log(n)。
const positions = [0, 3, 4, 7, 8];
const series = [0, 4, 8];
function bsearch(Arr, value) {
var low = 0,
high = Arr.length - 1,
mid;
while (low <= high) {
mid = Math.floor((low + high) / 2);
if (Arr[mid] == value) return mid;
else if (Arr[mid] < value) low = mid + 1;
else high = mid - 1;
}
return -1;
}
let i;
for (i = 0; i < series.length; ++i) {
const pos = bsearch(positions, series[i]);
if (pos === -1) break;
}
if (i === series.length) {
console.log("All element present");
} else {
console.log("All elmenet not present");
}
发布于 2021-03-29 00:43:21
我的答案是使用Javascript内置的Array.prototype.every和Array.prototype.indexOf。
它会是这样的,
// Returns true if all elements in firstArray are also in secondArray
firstArray.every(element => secondArray.indexOf(element) !== -1)every builtin遍历数组,在每个元素上运行回调,如果所有元素的回调返回true (或truthy值),则返回true,否则返回false。
indexOf builtin在引用相等的数组中搜索您为其提供的参数,如果该参数在数组中,则返回该参数的索引,如果不在,则返回-1。
所以对于firstArray中的每个元素,我们检查它是否在secondArray中,如果是,则通过检查indexOf是否返回-1来返回true。
结合这些,我们可以在一行程序中解决这个问题。对于未排序的数组,这是您能得到的最好的结果。但是,如果您假设数组已排序,则使用二进制搜索可以更快。正如我面前的答案所使用的。
https://stackoverflow.com/questions/66843664
复制相似问题