【问题标题】:Javascript hash table vs associative arraysJavascript 哈希表与关联数组
【发布时间】:2012-09-02 14:37:18
【问题描述】:

我是 javascript 新手,我无法找到有关某些问题的答案,以下是一个:

当我们可以将对象用作易于使用且性能非常好的关联数组时,为什么在 js 中哈希表数据结构会很有用?

【问题讨论】:

  • 请举例说明您的意思。 JavaScript 对象经常被误用为 PHP 风格的关联数组,假设它们的工作方式与 PHP 数组相同。
  • @MichaelBerkowski JS 中的对象关联数组。我相信你的意思是像var a = {}; a[1] = 'something'; 这样的破坏方法,我已经见过很多次了,并且很可能源于 PHP 可怕的毁容数组,但这并不是将它们“用作 PHP 样式的关联数组” " 但更像是完全相反,使用关联数组作为索引数组。
  • @lanzz 实际上,我猜最常见的误用是通过向它们添加对象属性并期望它们像 PHP 数组一样迭代来强制成为“关联”的实际 JS 数组。
  • 哦,幸好我还没有在野外看到过。
  • 我会这样做:

标签: javascript arrays hashtable associative


【解决方案1】:

在下划线实现中,javascript 哈希表和 javascript 关联数组(和 javascript 对象)都是相同的东西。这些只是不同的语法。

所以:

var a = {};
a.id = "aa";

等同于:

var a = new Object();
a.id = "aa";

等同于:

var a = {};
a["id"] = "aa";

【讨论】:

  • 我已经通过使用随机字符串作为键填充对象并随机寻址来完成一些测试。对象的大小(哈希值约为 1000000 个条目)。我注意到,将用作密钥的字符串的长度加倍,算法完成所花费的时间只是增加了 10%……这是什么意思? javascript中使用什么散列函数来填充对象/散列?
  • 我不知道,但是 JS 本质上是一个规范(ECMAScript)。我会假设每个 JS 引擎都以不同的方式实现这一点。 V8 是开源的,如果需要可以查看代码。
【解决方案2】:

为什么在 js 中我们可以使用哈希表数据结构? 对象作为关联数组,易于使用且具有非常 性能好吗?

我可以想象实现哈希表数据结构的唯一原因是如果您想保留元素的顺序。对象的for…in 循环不能向您保证属性(“键”)的返回顺序,即使您通常可以按时间顺序(最后添加,最后返回)获取它们。但这不是保证。例如,旧版本的 Opera 以明显随机的顺序返回属性。所以,如果你需要一个“有序”的哈希表,你需要自己实现。

【讨论】:

  • 所以如果我不需要保留顺序,我是否需要任何经典的数据结构作为 javascript 中的 B-tress 堆链表?
  • 您必须逐案查看,但通常您可以放心地假设,如果您不需要保留顺序并且您没有大量数据(需要更快的性能),您可以使用普通对象。
【解决方案3】:

关联数组和哈希表是一样的。
这些表达式通常也具有相同的含义:字典、关联数组、hashmap、map、hashtable 等等……不胜枚举。

不过,简单的 ARRAY 和 HASHTABLE 是有区别的。 如果要搜索数组中的项目,其中的项目越多,搜索所需的时间就越长。 例如,在具有 10000 个元素的数组中搜索项目可能比在具有 100 个元素的数组中花费的时间长 100 倍。 使用哈希表,无论您有多少元素,性能都保持不变。 (无论是 100 个元素还是 99999999 个元素......)

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 2010-11-21
    • 2011-05-11
    • 2010-11-29
    • 2017-03-14
    • 1970-01-01
    • 2016-11-25
    • 2015-08-09
    相关资源
    最近更新 更多