![](/img/trans.png)
[英]Constructing a O(n) time complexity algorithm for search for a value in two arrays
[英]Merge two arrays avoiding O(n^2) complexity
給定兩個數組,農民和集合,當集合中的 farmer_id 等於農民中的 id 時,我希望能夠將農民信息合並到每個集合中。 如果集合中沒有與 farmer_id 匹配的農夫的 id,則該集合應該有一個空的農夫對象
const farmers = [{
id: 10,
name: 'John Doe',
email: 'jdoe@gmail.com'
},
{
id: 11,
name: 'James Bond',
email: 'james@gmail.com'
}
]
const collections = [{
id: 9,
name: 'Book',
farmer_id: 10,
date: 'June'
},
{
id: 10,
name: 'Game',
farmer_id: 11,
date: 'July'
},
{
id: 13,
name: 'Car',
farmer_id: 10,
date: 'August'
},
{
id: 11,
name: 'Wristwatches',
farmer_id: 20,
date: 'August'
}
]
const result = [{
id: 9,
name: 'Book',
farmer_id: 10,
date: 'June',
farmer: {
id: 10,
name: 'John Doe',
email: 'jdoe@gmail.com'
}
},
{
id: 10,
name: 'Game',
farmer_id: 11,
date: 'July',
farmer: {
id: 11,
name: 'James Bond',
email: 'james@gmail.com'
}
},
{
id: 13,
name: 'Car',
farmer_id: 10,
date: 'August',
farmer: {
id: 10,
name: 'John Doe',
email: 'jdoe@gmail.com'
}
},
{
id: 11,
name: 'Wristwatches',
farmer_id: 20,
date: 'August',
farmer: {}
}
]
這是我能夠想出的,但現在被卡住了
function mapper(farmers, collectors) {
for (let k = 0; k < farmers.length; k++) {
const idToFarmerInfo = {};
idToFarmerInfo[farmers[k].id] = farmers[k];
for (let j = 0; j < collectors.length; j++) {
let mapper = idToFarmerInfo[collectors[j].farmer_id];
farmers[mapper] = collectors[j]
}
}
return farmers
}
我跟着這個鏈接,因為我試圖避免 O of N 平方但 O of N 復雜性
為了獲得更好的性能,您可以創建一個complexity
為O(N)
的農民hash
,因為我們只迭代farmers
列表一次。
const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ] var farmers_hash = farmers.reduce((hash, item) => { hash[item.id] = item; return hash; }, {}); console.log(farmers_hash);
下一步是通過使用哈希鍵分配一個農民來構建所需的output
。
這可以通過結合使用map
方法和Object.assign
來實現。
const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ] var farmers_hash = farmers.reduce((hash, item) => { hash[item.id] = item; return hash; }, {}); var result = collections.map((item) => { item.farmer = Object.assign({}, farmers_hash[item.farmer_id]) return item; }); console.log(result);
如您所見,最終復雜度為O(N) + O(M)
,其中N
是farmers
數組的長度, M
是collections
數組的長度。
您可以使用更具聲明性的方法並使用Array.map和Array.find
const result = collections.map(collection => {
return {
...collection,
farmer: farmers.find(farmer => collection.farmer_id == farmer.id) || {}
};
});
console.log(result);
您可以創建一個Map
集合,以便通過id
對所需的農民進行O(N)
訪問。 然后映射在性能方面變得更快:
const unique = new Map(farmers.map(f=> [f.id, f]));
const result = collections.map(s => ({
...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id
}))
現在collections
映射具有復雜度O(N)
。 但是,不要忘記總結制作獨特農民的復雜性。 整體復雜度為O(N) + O(M)
。
一個例子:
const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ]; const unique = new Map(farmers.map(f=> [f.id, f])); const result = collections.map(s => ({ ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id })) console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.