可能重复:
Is there any good JavaScript hash(code/table) implementation out there?
我想要一个数据结构,我可以在O(1)中查询一个键,相当快速地删除一个元素,并从O(1)中随机抽样。
我想到了一个Dictionary(用于关键查询)和Array(用于采样)。 但是有没有办法在2之间连接(指针)?
例如:我想删除一个条目,给它的密钥。所以我可以从字典中轻松删除它,但是如何使用字典将其拼接出数组?
编辑:
var dict = {key1: "val1",key2:"val2"};
按键获取项目:
getKey = function(key){ return dict[key]; }
按索引获取项目(我想更改)
getIndex = function(ind) { return dict.values()[ind] }
getIndex函数的问题是.values()遍历所有字典并将其放入数组中。如果字典很大,那就太贵了。
更新
我忘记了这个问题,同时我已经解决了,所以这就是解决方案:
我们可以使用字典和数组:
该数组将保存字典的所有键
字典将密钥作为其键,而不是值,而不是值的元组,其中index是数组中该元素键的索引(指向排序数组的指针)。
所以这种方式数组指向字典,字典指向数组。
现在对ds的操作如下:
插入(键,值):
将一个新密钥推送到该阵列
创建一个元组
使用键'key'将元组插入字典
获取(键):
return dictionary.get(key)
删除(键):
从字典中删除elem
在数组中的最后一个键和我们的键之间切换(我们有指向我们键的指针)
将字典中的指针更新为最后一个键并且我们已切换
从数组中删除我们的密钥
randomSample(取样器):
使用采样器对数组进行采样(例如,可以采用均匀采样)。
迭代所有样本并返回与字典中的键对应的值
该课程的完整源代码可用:https://gist.github.com/shacharz/9807577
答案 0 :(得分:0)
不太确定你想用随机样本实现什么。 但根据我的理解,你基本上在寻找一张可以让你掌握价值清单的地图?
答案 1 :(得分:0)
说实话,我不知道这个解决方案是否超过了你的性能标准,但在这里...... 该想法的核心是使用相同的字典来存储这两者。存在一些明显的缺点,包括由删除产生的索引中的漏洞。查找应该非常快,当使用良好的随机数据源时,这允许非常好的随机查找。
吃蛋糕很难吃。绝对对其他解决方案感兴趣。
var dict = {key1: "val1", 0:"key1", key2:"val2", 1:"key2"};
var COUNT = 1;
// inserts
function insertValue(dictionary, key, value) {
if (typeof dictionary[key] === 'undefined') {
COUNT++;
dict[key] = value;
dict[COUNT] = key;
} else {
return false;
}
return;
}
// return an item by index
var index = 20;
var itemByIndex = dict[dict[index]];
// updates by index
dict[dict[index]] = newValue;
// return a "random" element
function getRandomItem (dictionary, maxIndex) {
var randomNumber = Math.floor(Math.rand() * maxIndex);
var randomValue = dictionary[randomNumber];
if (typeof randomValue === 'undefined') {
return getRandomItem(dictionary, maxIndex);
}
return randomValue;
}
// deletes item by index
function deleteItemByIndex(dictionary, index) {
delete dictionary[dictionary[index]];
delete dictionary[index];
}