【问题标题】:multiple search key for binary search tree in linux Clinux C中二叉搜索树的多个搜索键
【发布时间】:2013-06-09 17:34:33
【问题描述】:

我将二叉树定义为搜索表。树是一个链表二叉树,节点是这样的

typedef struct node{
    int key;
    char *buf;
    ...
}node_t;

typedef table_t node_t *; 所以我有像

这样的功能
  insert(table_t table, node_t node)
  search(table_t table, node_t node)

现在我有多个键,比如

typedef struct node{
    int key1;
    int key2;
    char *buf;
    ...
}node_t;

我想拥有如下功能:

  search_by_key1(table_t table, node_t node, int key1)
  search_by_key2(table_t table, node_t node, int key2)

确实,它就像一个数据库,我可以在任何键中搜索一个项目。

有源代码示例吗?我正在使用 linux C 谢谢!

【问题讨论】:

  • 有了多个键,你不需要多棵树吗?否则,哪个键决定哪个节点在左边,哪个在右边?
  • 是的,如果我有两个钥匙,我想也许我需要制作两棵树,有什么解决方法吗?

标签: c algorithm search


【解决方案1】:

二叉树只能由一个键索引。

如果您想使用多个键进行索引,您可以为每个键构建一个元树,元树有元节点,其中:

typedef struct meta_node
{
    int index;
    node * data;

    ...
}
meta_node_t;

【讨论】:

    【解决方案2】:

    嗯,在二叉树中,键仅在相互关联时才有意义。这意味着只有当 key1_b 在右分支中更大/更小(取决于你如何构建它)时,key1_a 在左分支中才有意义。如果您有一棵由两组键组成的树,假设它们具有相同的比例,它们可能位于相同的树数据结构中。如,如果 key2 中的每个键都比 key1 正好高 50。但这根本没有用。

    我唯一的想法就是让它有一些空值键。因此,如果您正在遍历您的树并且您位于 key1 而不是 key2 的叶子上,您只需继续前进,树的其余部分将在键中具有空值(可能是 -1?),或将有一个布尔触发器,因此 key1 不再存在于树的这个分支中。这有点难以描述,但你明白我的意思吗?就像基本上把它当作两棵交织在一起的树,然后一起走,直到你不得不发散(这样做的同时保持实际的树结构相同,但其中一个键具有空值)

    这听起来太复杂了,所以我不知道是否值得。

    【讨论】:

      【解决方案3】:

      你可以有两棵树,但仍然使用相同的节点:

      struct basic_node {
          int key;
          struct basic_node *left, *right;
          struct node *node;
      };
      struct node {
          struct basic_node tree1;
          struct basic_node tree2;
          char *data;
      };
      
      struct node *tree1_root, *tree2_root;
      

      当您创建一个节点时,您将分配一个struct node,然后根据其键将每个basic_node 分别插入到相应的树中。在每个basic_node 中,将node 指针设置为包含它的节点。

      查找时,只需从任一树根开始,然后进行简单查找,即可找到所需的basic_node,然后找到节点本身。

      如果要删除,必须先从两棵树中取消链接节点,然后才能释放它。

      【讨论】:

        【解决方案4】:

        我知道这个问题是很久以前提出的,但我在搜索用户正在寻找的确切数据结构时遇到了它......

        长话短说,可能有一个具有多个键的二叉搜索树,称为 K-D 树。

        基本上,您所做的是构建一个正常的二叉搜索树,但您会跟踪节点在树中的“深度”。对于像这个问题使用的两个键,所有深度为偶数的节点都根据 key_a 的值对其子节点进行排序,所有深度为奇数的节点根据 key_b 的值对其子节点进行排序。

        同样,当您搜索树时,您会遍历分支。当您在一个均匀深度的节点上时,您可以根据存储在该节点的 key_a 中的值是小于还是大于 key_a 的期望值来决定走哪个分支。当你在一个奇数深度的节点上时,你根据节点的值和 key_b 的期望值来决定。

        如果我没记错的话,谷歌使用了一种非常相似的数据结构来根据地理位置的范围快速找到位置,使用纬度作为一个键,经度作为另一个键。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多