国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

分層數(shù)據(jù)Hierarchical Data探索(1.遞歸)

yzd / 2085人閱讀

摘要:分層數(shù)據(jù)探索例如無(wú)限級(jí)分類(lèi)多級(jí)菜單省份城市引言什么是分層數(shù)據(jù)類(lèi)似于樹(shù)形結(jié)構(gòu),除了根節(jié)點(diǎn)和葉子節(jié)點(diǎn)外,所有節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn)和一個(gè)或多個(gè)子節(jié)點(diǎn)。接下來(lái)我會(huì)先通過(guò)一般方法和遞歸方法來(lái)實(shí)現(xiàn)無(wú)限極分類(lèi),然后再通過(guò)兩種數(shù)據(jù)模型來(lái)談一談分層數(shù)據(jù)的處理。

分層數(shù)據(jù)Hierarchical Data探索(例如:無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市) 引言

什么是分層數(shù)據(jù)?

類(lèi)似于樹(shù)形結(jié)構(gòu),除了根節(jié)點(diǎn)和葉子節(jié)點(diǎn)外,所有節(jié)點(diǎn)都有一個(gè)父節(jié)點(diǎn)和一個(gè)或多個(gè)子節(jié)點(diǎn)。

大多數(shù)同學(xué)都曾在數(shù)據(jù)庫(kù)中處理過(guò)分層數(shù)據(jù)(hierarchical data),分層數(shù)據(jù)存在于許多基于數(shù)據(jù)庫(kù)的應(yīng)用程序中,包括論壇和郵件列表中的分類(lèi)、商業(yè)組織圖表、內(nèi)容管理系統(tǒng)的分類(lèi)、產(chǎn)品分類(lèi)、無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市等等。但是因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)中的表沒(méi)有層次關(guān)系,只是簡(jiǎn)單的平面化的列表;而分層數(shù)據(jù)具有父-子關(guān)系,顯然關(guān)系數(shù)據(jù)庫(kù)中的表不能自然地表現(xiàn)出其分層的特性。

接下來(lái)我會(huì)先通過(guò)一般方法和遞歸(recursion)方法來(lái)實(shí)現(xiàn)無(wú)限極分類(lèi),然后再通過(guò)兩種數(shù)據(jù)模型來(lái)談一談分層數(shù)據(jù)的處理。

分層數(shù)據(jù)Hierarchical Data探索(1.遞歸 recursion)

分層數(shù)據(jù)Hierarchical Data探索(2.鄰接表模型 Adjacency List Model)

分層數(shù)據(jù)Hierarchical Data探索(3.嵌套集合模型 Nested Set Model)

三種方式的變量傳遞

& 引用賦值

function doloop1(&$i = 1)
{
    print_r($i);
    $i++;
    if ($i <= 10) {
        doloop1($i);
    }
}
doloop1();

static 靜態(tài)變量

function doloop2()
{
    static $i = 1;
    print_r($i);
    $i++;
    if ($i <= 10) {
        doloop2();
    }
}

doloop2();

global 全局變量

$i = 1;
function doloop3()
{
    global $i;
    echo $i;
    $i++;
    if ($i <= 10) {
        doloop3();
    }
}
doloop3();
構(gòu)建模擬數(shù)據(jù)
# 模擬數(shù)據(jù)
       $data = [
            ["id" => 1, "title" => "Electronics", "parent_id" => 0],
            ["id" => 2, "title" => "Laptops & PC", "parent_id" => 1],
            ["id" => 3, "title" => "Laptops", "parent_id" => 2],
            ["id" => 4, "title" => "PC", "parent_id" => 2],
            ["id" => 5, "title" => "Cameras & photo", "parent_id" => 1],
            ["id" => 6, "title" => "Camera", "parent_id" => 5],
            ["id" => 7, "title" => "Phones & Accessories", "parent_id" => 1],
            ["id" => 8, "title" => "Smartphones", "parent_id" => 7],
            ["id" => 9, "title" => "Android", "parent_id" => 8],
            ["id" => 10, "title" => "iOS", "parent_id" => 8],
            ["id" => 11, "title" => "Other Smartphones", "parent_id" => 8],
            ["id" => 12, "title" => "Batteries", "parent_id" => 7],
            ["id" => 13, "title" => "Headsets", "parent_id" => 7],
            ["id" => 14, "title" => "Screen Protectors", "parent_id" => 7],
        ];
獲取無(wú)限極分類(lèi)
/**
 * 值引用獲取無(wú)限極分類(lèi)樹(shù)
 * 
 * @param array $data
 * @return array
 */
function make_tree($data)
{  
    $refer = array();  
    $tree = array();  
    foreach($data as $k => $v){  
        $refer[$v["id"]] = & $data[$k];  //創(chuàng)建主鍵的數(shù)組引用  
    }  

    foreach($data as $k => $v){  
        $parent_id = $v["parent_id"];   //獲取當(dāng)前分類(lèi)的父級(jí)id  
        if($parent_id == 0){  
            $tree[] = & $data[$k];   //頂級(jí)欄目
        }else{  
            if(isset($refer[$parent_id])){  
                $refer[$parent_id]["children"][] = & $data[$k];  //如果存在父級(jí)欄目,則添加進(jìn)父級(jí)欄目的子欄目數(shù)組中  
            }  
        }  
    }  

    return $tree;  
}

/**
 * 遞歸獲取無(wú)限極分類(lèi)樹(shù)
 * 
 * @param array $data
 * @param int $parent_id
 * @param int $level
 * @return array
 */
function make_tree2($data = [], $parent_id = 0, $level = 0)
{
    $tree = [];
    if ($data && is_array($data)) {
        foreach ($data as $v) {
            if ($v["parent_id"] == $parent_id) {
                $tree[] = [
                    "id" => $v["id"],
                    "level" => $level,
                    "title" => $v["title"],
                    "parent_id" => $v["parent_id"],
                    "children" => make_tree2($data, $v["id"], $level + 1),
                ];
            }
        }
    }
    return $tree;
}
獲取子節(jié)點(diǎn)以及節(jié)點(diǎn)的層級(jí)
/**
 * 引用賦值方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */
function getSubTree($data = [], $id = 0, $level = 0)
{
    static $tree = [];

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}

/**
 * 靜態(tài)變量方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */
function getSubTree($data = [], $id = 0, $level = 0)
{
    static $tree = [];

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}


/**
 * 全局變量方式
 * @param array $data
 * @param int $id
 * @param int $level
 * @return array
 */

$tree = [];  //先申明變量
function getSubTree($data = [], $id = 0, $level = 0)
{
    global $tree;

    foreach ($data as $key => $value) {
        if ($value["parent_id"] == $id) {
            $value["laravel"] = $level;
            $tree[] = $value;
            getSubTree($data, $value["id"], $level + 1);
        }
    }
    return $tree;
}
通過(guò)pid獲取所有上級(jí)分類(lèi) 常用于面包屑導(dǎo)航
/**
 * getParentsByParentId2($categories, 9)
 *
 * @param array $data
 * @param $parent_id
 * @return array
 */
function getParentsByParentId($data = [], $parent_id)
{
    static $categories = [];

    if ($data && is_array($data)) {
        foreach ($data as $item) {
            if ($item["id"] == $parent_id) {
                $categories[] = $item;
                getParentsByParentId($data, $item["parent_id"]);
            }
        }
    }
    return $categories;
}

function getParentsByParentId2($data = [], $parent_id)
{
    $categories = [];

    if ($data && is_array($data)) {
        foreach ($data as $item) {
            if ($item["id"] == $parent_id) {
                $categories[] = $item;
                $categories = array_merge($categories, getParentsByParentId2($data, $item["parent_id"]));
            }
        }
    }
    return $categories;
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31492.html

相關(guān)文章

  • 分層數(shù)據(jù)Hierarchical Data探索(2.鄰接表模型)

    摘要:分層數(shù)據(jù)探索例如無(wú)限級(jí)分類(lèi)多級(jí)菜單省份城市引言第一篇分層數(shù)據(jù)探索遞歸已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法實(shí)現(xiàn)了無(wú)限極分類(lèi),但是遞歸即浪費(fèi)時(shí)間,又浪費(fèi)空間內(nèi)存尤其是在數(shù)據(jù)量大的情況下效率顯著下降。 分層數(shù)據(jù)Hierarchical Data探索(例如:無(wú)限級(jí)分類(lèi)、多級(jí)菜單、省份城市) 引言 第一篇 分層數(shù)據(jù)Hierarchical Data探索(1.遞歸)已經(jīng)介紹了分層數(shù)據(jù)以及使用遞歸算法...

    Scott 評(píng)論0 收藏0
  • 遞歸的藝術(shù) - 深度遞歸網(wǎng)絡(luò)在序列式推薦的應(yīng)用

    摘要:因?yàn)樵诿恳粫r(shí)刻對(duì)過(guò)去的記憶信息和當(dāng)前的輸入處理策略都是一致的,這在其他領(lǐng)域如自然語(yǔ)言處理,語(yǔ)音識(shí)別等問(wèn)題不大,但并不適用于個(gè)性化推薦,一個(gè)用戶(hù)的聽(tīng)歌點(diǎn)擊序列,有正負(fù)向之分。 在內(nèi)容爆炸性增長(zhǎng)的今天,個(gè)性化推薦發(fā)揮著越來(lái)越重要的作用,如何在海量的數(shù)據(jù)中幫助用戶(hù)找到感興趣的物品,成為大數(shù)據(jù)領(lǐng)域極具挑戰(zhàn)性的一項(xiàng)工作;另一方面,深度學(xué)習(xí)已經(jīng)被證明在圖像處理,計(jì)算機(jī)視覺(jué),自然語(yǔ)言處理等領(lǐng)域都取得了不俗...

    ZweiZhao 評(píng)論0 收藏0
  • DeepMind 提出分層強(qiáng)化學(xué)習(xí)新模型 FuN,超越 LSTM

    摘要:實(shí)驗(yàn)蒙特祖瑪?shù)膹?fù)仇蒙特祖瑪?shù)膹?fù)仇是上最難的游戲之一。圖蒙特祖瑪?shù)膹?fù)仇的學(xué)習(xí)曲線(xiàn)在第一個(gè)房間中學(xué)習(xí)的子目標(biāo)的可視化呈現(xiàn)。結(jié)論如何創(chuàng)建一個(gè)能夠?qū)W習(xí)將其行為分解為有意義的基元,然后重新利用它們以更有效地獲取新的行為,這是一個(gè)長(zhǎng)期存在的研究問(wèn)題。 論文題目:分層強(qiáng)化學(xué)習(xí)的 FeUdal 網(wǎng)絡(luò)(FeUdal Networks for Hierarchical Reinforcement Learnin...

    dailybird 評(píng)論0 收藏0
  • 理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢(qián)包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢(qián)包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢(qián)包同樣需要對(duì)比特幣的錢(qián)包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀 如果你還在被HD錢(qián)包、BIP32、BIP44、BIP39搞的一頭霧水...

    firim 評(píng)論0 收藏0
  • 理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢(qián)包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢(qián)包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢(qián)包同樣需要對(duì)比特幣的錢(qián)包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開(kāi)發(fā)HD錢(qián)包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀 如果你還在被HD錢(qián)包、BIP32、BIP44、BIP39搞的一頭霧水...

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

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

0條評(píng)論

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