【发布时间】:2012-01-11 17:23:36
【问题描述】:
我正在用关联数组构建一个树状数据结构。每个键为 1-2 个字符。键对于它们各自的级别是唯一的。根级别上的键不超过 40 个,树的每个后续级别上的键不超过 5 个。它可能看起来像这样:
{a:{b:null,c:null},de:{f:{g:null}},h:null,i:null,j:null,k:null}
最初,我认为用这么少的键(平均
//Suppose keys is a multi-dimensional array [[key,data],...]
var hash = function(keys){
var max = keys.length*3, tbl = [];
//Get key hash value
var code = function(key){
return (key.charCodeAt(0)*31)%max;
}
//Get key values
this.get(key){
//2 character keys actually have a separate hash generation algorithm...
//we'll ignore them for now
var map = code(key), i=map;
//Find the key value
while(true){
if (typeof tbl[i] == 'undefined') return false;
if (code(tbl[i][0]) == map && tbl[i][0] == key) return tbl[i][1];
else i = (i+1)%max;
}
}
//Instantiate the class
for (var i=0; i<keys.length; i++){
var index = code(keys[i][0]);
while(typeof tbl[index] != 'undefined')
index = (index+1)%max;
tbl[index] = keys[i];
}
}
然后,我在某处读到 JavaScript 的数组有时会在稀疏填充时实现为关联数组,这可能违背了创建自己的哈希结构的目的。但我不确定。那么,就内存和速度而言,哪个效率更高?
【问题讨论】:
-
无法弄清楚您要做什么。你能提供更多信息吗?你用这棵树建模什么?
-
归根结底,数组也只是对象。
-
您有没有尝试过一种方法并发现它很慢,或者您只是在猜测?
-
我主要是在推测:如果 JavaScript 对象(内部)是哈希映射,属性是它们的键,那么每个对象都需要一个 180 多行的数组。由于每个哈希映射实际上只需要 6 行(平均),我认为原始实现可能更有效。然而,我认为 JS 对象实际上并不是哈希结构,而是可以动态添加/删除属性的东西。如果有人可以确认/反驳/解释这一点,它将回答我的问题。
标签: javascript performance memory associative-array