成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一個(gè)將數(shù)據(jù)結(jié)構(gòu)化的算法——以思維簡(jiǎn)圖為例

wuyangchun / 1167人閱讀

摘要:?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

相關(guān)文章

  • 如何使用Keras函數(shù)式API進(jìn)行深度學(xué)習(xí)?

    摘要:可以這樣說,庫使得創(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...

    CocoaChina 評(píng)論0 收藏0
  • 求職攻略 | Datawhale助力秋招最強(qiáng)戰(zhàn)甲

    摘要:秋招變夏招,還沒準(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。一份...

    CKJOKER 評(píng)論0 收藏0
  • 看動(dòng)畫輕松理解「遞歸」與「動(dòng)態(tài)規(guī)劃」

    摘要:程序員小吳打算使用動(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)。...

    cnio 評(píng)論0 收藏0
  • 鳥瞰前端 , 再論性能優(yōu)化

    摘要:前端性能優(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)化...

    voidking 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<