对于我最近写的一些算法,我认为散列会非常好。我认为我可能只是将对象中的成员变量用作键值对。我不确定这是否是最佳的,因为我真的不知道幕后发生了什么。我还认为 V8 的做法与其他环境不同。但是,我确实认为查找成员变量会很快(希望如此)?
尽管如此,我想知道在 JavaScript 对象中写入、读取、创建和删除成员变量的运行时复杂度是否都是 O(1)。如果环境(v8 与其他)存在差异,它们是什么?
对于我最近写的一些算法,我认为散列会非常好。我认为我可能只是将对象中的成员变量用作键值对。我不确定这是否是最佳的,因为我真的不知道幕后发生了什么。我还认为 V8 的做法与其他环境不同。但是,我确实认为查找成员变量会很快(希望如此)?
尽管如此,我想知道在 JavaScript 对象中写入、读取、创建和删除成员变量的运行时复杂度是否都是 O(1)。如果环境(v8 与其他)存在差异,它们是什么?
是的,它们是哈希。不同浏览器的实现是不同的。尽管许多文章声称对象不是散列,但它们的行为与散列非常相似,因此可以这样使用。
我必须通过运行性能测试来证明这一点:
读取这些测试的方法是,如果对象的大小增加时 ops/sec 没有性能差异,那么这意味着对象是散列。散列的定义特征是每个操作的复杂度都是 O(1),而不管它与其他操作相比更快或更慢。
测试:
http : //jsperf.com/objectsashashes/2(100 个密钥)
http://jsperf.com/objectsashashes/3(100k 个密钥)
http://jsperf.com/objectsashashes/(100 万个密钥)
http:// /jsperf.com/objects-as-hashes-300-mil(10m密钥)
注意:每个浏览器在不同的操作中更快/更慢。这似乎在发布和年复一年之间发生变化。
JavaScript 对象是散列。我无法想象任何不会对对象属性提供恒定时间 CRUD 操作的理智实现。
您是否发现这种方法存在特定的性能问题?
JavaScript 中的对象是哈希表的一个示例,因为对象数据表示为键和值。