当前位置: 首页 > 知识库问答 >
问题:

如何使用二进制搜索从排序树集检索元素?

林星华
2023-03-14

我正在尝试将多个已排序的列表合并到一个树集中。。然后我考虑在树集上应用二进制搜索算法,以O(logn)的时间复杂度检索元素。。

下面是我的代码,我在其中一个方法中传递列表列表,并将它们组合成TreeSet以避免重复...所有列表中的输入排序-

private TreeSet<Integer> tree = new TreeSet<Integer>();

public void mergeMultipleLists(final List<List<Integer>> inputs) {
    tree = new TreeSet<Integer>();
    for (List<Integer> input : inputs) {
        for(Integer ii : input) {
            tree.add(ii);
        }
    }
}

public List<Integer> getItem(final Integer x) {
    // extract elements from TreeSet in O(log n)
}
  • 首先,这是将多个排序列表合并到树集的正确方法吗?有没有直接的方法可以有效地合并TreeSet中的多个排序列表

或者,与我目前使用的数据结构相比,我更适合使用另一种数据结构?

更新代码:-

私有树集树=新树集();

public SearchItem(final List<List<Integer>> inputs) {
    tree = new TreeSet<Integer>();
    for (List<Integer> input : inputs) {
        tree.addAll(input);
    }
}

public Integer getItem(final Integer x) {
    if(tree.contains(x)) {
        return x;
    } else {
        // now how do I extract next largest 
         // element from it if x is not present
    }
}

共有3个答案

章安易
2023-03-14

TreeSet本质上是一个排序集,通过TreeMap使用红树黑树作为后盾

基本上是:树集。加(E)-

因为它已经是一个二进制的排序树结构,任何“获取”或“包含”都将导致O(log n)操作。

你的代码和你的问题不一致。

您正在压平一个列表

但是接下来的方法是“给定这个整数,给我一个列表

所以,让我按顺序回答你的问题:

  1. 当然/是Y
  2. 没有。你误解了集合(你不能通过设计提取)如果你能做Set.contains(e),那么你就有了元素,不需要提取任何东西

如果您需要执行设置提取之类的操作,请使用TreeMap或将您的设置转换回列表,并执行myList.get(Collections.binarySearch(myElement));

朱祺
2023-03-14

您可以使用TreeSet.floor(),根据文档

返回此集合中小于或等于给定元素的最大元素,如果没有此类元素,则返回null。

孔彭祖
2023-03-14

TreeSet由一个NavigableMap、一个TreeMap支持。在TreeSet上调用contains()将委托给TreeMap。containsKey(),这是一个二进制搜索实现。

您可以使用TreeSet检查集合中是否包含对象。contains(),但必须先拥有对象。如果您希望能够查找和检索对象,那么Map实现会更好。

 类似资料:
  • 一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。 我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。 通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。 我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法

  • 我正在用python开发一个二叉查找树。但是我的检索方法并不像我希望的那样工作。只有当我想检索根节点时,它才返回正确的值,对于所有其他节点,它都不返回任何值。 下面是我的节点类的代码: 我的二叉树代码: 所以Bintree中的最后一个方法为除Root之外的所有值返回Not,但它应该返回节点的值。 填充树:

  • 给定二叉查找树(BST)和整数val的根。 在BST中找到该节点的值等于val的节点,并返回以该节点为根的子树。如果这样的节点不存在,则返回null。 为什么'ans=root'不起作用??

  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。

  • 问题内容: 我被要求对数组进行排序和搜索。对数组进行排序很简单,我的代码也起作用了,但是每当我尝试调用二进制搜索方法时,它就可以对数组中的第一个元素起作用,但是结果是“ -1” 我的完整代码如下: 问题答案: 您搞砸了二进制搜索间隔

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地