摘要:?jiǎn)栴}設(shè)定在思維簡(jiǎn)圖中,軟件可以將用戶錄入的文本直接轉(zhuǎn)化為思維導(dǎo)圖。暫時(shí)設(shè)為一個(gè)空數(shù)組。孫中山將同盟會(huì)的綱領(lǐng)概括為三大主義,即民族主義民權(quán)主義民生主義,后被稱為三民主義。
問題設(shè)定
在思維簡(jiǎn)圖中,軟件可以將用戶錄入的文本直接轉(zhuǎn)化為思維導(dǎo)圖。其規(guī)則是:用戶錄入的文字必須以一個(gè)感嘆號(hào)作為一個(gè)節(jié)點(diǎn)的起始標(biāo)記,一個(gè)感嘆號(hào)表示后面的文字處于第一級(jí)節(jié)點(diǎn),兩個(gè)感嘆號(hào)表示后面的文字處于第二個(gè)節(jié)點(diǎn),以此類推。
!內(nèi)容
!!同盟會(huì)的政治綱領(lǐng)是“驅(qū)除韃虜,恢復(fù)中華,創(chuàng)立民國(guó),平均地權(quán)”。
!!孫中山將同盟會(huì)的綱領(lǐng)概括為三大主義,即民族主義、民權(quán)主義、民生主義,后被稱為三民主義。
!!!民族主義,即民族革命,包括“驅(qū)除韃虜,恢復(fù)中華”兩項(xiàng)內(nèi)容。
!!!民權(quán)主義即政治革命,內(nèi)容是“創(chuàng)立民國(guó)”,即建立資產(chǎn)階級(jí)民主共和國(guó)。
!!!民生主義即社會(huì)革命,指的是“平均地權(quán)”。
!評(píng)價(jià):
!!它初步描繪出中國(guó)還不曾有過的資產(chǎn)階級(jí)共和國(guó)方案,是一個(gè)比較完整而明確的資產(chǎn)階級(jí)民主革命綱領(lǐng)。
!!對(duì)推動(dòng)革命的發(fā)展產(chǎn)生了重大而積極的影響。
!!但它并不是一個(gè)徹底的資產(chǎn)階級(jí)民主革命綱領(lǐng)。
所以, 上面這段文字經(jīng)過軟件處理后應(yīng)該生成的樹狀圖應(yīng)該如下:
常規(guī)思路在將文字轉(zhuǎn)化為圖片的過程中,如何將錄入文本轉(zhuǎn)化為一個(gè)結(jié)構(gòu)化的數(shù)據(jù)至關(guān)重要。按照最容易想到的思路,算法設(shè)計(jì)應(yīng)該是這樣:
在全文的最末尾加一個(gè)感嘆號(hào),然后找出所有處于單個(gè)感嘆號(hào)之間的文字,放入一個(gè)數(shù)組中;
將數(shù)組中的第一個(gè)節(jié)點(diǎn)的文字提取出來,作為這個(gè)節(jié)點(diǎn)的title值保存下來,并且保存自己的父級(jí)的id(對(duì)于第一級(jí)的節(jié)點(diǎn),父級(jí)節(jié)點(diǎn)id取-1),創(chuàng)建一個(gè)自己的id;
上述處理完畢之后,用遞歸的方式處理第二級(jí)、第三級(jí)……節(jié)點(diǎn),直到全部遍歷完。
這就是我寫第一版程序時(shí)的思路,這個(gè)算法寫得很笨,也寫得很痛苦。層層遞歸的方式,在程序調(diào)試時(shí)不那么符合地球人的思維習(xí)慣。那種感覺很像是我們?cè)嵅odejs里的層層回調(diào)嵌套出現(xiàn)的“死亡金字塔”式的程序結(jié)構(gòu)。
重新思考前些天閱讀過promise編程模式,很好的破解掉了這個(gè)“死亡金字塔”,讓代碼的結(jié)構(gòu)非常便于閱讀和調(diào)試。受到這個(gè)啟發(fā),再次思考了這個(gè)算法的設(shè)計(jì),應(yīng)該有一個(gè)調(diào)試起來思路更清楚,代碼結(jié)構(gòu)更一目了然的方式:
首先不考慮感嘆號(hào)的多少,把感嘆號(hào)之間的文字提取出來,放入一個(gè)數(shù)組;
遍歷數(shù)組,將數(shù)組中每個(gè)元素創(chuàng)建為一個(gè)節(jié)點(diǎn)實(shí)例,實(shí)例包含如下屬性:id, title, level, parent, childrenids。id即自己在數(shù)組中的序號(hào),title為自身文字,level即自身文字中包含感嘆號(hào)的數(shù)量。parent的算法稍復(fù)雜:尋找id和自己最接近且level比自己小1的節(jié)點(diǎn),它的id即parent的值。childrenids暫時(shí)設(shè)為一個(gè)空數(shù)組。
上一步遍歷完成后,再次遍歷,根據(jù)parent值將各個(gè)節(jié)點(diǎn)的childrenids數(shù)組填寫好。
至此,所有節(jié)點(diǎn)的屬性值已經(jīng)都具備。如果我們需要用一個(gè)json來結(jié)構(gòu)化的表達(dá)這一組數(shù)據(jù),那么只需要再次遍歷數(shù)組,創(chuàng)建一個(gè)json,將相應(yīng)的值填充好就可以了。
下面是實(shí)現(xiàn)這個(gè)算法的代碼:
var str="!內(nèi)容 !!同盟會(huì)的政治綱領(lǐng)是“驅(qū)除韃虜,恢復(fù)中華,創(chuàng)立民國(guó),平均地權(quán)”。 !!孫中山將同盟會(huì)的綱領(lǐng)概括為三大主義,即民族主義、民權(quán)主義、民生主義,后被稱為三民主義。 !!!民族主義,即民族革命,包括“驅(qū)除韃虜,恢復(fù)中華”兩項(xiàng)內(nèi)容。 !!!民權(quán)主義即政治革命,內(nèi)容是“創(chuàng)立民國(guó)”,即建立資產(chǎn)階級(jí)民主共和國(guó)。 !!!民生主義即社會(huì)革命,指的是“平均地權(quán)”。 !評(píng)價(jià): !!它初步描繪出中國(guó)還不曾有過的資產(chǎn)階級(jí)共和國(guó)方案,是一個(gè)比較完整而明確的資產(chǎn)階級(jí)民主革命綱領(lǐng)。!!對(duì)推動(dòng)革命的發(fā)展產(chǎn)生了重大而積極的影響。 !!但它并不是一個(gè)徹底的資產(chǎn)階級(jí)民主革命綱領(lǐng)。"; //提取文字創(chuàng)建數(shù)組 var pt=/!+[^!]+(?=!)/g; var arr=str.match(pt); console.log(arr) //遍歷數(shù)組,將數(shù)組中每個(gè)元素創(chuàng)建為一個(gè)節(jié)點(diǎn)實(shí)例 var nodes=[]; for(var i in arr){ var obj={}; obj.id=i; var len=arr[i].length; obj.title=arr[i].replace(/!/g,""); obj.level=len-obj.title.length; if(obj.level==1)obj.parent=-1; else obj.parent=findparent(obj.level,obj.id).id; obj.childrenids=[]; nodes.push(obj); } //遍歷數(shù)組,為每個(gè)節(jié)點(diǎn)補(bǔ)上子節(jié)點(diǎn)集合 for(var i in nodes){ nodes[i].childrenids=findchildrenid(nodes[i].id); } //轉(zhuǎn)化為json數(shù)組 var json={ title:"三民主義學(xué)說和資產(chǎn)階級(jí)共和國(guó)方案", id:-1, parent:-1, level:-1, childrenids:findchildrenid(-1) } createjson(json,json.childrenids); function createjson(node,idarr){ var c=[]; for(var i in idarr){ c.push(findbyid(idarr[i])); } node.children=c; for(var i in c){ createjson(c[i],c[i].childrenids); } } console.log(JSON.stringify(json,null," ")) function findchildrenid(id){ var arr=[]; for(var i in nodes){ if(nodes[i].parent==id)arr.push(nodes[i].id); } return arr; } function findparent(level,id){ var parr=findbylevel(level-1); var n={},sub; for(var i in parr){ if(parr[i].id最后執(zhí)行生成json的打印結(jié)果如下:
{ "title": "三民主義學(xué)說和資產(chǎn)階級(jí)共和國(guó)方案", "id": -1, "parent": -1, "level": -1, "childrenids": [ "0", "6" ], "children": [ { "id": "0", "title": "內(nèi)容 ", "level": 1, "parent": -1, "childrenids": [ "1", "2" ], "children": [ { "id": "1", "title": "同盟會(huì)的政治綱領(lǐng)是“驅(qū)除韃虜,恢復(fù)中華,創(chuàng)立民國(guó),平均地權(quán)”。 ", "level": 2, "parent": "0", "childrenids": [], "children": [] }, { "id": "2", "title": "孫中山將同盟會(huì)的綱領(lǐng)概括為三大主義,即民族主義、民權(quán)主義、民生主義,后被稱為三民主義。 ", "level": 2, "parent": "0", "childrenids": [ "3", "4", "5" ], "children": [ { "id": "3", "title": "民族主義,即民族革命,包括“驅(qū)除韃虜,恢復(fù)中華”兩項(xiàng)內(nèi)容。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] }, { "id": "4", "title": "民權(quán)主義即政治革命,內(nèi)容是“創(chuàng)立民國(guó)”,即建立資產(chǎn)階級(jí)民主共和國(guó)。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] }, { "id": "5", "title": "民生主義即社會(huì)革命,指的是“平均地權(quán)”。 ", "level": 3, "parent": "2", "childrenids": [], "children": [] } ] } ] }, { "id": "6", "title": "評(píng)價(jià): ", "level": 1, "parent": -1, "childrenids": [ "7", "8" ], "children": [ { "id": "7", "title": "它初步描繪出中國(guó)還不曾有過的資產(chǎn)階級(jí)共和國(guó)方案,是一個(gè)比較完整而明確的資產(chǎn)階級(jí)民主革命綱領(lǐng)。", "level": 2, "parent": "6", "childrenids": [], "children": [] }, { "id": "8", "title": "對(duì)推動(dòng)革命的發(fā)展產(chǎn)生了重大而積極的影響。 ", "level": 2, "parent": "6", "childrenids": [], "children": [] } ] } ] }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78322.html
摘要:可以這樣說,庫使得創(chuàng)建深度學(xué)習(xí)模型變得快速且簡(jiǎn)單。在本教程中,你將了解如何用中更具靈活性的函數(shù)式來定義深度學(xué)習(xí)模型。如何使用函數(shù)式定義簡(jiǎn)單的多層感知器卷積神經(jīng)網(wǎng)絡(luò)以及循環(huán)神經(jīng)網(wǎng)絡(luò)模型。 可以這樣說,Keras Python庫使得創(chuàng)建深度學(xué)習(xí)模型變得快速且簡(jiǎn)單。序列API使得你能夠?yàn)榇蠖鄶?shù)問題逐層創(chuàng)建模型。當(dāng)然它也是有局限性的,那就是它并不能讓你創(chuàng)建擁有共享層或具有多個(gè)輸入或輸出的模型。Ker...
摘要:秋招變夏招,還沒準(zhǔn)備好團(tuán)隊(duì)成員收割機(jī)牽頭,帶領(lǐng)名成員歷時(shí)個(gè)月,整理了一份機(jī)器學(xué)習(xí)算法工程師求職面經(jīng)。但如果之前并沒有意識(shí)到這一問題也沒關(guān)系,為你呈現(xiàn)一份小而美的面經(jīng)。這部分內(nèi)容包含了邏輯題目及概率題目?jī)煞矫娴膬?nèi)容。 秋招變夏招,還沒準(zhǔn)備好?Datawhale團(tuán)隊(duì)成員offer收割機(jī)牽頭,帶領(lǐng)14名成員歷時(shí)2個(gè)月,整理了一份機(jī)器學(xué)習(xí)算法工程師求職面經(jīng):Daily-interview。一份...
摘要:程序員小吳打算使用動(dòng)畫的形式來幫助理解遞歸,然后通過遞歸的概念延伸至理解動(dòng)態(tài)規(guī)劃算法思想。因此,分治策略一般用來解決子問題相互對(duì)立的問題,稱為標(biāo)準(zhǔn)分治,而動(dòng)態(tài)規(guī)劃用來解決子問題重疊的問題。難點(diǎn)就在于找出動(dòng)態(tài)規(guī)劃中的這三個(gè)概念。 在學(xué)習(xí)「數(shù)據(jù)結(jié)構(gòu)和算法」的過程中,因?yàn)槿肆?xí)慣了平鋪直敘的思維方式,所以「遞歸」與「動(dòng)態(tài)規(guī)劃」這種帶循環(huán)概念(繞來繞去)的往往是相對(duì)比較難以理解的兩個(gè)抽象知識(shí)點(diǎn)。...
摘要:前端性能優(yōu)化的涉及點(diǎn)從服務(wù)器到協(xié)議再到宿主環(huán)境本身都要有比較深刻的認(rèn)識(shí),業(yè)界目前主要還是以雅虎總結(jié)出來?xiàng)l前端性能優(yōu)化的黃金軍規(guī)為參考。 歡迎大家前往騰訊云技術(shù)社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~ 導(dǎo)語 : 從事前端有6年+的時(shí)間了,從最開始的美工到重構(gòu)再到偏向js邏輯開發(fā)的前端開發(fā),一直在前端這個(gè)行業(yè)里面摸索和學(xué)習(xí),我現(xiàn)在將自己這些年的一個(gè)心得體會(huì)來個(gè)系統(tǒng)性的梳理寫成一篇關(guān)于性能優(yōu)化...
閱讀 2243·2021-11-15 11:36
閱讀 1408·2021-10-14 09:42
閱讀 4239·2021-09-30 09:52
閱讀 1764·2021-09-24 10:24
閱讀 993·2021-09-02 09:56
閱讀 2715·2019-08-30 13:11
閱讀 3078·2019-08-30 13:06
閱讀 968·2019-08-30 12:56