假设我正在访问图形数据结构中的节点。当我访问每个节点时,我会将其添加到“已访问”列表中。希望有一个O(1)查找来验证我不会多次访问同一个节点。当然,如果每个节点都有一个关联的值,我可以使用常规的JavaScript对象(散列表)来存储我的“已访问”列表,但是假设我想知道节点是否可以评估为字符串或不。是否有支持O(1)查找对象的JavaScript数据结构?我怎么能实现一个?具有O(1)查找的对象的数据结构?
回答
要做O(1)查找,您需要使用哈希集。本地javascript中没有哈希集,但是有一个哈希映射(纯文本对象)。您可以通过检查对象是否包含密钥来模拟哈希集合。您的价值需要实施toString
方法。
var Set = function() {}
Set.prototype.contains = function (v) {
return (v.toString() in this);
}
Set.prototype.add = function (v) {
this[v.toString()] = true;
}
Set.prototype.remove = function (v) {
delete this[v.toString()];
}
这打破了该集与每个节点的值不可知的情况。假设我提供这个图结构作为API的一部分。如果有人在每个节点中存储几MB文本(我知道,不太可能,但是幽默我),依靠它作为散列键将是非常低效的。我宁愿剪掉中间人,也要使用物体的一些固有属性。每个JavaScript引擎都知道对象的等价性'obj1 === obj2',所以我认为即使它今天没有公开,也可以实现这些功能。 – Blackhawk
你可以使用你想要的任何散列方法。底线是哈希方法必须返回一个字符串。你甚至可以把一个整数作为一个字符串。 – twinlakes
另外,javascript引擎不知道等价。如果两个比较对象是同一个对象,则实际返回'==='。证明:在控制台中尝试'({a:1})===({a:1})''。如果你想要等价的话,给每个元素分配一个唯一的ID,并将其作为一个字符串从你的哈希方法(我选择调用'toString')返回 – twinlakes
- 1. 带有O(1)查找的数据传输对象
- 2. 什么是提供O(1)查找的C++数据结构?
- 3. 存储具有名称的对象的数据结构
- 4. 具有1:1键/值映射的C#集合数据结构
- 5. 其数据结构对象的快速查找功能列表
- 6. 查找具有相同的权重O(1)
- 7. 查找对象的数组对象具有相同的ID
- 8. 结合查找和有序数据的C++数据结构
- 9. C++数据结构大O
- 10. 拥有对象并返回对象的数据结构
- 11. Java对象 - 数据结构
- 12. 数据结构对象
- 13. jQuery对象数据结构
- 14. Perl:在对象列表中快速查找对象 - 查找合适的数据结构
- 15. 大O符号的数据结构
- 16. 寻找一个数据结构以1对1的唯一依赖
- 17. 在O(log2n)中插入数据结构,但在O中搜索(1)
- 18. 查找数组中的对象(具有属性的自定义对象)
- 19. RPGLE数据结构数组查找
- 20. 将平面数据转换为具有内部对象的层次结构javascript
- 21. 查找对象集合中的数据,其中对象中的所有名称都具有相同的值
- 22. Clojure中是否有任何数据结构允许删除O(1)或O(log n)中的任意元素?
- 23. 具有1:n属性的新对象
- 24. 在Java中查找具有唯一值的数据成员的对象?
- 25. SQL - 在列中查找具有最高计数的对象
- 26. 检测O(n)时间和O(1)内存中是否有重复字符串,并且没有数据结构
- 27. 大O计算两个数据结构
- 28. 需要查询来查找数据库中的所有对象?
- 29. 查找具有某个属性的关联对象的所有对象
- 30. 数据结构为“内插”表查找
然后使用ES2015 ['Set'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set)(或['WeakMap'](https:// developer。 mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)无论哪个更合适) – zerkms
你可以推送到一个数组并使用array.indexOf来查看一个节点ref是否在列表中,但这可能很慢。你也可以在节点本身设置一个看不见的道具,这很快,但可能会根据设置而破坏。 – dandavis
@zerkms我刚刚检查我的公司授权的浏览器对兼容性列表[这里](http://kangax.github.io/compat-table/es6/)并哭了一下:'( – Blackhawk