<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      多叉樹(shù)實(shí)現(xiàn)類目體系

      1. 引言

      電商類的網(wǎng)站(比如:京東)為了便于用戶瀏覽商品,建立了一套類目體系,對(duì)商品進(jìn)行各種粗細(xì)粒度的劃分。類似地,用戶畫(huà)像的標(biāo)簽體系也劃分多層級(jí)的結(jié)構(gòu)。在做標(biāo)簽洞察時(shí),需要將這種帶有層級(jí)的體系序列化json,提供給前端。但是,標(biāo)簽體系是存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中,為平鋪化的表結(jié)構(gòu),如何將其表達(dá)為具有層次的數(shù)據(jù)結(jié)構(gòu)呢?多叉樹(shù)(Multiway Tree)正好能完美地詮釋類目體系,比如,一篇論文的結(jié)構(gòu)對(duì)應(yīng)于一棵多叉樹(shù),如下圖所示:

      從上圖可以看出,不同于二叉樹(shù),多叉樹(shù)的非葉子節(jié)點(diǎn)的孩子節(jié)點(diǎn)數(shù)目可以為任意整數(shù),而不僅局限于1或2。

      2. 代碼實(shí)現(xiàn)

      數(shù)據(jù)庫(kù)讀取

      用DBUtils封裝從父節(jié)點(diǎn)得到所有子節(jié)點(diǎn)的方法:

      public List<IDName> getChildren(String id) {
        ResultSetHandler<List<IDName>> h = new BeanListHandler<>(IDName.class);
        try {
          List<IDName> results = run.query("select ...", h, id);
          if (results.size() == 0) {
            results = run.query("select ...", h, id);
          }
          return results;
        } catch (SQLException e) {
          System.err.println("sql exception");
        }
        return null;
      }
      

      定義

      多叉樹(shù)的樹(shù)節(jié)點(diǎn)定義如下:

      public class TagTreeNode {
        private String id;
        private String name;
        private List<TagTreeNode> children = new LinkedList<>();
      
        public TagTreeNode(String id, String name) {
          this.id = id;
          this.name = name;
        }
        
        // gettter & setter
      }
      

      idname為節(jié)點(diǎn)的屬性值,children為子節(jié)點(diǎn)list。

      構(gòu)造

      多叉樹(shù)的構(gòu)造大致分為兩類:BFS與DFS。數(shù)據(jù)庫(kù)讀取拿到的是父節(jié)點(diǎn)所有的子節(jié)點(diǎn),因此只能采取BFS來(lái)構(gòu)造了。眾所周知,BFS遍歷時(shí)需要借助隊(duì)列用以緩存以訪問(wèn)的節(jié)點(diǎn),Java實(shí)現(xiàn)代碼如下:

      public class TagTree {
        public TagTreeNode root; // root node
        private Queue<TagTreeNode> queue = new LinkedList<>();
      
        // create multiway tree
        public TagTree(TagUtil td, Connection conn, String id, String name, Level level) throws SQLException {
          init(td, conn, id, name);
          generate(td, conn);
        }
      
        // add children nodes
        private void addChildren(TagUtil td, Connection conn, TagTreeNode parent) {
          List<IDName> idnames = td.getChildren(conn, parent.getId());
          if (idnames != null) {
            for (IDName idname : idnames) {
              TagTreeNode node = new TagTreeNode(idname.getId(), idname.getName());
              queue.add(node);
              parent.getChildren().add(node);
            }
          }
        }
      
        public void init(TagUtil td, Connection conn, String id, String name) {
          root = new TagTreeNode(id, name);
          addChildren(td, conn, root);
        }
      
        public void generate(TagUtil td, Connection conn) {
          while (!queue.isEmpty()) {
            TagTreeNode node = queue.remove();
            addChildren(td, conn, node);
          }
        }
      }
      
      posted @ 2016-08-30 20:15  Treant  閱讀(1747)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 中文字幕日韩精品人妻| av中文字幕在线二区| 中文字幕av无码免费一区 | 麻豆精产国品一二三区区| 久久免费观看归女高潮特黄| 大胸美女吃奶爽死视频| 最新偷拍一区二区三区| 日韩一区二区三区精品| 国产三级黄色片在线观看| 好男人社区影视在线WWW| 97久久超碰国产精品2021| 熟女蜜臀av麻豆一区二区| 亚洲天堂在线观看完整版| 成人h动漫精品一区二区无码| 日韩免费无码视频一区二区三区| 亚洲第一区二区三区av| 日韩黄色av一区二区三区| 精品人妻少妇一区二区三区在线| 国产精品三级爽片免费看| 久久精品中文字幕免费| 国产超碰无码最新上传| 久久久久四虎精品免费入口| 久久精品人人槡人妻人人玩| 亚洲国模精品一区二区| 豆国产97在线 | 亚洲| 亚洲精品777| 国产成熟女人性满足视频| 亚洲18禁一区二区三区| 中文字幕一区二区三区精彩视频| 日韩丝袜欧美人妻制服| 中文字幕人妻无码一区二区三区| 亚洲中文字幕无码专区| 精品超清无码视频在线观看| 亚洲成a人片在线观看中| 国产精品香蕉在线观看不卡| 国偷自产一区二区三区在线视频| 亚洲国产成人精品激情姿源| 永久免费无码成人网站| 欧洲亚洲精品免费二区| 非会员区试看120秒6次| 国产免费福利网站|