【问题标题】:Searching data stored in a tree搜索存储在树中的数据
【发布时间】:2011-02-03 11:59:51
【问题描述】:

我有这个分层的数据,所以我将它存储在树中。我想为其提供搜索功能。我必须为此创建一个二叉树吗?我不想两次拥有数千个节点。难道没有一种树可以让我按照给定的顺序存储数据,还可以像二叉树一样高效搜索设置,而且开销很小?

任何其他数据结构建议也将不胜感激。

谢谢。

编辑:

一些细节:这棵树是一个非常简单的“手工”树,可以认为是非常非常基本的。问题是,有成千上万的名称和其他文本将作为我想要搜索的数据输入,但我不想以传统方式遍历节点,需要像二进制搜索这样的快速搜索。

另外,重要的是,用户必须能够看到他输入的结构,而不是排序的结构。所以我不能保持排序以支持搜索。这就是为什么我说我不想拥有数千个节点两次。

【问题讨论】:

  • 为什么你认为你需要两次节点?当你说“我把它放在树上”时——什么样的树?是什么阻止您直接搜索?基本上,需要更多细节。
  • 它不一定是二叉树。它必须是search tree。二叉树本身不能提供快速搜索。
  • @Paul 我在问题中添加了一些细节。
  • @Martinho Fernandes 好的,当我说二叉树时,我的意思是搜索树。谢谢(你的)信息。我是数据结构的新手。

标签: c++ data-structures tree


【解决方案1】:

如果您不想更改树的层次结构,请使用map 来存储指向顶点的指针:std::map<SearchKeyType,Vertex*> M

每次将顶点添加到树时,您也需要将其添加到地图中。这很容易:M[key]=&vertex。要查找元素,请使用M.find(key);,如果您确定该键存在,请使用M[key];

如果你的树有重复的键,那么你应该使用multimap

编辑:如果您的密钥太大,您可以使用指向密钥的指针而不是密钥:

inline bool comparisonFunction(SearchKeyType * arg1,SearchKeyType * arg2);

std::map<SearchKeyType *, Vertex *, comparisonFunction> M;

inline bool comparisonFunction(SearchKeyType * arg1,SearchKeyType * arg2)
{
         return (*arg1)<(*arg2);
}

要搜索值为V 的元素,您必须编写以下内容:

Vertex * v = M[&V]; // assuming that element V exists in M

【讨论】:

  • 感谢您的回复。似乎对于我添加到树中的每个节点,我都必须在映射中存储一个指向该节点的指针,从而有效地复制节点计数,尽管是在另一个数据结构中。我的意思是,维护这个指针的映射必须在内部创建节点。但这是我想要避免的。我理解错了吗?
  • 是的,非常。我什至在 OP 的编辑中提到它,因为它非常重要。数据显示在 UI 中。
  • @Dirt 我编辑了我的答案。是的,如果不使用更多内存,您将无法做到这一点。
猜你喜欢
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 2018-11-24
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多