Java - 具有多个节点的树数据结构 - 如何有效地搜索

Posted

技术标签:

【中文标题】Java - 具有多个节点的树数据结构 - 如何有效地搜索【英文标题】:Java - tree data structure with multiple nodes - how to search efficiently 【发布时间】:2017-07-09 07:41:35 【问题描述】:

我正在为我拥有的某些类别和子类别寻找实现/数据结构。我正在考虑使用搜索树,但不确定如何开始实施。

让我向您展示数据的样子。它实际上是作为后端的 json 结构出现的,但它看起来像这样:

  [
    
      "id": 94,
      "category_name": "New In", //this is the category category_name
      "description": "",
      "children": [ //this is the category children which can also be a sub-category
        
          "id": 322,
          "category_name": "New Studio",
          "description": "Chic, sophisticated and polished with a classic edge."
        ,
        
          "id": 365,
          "category_name": "New Soho",
          "description": "Fresh, eclectic, and trendy. Oozes effortless cool."
        ,
        
          "id": 809,
          "category_name": "Summer Collection",
          "description": "Your ultimate summer look"
        
      ]
    ,
    
      "id": 12,
      "category_name": "Clothes",
      "description": "",
      "children": [
        
          "id": 22,
          "category_name": "All Clothes",
          "description": ""
        ,
        
          "id": 63,
          "category_name": "Tops",
          "description": "",
          "children": [
            
              "id": 5,
              "category_name": "All Tops",
              "description": ""
            

          ]
        ,
        
          "id": 641,
          "category_name": "Accessories",
          "description": "",
          "children": [
            
              "id": 61,
              "category_name": "All Accessories",
              "description": ""
            ,
            
              "id": 622,
              "category_name": "Jewelry",
              "description": "",
              "children": [ // here is an example of a child that is a sub-category also
                
                  "id": 52,
                  "category_name": "All Jewelry",
                  "description": ""
                ,
                
                  "id": 68,
                  "name": "Necklaces",
                  "description": ""
                ,
                
                  "id": 69,
                  "name": "Bracelets",
                  "description": ""
                ,

              ]
            ,

  ]

所以如果我必须把它画出来,它会看起来像这样:

所以我希望能够找到任何东西的路径。因此,例如,如果我想搜索项链,那么我除了想要一条项链来获取路径:类别/配饰/珠宝/项链

是否有内置的数据结构?我正在用java编码。我想我还需要按某种顺序排序的节点,也许是 A-Z。

到目前为止我有这个:

class Node
 String label;
 List<Node> children;

那么如何搜索呢?有没有更好的数据结构?我不想在搜索过程中遍历所有节点,有没有办法对树进行排序,所以我不必这样做?我现在是如何拥有它的,我必须遍历所有的孩子。有没有一种方法可以按字母顺序排序,或者某种可以加快查找速度的排序?

【问题讨论】:

你可以使用这个API:sourceforge.net/p/treeds4j. 【参考方案1】:

为此你需要两件事:

在您的 Node 对象中,也有对父节点的引用:

class Node
    String label;
    List<Node> children;
    Node parent;

创建一个将标签映射到节点的 HashMap:

HashMap<String, Node> labelsToNodes;

然后通过HashMap中的get()方法进行搜索。您可以通过重复获取父节点来获取类别列表。如果您想要此代码,请告诉我,我会添加它(我现在时间不多)。

【讨论】:

正如我在回答中提到的,如果您必须多次处理同一个标签,您可能需要在 HashMap 中使用 List&lt;Node&gt;【参考方案2】:

到目前为止,我不知道任何 Java 内置数据结构可以处理您正在寻找的内容。 ***上有一些tree implementations on github或thread会帮助你。 但是,如果我对您的理解正确,您也有兴趣在您的树上进行良好的搜索。 对树进行排序并不能完全解决这个问题,因为您仍然需要搜索每个子树。虽然它可以显着提高搜索性能。但据我所知,Java 中没有现成的数据结构。

我想到的另一种方法是使用带有 label 的 Map 并引用相应的 Node。但是,您需要一棵树,您可以在其中从叶子节点到根节点以获取完整路径,并且您必须处理重复的信息。例如。如果你删除一个节点,你也必须在地图中删除它。如果你还想从根开始遍历树,你可以构建一个双向树。

这就是我的方法的样子:

class Node 
    String label;
    Node parent;


class Tree 
    HashMap<String, List<Node>> tree;

如果您有多个相同的标签名称,则为List&lt;Node&gt;。例如。如果你有necklacesjewlerysummer collection

【讨论】:

【参考方案3】:

这个学期我有一个在树上搜索的项目。我使用了不同类型的算法。例如,BFS 或 DFS 这取决于您想要什么以及您希望如何在树中的节点上移动。但是,我更喜欢 IDS(迭代深化深度优先搜索)。要使用此算法,您可以访问此链接。

最好有父亲而不是孩子,因为这样会更好,而且不会耗尽内存。clip in Youtube to show IDS complete teaching about IDS 如果您愿意,还有其他好的算法可以问我。 您需要定义一个 State 类。


    class State
    String name;
    State father;
    

【讨论】:

以上是关于Java - 具有多个节点的树数据结构 - 如何有效地搜索的主要内容,如果未能解决你的问题,请参考以下文章

Mysql与索引有关的树的概念

如何遍历具有多个分支的树

树,二叉树

树与树算法

树和二叉树简介

树和二叉树简介