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<Node>
。【参考方案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<Node>
。例如。如果你有necklaces
jewlery
和summer collection
【讨论】:
【参考方案3】:这个学期我有一个在树上搜索的项目。我使用了不同类型的算法。例如,BFS 或 DFS 这取决于您想要什么以及您希望如何在树中的节点上移动。但是,我更喜欢 IDS(迭代深化深度优先搜索)。要使用此算法,您可以访问此链接。
最好有父亲而不是孩子,因为这样会更好,而且不会耗尽内存。clip in Youtube to show IDS complete teaching about IDS 如果您愿意,还有其他好的算法可以问我。 您需要定义一个 State 类。
class State
String name;
State father;
【讨论】:
以上是关于Java - 具有多个节点的树数据结构 - 如何有效地搜索的主要内容,如果未能解决你的问题,请参考以下文章