javascript - 如何以对数时间检查具有相等值的对象是否在容器中

标签 javascript algorithm time-complexity

我想以对数时间查看具有相等值的对象是否在容器中。

我想拥有以下功能:

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)? (我不想自己实现一个数据结构)

最佳答案

您可以使用按名称键控的 Map,其中对应的值是一组指令:

const elements = [
    {name: 'name1', directive: 'directive1'},
    {name: 'name2', directive: 'directive2'},
    {name: 'name3', directive: 'directive3'}
];

const map = new Map(elements.map(({name}) => [name, new Set]));
elements.forEach(({name, directive}) => map.get(name).add(directive));

const b = {name: 'name1', directive: 'directive1'};

if (map.has(b.name) && map.get(b.name).has(b.directive)) {
    console.log("YES!");
} else {
    console.log("NO!");
}

关于javascript - 如何以对数时间检查具有相等值的对象是否在容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589796/

相关文章:

javascript - 如何将MVC架构应用到ExtJS项目中?

Javascript 使用 json 中的值编写循环并将其嵌套数据作为 json 对象传递给循环

c - 加权区间调度问题和动态规划

algorithm - 最慢的计算复杂度 (Big-O)

javascript - jQuery:无法让提交按钮工作

javascript - chrome 检测计算机何时从空闲状态唤醒

php - 更好的动态导航菜单

algorithm - 递归算法的时间复杂度分析

algorithm - 为什么暴力算法的时间复杂度是 O(n*m)?

algorithm - 以下递归函数的时间复杂度是多少