【问题标题】:Java - tree data structure with multiple nodes - how to search efficientlyJava - 具有多个节点的树数据结构 - 如何有效地搜索
【发布时间】: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;
}

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

【问题讨论】:

标签: java data-structures tree


【解决方案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 内置数据结构可以处理您正在寻找的内容。 stackoverflow上有一些tree implementations on githubthread会帮助你。 但是,如果我对您的理解正确,您也有兴趣在您的树上进行良好的搜索。 对树进行排序并不能完全解决这个问题,因为您仍然需要搜索每个子树。虽然它可以显着提高搜索性能。但据我所知,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;
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2014-09-28
      相关资源
      最近更新 更多