javascript结合数组和字典

时间:2012-09-15 22:03:11

标签: javascript arrays dictionary data-structures

  

可能重复:
  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

2 个答案:

答案 0 :(得分:0)

不太确定你想用随机样本实现什么。 但根据我的理解,你基本上在寻找一张可以让你掌握价值清单的地图?

找到了这个:https://stackoverflow.com/a/868728/715236

答案 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];
}