【发布时间】:2018-02-02 19:40:49
【问题描述】:
我想以对数时间查看容器中是否有相等值的对象。
我想拥有以下功能:
const a = [];
const el1 = {name: 'name1', directive: 'directive1'};
const el2 = {name: 'name2', directive: 'directive2'};
const el3 = {name: 'name3', directive: 'directive3'};
const b = {name: 'name1', directive: 'directive1'};
a.push(el1);
a.push(el2);
a.push(el3);
if(a.some(el => (el.name === b.name && el.directive === b.directive ))) {
console.log("YES!");
} else {
console.log("NO!");
}
这给了我想要的结果。但是,这是 O(N) 时间。
const s = new Set();
const el1 = {name: 'name1', directive: 'directive1'};
const el2 = {name: 'name2', directive: 'directive2'};
const el3 = {name: 'name3', directive: 'directive3'};
const b = {name: 'name1', directive: 'directive1'};
s.add(el1);
s.add(el2);
s.add(el3);
if(s.has(b)) {
console.log("YES!");
} else {
console.log("NO!");
}
这是 O(logN),但结果不是我想要的。
那么我可以使用哪种 Javascript 数据结构来在上面的代码中打印 YES 并且复杂度为 O(logN)? (我不想自己实现数据结构)
【问题讨论】:
-
是什么让你认为有一个?
-
我问有没有。我会假设有,因为这似乎是一个非常通用的用例。
-
如果你的数据已经排序并且你进行了二分搜索呢?
-
您的要求是可能的,但提供最佳方法需要有关您允许的对象类型的更多信息。它们总是只是包含带有值字符串的普通对象的浅数组吗?
-
您是要解决这个特定的
[{name, directive}]案例还是更一般的案例?
标签: javascript algorithm time-complexity