我正在使用关联数组构建树状数据结构。每个键为1-2个字符。钥匙是各自级别的独特之处。根级别上的密钥不超过40个,并且树的每个后续级别上的密钥不超过5个。它可能看起来像这样:
{a:{b:null,c:null},de:{f:{g:null}},h:null,i:null,j:null,k:null}
最初,我认为用如此少的键创建如此多的对象(平均而言,< 3)将是效率低下且内存密集的。在这种情况下,我会像我这样实现自己的哈希表:
//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的数组有时在稀疏填充时被实现为关联数组,可能无法创建自己的哈希结构。但我不确定。那么,在内存和速度方面哪个更有效呢?
答案 0 :(得分:1)
阅读这篇文章:http://mrale.ph/blog/2011/11/05/the-trap-of-the-performance-sweet-spot.html
基本上由于JavaScript的动态特性,您的数据结构效率不高。如果确实需要非常高效的数据结构,则应尝试使用最近推出的新型数组。
如果您没有理论结果,Resig已经在不同类型的树上进行了真正的单词性能测试,查看数据大小和性能解析和处理:http://ejohn.org/blog/javascript-trie-performance-analysis/
答案 1 :(得分:0)
你的解决方案,如果我理解正确,肯定会表现得更糟。你对此表示担忧:
[...]用如此少的键创建如此多的对象(平均而言,<3)[...]
但你的解决方案正在做同样的事情。每个嵌套的哈希值仍然是一个具有少量键的对象,现在只有一些键是一个名为get
的闭包(它将具有更高的内存需求,因为它隐式关闭了诸如{之类的变量。 {1}}和tbl
,其中code
是另一个闭包......。)。