<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
招聘季節一般都在金三銀四,或者金九銀十。最近在這五六月份,陸陸續續面試了十幾個高階前端。有一套考察演演算法的小題目。後臺返回一個扁平的資料結構,轉成樹。
我們看下題目:打平的資料內容如下:
let arr = [ {id: 1, name: '部門1', pid: 0}, {id: 2, name: '部門2', pid: 1}, {id: 3, name: '部門3', pid: 1}, {id: 4, name: '部門4', pid: 3}, {id: 5, name: '部門5', pid: 4}, ]
輸出結果
[
{
"id": 1,
"name": "部門1",
"pid": 0,
"children": [
{
"id": 2,
"name": "部門2",
"pid": 1,
"children": []
},
{
"id": 3,
"name": "部門3",
"pid": 1,
"children": [
// 結果 ,,,
]
}
]
}
]
我們的要求很簡單,可以先不用考慮效能問題。實現功能即可,回頭分析了面試的情況,結果使我大吃一驚。
10%的人沒思路,沒碰到過這種結構
60%的人說用過遞迴,有思路,給他個筆電,但就是寫不出來
20%的人在引導下,磕磕絆絆能寫出來
剩下10%的人能寫出來,但效能不是最佳
感覺不是在招聘季節遇到一個合適的人真的很難。
接下來,我們用幾種方法來實現這個小演演算法
判斷一個演演算法的好壞,一般從執行時間和佔用空間來看,執行時間越短,佔用的記憶體空間越小,那麼它就是好的演演算法。對應的,我們常常用時間複雜度代表執行時間,空間複雜度代表佔用的記憶體空間。
時間複雜度的計算並不是計算程式具體執行的時間,而是演演算法執行語句的次數。
隨著n的不斷增大,時間複雜度不斷增大,演演算法花費時間越多。 常見的時間複雜度有
舉個例子:如f(n)=3*n^4+3n+300 則 O(n)=n^4
通常我們計算時間複雜度都是計算最壞情況。計算時間複雜度的要注意的幾個點
let x = 1; while (x <100) { x++; }
for (i = 0; i < n; i++){ for (j = 0; j < n; j++) { // ...code } }
for(var i = 0; i<n && arr[i] !=1; i++) { // ...code }
空間複雜度是對一個演演算法在執行過程中臨時佔用儲存空間的大小。
計算空間複雜度的簡單幾點
僅僅只複製單個變數,空間複雜度為O(1)。舉例如下:空間複雜度為O(n) = O(1)。
let a = 1; let b = 2; let c = 3; console.log('輸出a,b,c', a, b, c);
遞迴實現,呼叫fun函數,每次都建立1個變數k。呼叫n次,空間複雜度O(n*1) = O(n)。
function fun(n) { let k = 10; if (n == k) { return n; } else { return fun(++n) } }
主要思路是提供一個遞getChildren的方法,該方法遞回去查詢子集。 就這樣,不用考慮效能,無腦去查,大多數人只知道遞迴,就是寫不出來。。。
/** * 遞迴查詢,獲取children */ const getChildren = (data, result, pid) => { for (const item of data) { if (item.pid === pid) { const newItem = {...item, children: []}; result.push(newItem); getChildren(data, newItem.children, item.id); } } } /** * 轉換方法 */ const arrayToTree = (data, pid) => { const result = []; getChildren(data, result, pid) return result; }
從上面的程式碼我們分析,該實現的時間複雜度為O(2^n)。
主要思路是先把資料轉成Map去儲存,之後遍歷的同時藉助物件的參照,直接從Map找對應的資料做儲存
function arrayToTree(items) { const result = []; // 存放結果集 const itemMap = {}; // // 先轉成map儲存 for (const item of items) { itemMap[item.id] = {...item, children: []} } for (const item of items) { const id = item.id; const pid = item.pid; const treeItem = itemMap[id]; if (pid === 0) { result.push(treeItem); } else { if (!itemMap[pid]) { itemMap[pid] = { children: [], } } itemMap[pid].children.push(treeItem) } } return result; }
從上面的程式碼我們分析,有兩次迴圈,該實現的時間複雜度為O(2n),需要一個Map把資料儲存起來,空間複雜度O(n)
主要思路也是先把資料轉成Map去儲存,之後遍歷的同時藉助物件的參照,直接從Map找對應的資料做儲存。不同點在遍歷的時候即做Map儲存,有找對應關係。效能會更好。
function arrayToTree(items) { const result = []; // 存放結果集 const itemMap = {}; // for (const item of items) { const id = item.id; const pid = item.pid; if (!itemMap[id]) { itemMap[id] = { children: [], } } itemMap[id] = { ...item, children: itemMap[id]['children'] } const treeItem = itemMap[id]; if (pid === 0) { result.push(treeItem); } else { if (!itemMap[pid]) { itemMap[pid] = { children: [], } } itemMap[pid].children.push(treeItem) } } return result; }
從上面的程式碼我們分析,一次迴圈就搞定了,該實現的時間複雜度為O(n),需要一個Map把資料儲存起來,空間複雜度O(n)
方法 | 1000(條) | 10000(條) | 20000(條) | 50000(條) |
---|---|---|---|---|
遞迴實現 | 154.596ms | 1.678s | 7.152s | 75.412s |
不用遞迴,兩次遍歷 | 0.793ms | 16.499ms | 45.581ms | 97.373ms |
不用遞迴,一次遍歷 | 0.639ms | 6.397ms | 25.436ms | 44.719ms |
從我們的測試結果來看,隨著數量的增大,遞迴的實現會越來越慢,基本成指數的增長方式。
以上就是高階前端面試手寫扁平資料結構轉Tree的詳細內容,更多關於扁平資料結構轉Tree的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45