我正在嘗試想出一種算法來解決以下問題。瞭解使用對象作爲哈希值的JavaScript算法的複雜性
給出一組ID
var ids = [8098272281362432, 7824519999782912];
查找項目陣列中的所有比賽。
var people = [
{
"id": 8098272281362432,
"age": 59,
"name": "Douglas Hunter"
},
{
"id": 625873891885056,
"age": 1,
"name": "Lottie Owen"
},
{
"id": 7824519999782912,
"age": 100,
"name": "Maud Wise"
},
{
"id": 2561552265773056,
"age": 115,
"name": "Annie Bennett"
}
];
方法1 我可以由id
(O(n log n)
)排序兩個陣列,然後通過兩個陣列從頂部迭代一次向下(O(n)
)
var alg1 = function(people, ids) {
var matches = [];
var sortedPeople = people.sort(function(a, b) {
return a.id - b.id
});
var sortedIds = ids.sort(function(a, b) {
return a - b
});
var curPersonIndex = 0;
sortedIds.forEach(function(id) {
while (sortedPeople[curPersonIndex].id !== id) {
curPersonIndex++;
}
matches.push(sortedPeople[curPersonIndex]);
});
return matches;
};
方法2 我雖然可以用O(n)
算法通過創建一個id到人的映射來改善這一點,然後我可以查找每個id的人。
var alg2 = function(people, ids) {
var matches = [];
peopleMap = {};
people.forEach(function(person) {
//Is this O(1) or O(log n)?
peopleMap[person.id] = person;
});
ids.forEach(function(id) {
matches.push(peopleMap[id]);
});
return matches;
};
但是,當我測試了這兩個算法似乎preform大致相同。 #1鉻更快,#2在Firefox中稍快。
http://plnkr.co/edit/FidAdBqS98RKebxaIlva?p=preview
我越來越覺得插入場成一個對象是O(log n)
不O(1)
因爲我本來期望。我已閱讀了一些有衝突的帖子,但我不確定。我想這可能取決於瀏覽器。有沒有什麼辦法可以在JavaScript中用O(n)算法一致地解決這個問題?
如果你已經工作的代碼,並希望它改善,我不知道如果HTTP://代碼審查.stackexchange.com可能是您發佈信息的最佳地點。 – jfriend00
花費額外的時間來構建'peopleMap'可能會回報更多的大型數據集或者如果你曾經創建地圖,然後做重複查找。此外,它似乎並沒有像#1的排序陣列的優勢,所以我想知道爲什麼你甚至不打擾他們排序。 – jfriend00
是數組更新頻繁還是隻是一次? –