2012-09-15 60 views
1

可能重複:
Is there any good JavaScript hash(code/table) implementation out there?JavaScript的結合陣列和字典

我想要的數據結構,我可以從爲O查詢鍵(1),而快速刪除的元素和從O(1)中隨機抽樣。

我想到一個與Array(用於採樣)結合的字典(用於關鍵查詢)。 但有沒有辦法連接(指針)之間的2?

例如:我想刪除一個條目,給定它的關鍵。所以我可以很容易地從字典中刪除它,但是我怎樣才能使用字典拼接出數組?

編輯:

var dict = {key1: "val1",key2:"val2"}; 

通過鍵獲取項目:

getKey = function(key){ return dict[key]; } 

獲得通過索引的項目(這是我想改變)

getIndex = function(ind) { return dict.values()[ind] } 

問題與getIndex函數是.values()遍歷所有字典並將其放入數組中。如果字典很大,非常昂貴。

更新: 我忘了這個問題,在我已經解決了它的同時,所以這裏的解決方案:
我們可以使用字典和數組: 陣列將持有的所有鍵字典 字典將保存鍵作爲其鍵,而不是值的元組索引是該元素在數組中的索引(一個指向排序數組的索引)的索引。
這樣,數組指向字典,字典指向數組。

現在,在DS中的動作如下:

插入(鍵,值):
推新的密鑰到陣列 創建一個元組 與主要插入元組到詞典'關鍵」

GET(鍵):
回報dictionary.get(鍵)

刪除(鍵):
從詞典中刪除elem 在數組中的最後一個鍵和我們的鍵之間切換(我們有指向我們鍵的指針) 將字典中的指針更新爲最後一個鍵,我們「VE切換 從陣列

randomSample(取樣器)刪除我們的鍵:
樣品與取樣器陣列(其可以是例如均勻採樣)。 迭代所有的樣品和從字典

類的全部源代碼返回相應的鍵的值可用:https://gist.github.com/shacharz/9807577

+1

你可以發表一些你到目前爲止得到的代碼嗎?很難想象這裏有沒有樣品問這裏...... – elclanrs

+0

這似乎是一個體面的研究生家庭作業問題,證明這個要求是不可能的。 :-)(也許​​不是,那麼這將是一個詭異的問題!)我也不認爲它特別是關於JavaScript。 – Pointy

+0

請發佈樣本數據和樣本訪問權限。只是在尋找一個「有序字典」? – 2012-09-15 22:54:42

回答

0

不太清楚你要實現與隨機抽取的。 但從我的理解你基本上尋找一個地圖,讓你得到價值清單?

發現這一個:https://stackoverflow.com/a/868728/715236

+0

基本上,我只是想要一個隨機訪問的字典(如數組)。不需要命令我只想通過鍵或索引訪問值。 – shacharz

+0

@ user1674942如果沒有訂購,通過「索引」訪問地圖(或詞典)有什麼好處? – 2012-09-16 01:17:14

+0

假設我想統一隨機抽樣字典條目 – shacharz

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