TreeSet中有序操作的时间复杂度是多少?
以下操作在中,以下操作的时间复杂性是多少. java.util.TreeSet ? first() last() lower() higher() 我认为这是恒定的时间,但是API不能保证. 解决方案 实际上,我以为这些操作都是O(logN)用于一般实施. 对于first()和last()为O(1) O(1) treeset实现将需要分别将指针保持在树中最左和最右的叶子节点.保持这些插入的恒定成本,并且每次删除至少成本持续成本.实际上,实现可能会发现左/右最大节点即时...这是一个O(logN)操作. lower()和higher()方法必须做与get相同的工作,因此是O(logN). 当然,您可以自己检查源代码,以查看实际情况. (就像其他人所做的那样:见下文.) 其他解决方案 看起来像first()和last()是o(log n),而不是基于treemap的植入式(sun jdk 1.6.0_23)的o(1),默认情况下,treem
0 2024-01-22
编程技术问答社区
TreeSet迭代的时间复杂度是多少?
在我的代码中,java 我认为,通过提供从子节点到父节点的向后链接,我可以提高性能. 解决方案 TreeSet迭代当然是O(n),正如任何明智的树木行走算法所期望的. 我认为通过提供链接 从子节点向父母倒退 节点我可以提高性能. TreeMap(TreeSet基于)已经具有此类父录.这是所有方法都归结为: private Entry successor(Entry t) { if (t == null) return null; else if (t.right != null) { Entry p = t.right; while (p.left != null) p = p.left; return p; } else { Entry p = t.parent; Entry
0 2024-01-22
编程技术问答社区
如何在Java中返回TreeSet中的第k个元素?
也许我不使用正确的数据结构.我需要使用一个集合,但也需要有效地返回k-最小元素. TreeSet在Java中可以这样做吗?似乎没有内置的TreeSet来执行此操作. 解决方案 我不认为TreeSet有一种直接执行此操作的方法.有二进制搜索树确实支持o(log n)随机访问(它们有时称为顺序统计树),并且有> 另外,您可以(在某些情况下)可以使用TreeSet's tailSet 方法和修改后的二进制搜索,以尝试找到KTH元素.具体来说,查看TreeSet的第一个和最后一个元素,然后(如果可能给定的内容)选择两者中途的某些元素,然后将其作为参数传递给tailSet以获取一份元素中点之后的套装.然后,使用tailSet中的元素数量,然后可以决定是否找到了该元素,或者是探索树的左或右半部分.这是一个稍微修改的 interpolation搜索在树上,并且可能会很快.但是,我不知道tailSet方法的内部复杂性,因此这实际上可能比顺序统计树更糟.如果您不能计算两个元素的"中点",例如
8 2024-01-22
编程技术问答社区
Java中TreeSet方法的计算复杂度
Java中树方法的计算复杂性与Avltree的计算复杂性是相同的吗? 具体来说,我想知道以下方法的计算复杂性: 1. add 2.撤离 3.首先 4.last 5.地板 6.更高 java doc for方法描述:对于AVL树,所有O(logn)?上述树方法的复杂性是什么? 解决方案 编辑:应该澄清的是,时间顺序通常是指比较数.有些操作没有比较,因此可以从子任务数量 中获取时间顺序. 下面的代码在Java 8 中打印以下内容 O(1) comparisons, however the number of indirections could be O(ln N) Performing 10,000 first operations -> 0.0 comparisons/operation Performing 10,000 last operations -> 0.0 comparisons/operation Performing 10,000 size o
0 2024-01-22
编程技术问答社区
如何查找TreeSet中一个元素的索引?
我正在使用TreeSet,我很想找到集合中的数字的索引.是否有一种很好的方法可以真正利用二进制树的O(log(log(n))复杂性? (如果没有,我该怎么办,有人知道为什么不吗? 解决方案 @yrlec指出set.headSet(element).size,set.headSet(element).size将返回0,尽管集合中没有此元素.因此,我们最好检查: return set.contains(element)? set.headSet(element).size(): -1; 这是一个显示问题的测试用例: public static void main(String args[]){ TreeSet set = new TreeSet(); set.add(4); set.add(2); set.add(3); set.add(1); System.out.prin
4 2024-01-22
编程技术问答社区
在TreeSet中,基于不同属性的自定义对象的排序和唯一性
以下是我的学生班 class Student implements Comparable { String name; int rollNo; @Override public int compareTo(Object obj) { return ((Student)obj).name.compareTo(this.name); } } 最新修改:但仍然没有正确的结果 @Override public int compareTo(Object obj) { Student s = (Student) obj; if (name.equals(s.name)) { // achieving uniqueness return 0; } else { if (rollNo
8 2023-11-06
编程技术问答社区
Java-程序被卡在treeset.add()中
我有多线程,希望在代码的一部分中放入TreeSet中的值.这些值几乎是唯一的,因为它们是System.nanoTime().我定期清洁TreeSet.问题是有时我的线程在TreeSet.add()函数中被阻止.我使用jconsole观看线程状态,线程处于RUNNABLE状态,堆栈跟踪显示了以下内容: java.util.TreeMap.put(TeeMap.java:567) java.util.TreeSet.add(TreeSet.java:255) ... //my program stack trace 我正在使用JDK 1.7.0_60进行程序程序.另外,在这种情况下,我应该提到CPU使用率100%.我的问题是为什么线程被阻止了,我该如何解决情况?我查看了Treemap代码,但我没有弄清楚问题,但我认为问题与TreeMap.put()中的循环有关. . 解决方案 在注释中提到的是,问题是TreeSet不是线程安全,如果我们要在多线程中对其进行修改(添
8 2023-10-26
编程技术问答社区
为什么java允许TreeMap的键和TreeSet的值没有可比性?
以下是Java Treemap实现的标题(1.8_071): public class TreeMap extends AbstractMap implements NavigableMap, Cloneable, java.io.Serializable 为什么没有限制,这样: public class TreeMap,V> extends AbstractMap implements NavigableMap, Cloneable, java.io.Serializable 解决方案 因为,正如Doc所说,您可以使用不可比喻的键并提供比较对象: TreeMap(Comparator comparator) Constructs a new, empty tree map, ordered
8 2023-10-26
编程技术问答社区
将Java树映射代码迁移到Scala?
我将我的Java代码群迁移到纯Scala,并且我被卡住了在这一件代码上.我有一个IntervalMap的实现,即,让您有效地映射范围[from,to]到values的数据结构,其中set,delete和get操作都是O(log n)(与IntervateRee或IntervateRee略有不同)片段). 此代码使用Java的java.util.TreeMaps,并且在迁移到Scala时,我遇到了2个大问题: scala没有mutable.TreeMap - 我决定使用mutable.TreeSet(奇怪的是Scala具有mutable.TreeSet,但没有mutable.TreeMap)来存储键并将值存储在辅助.这是一个不愉快的黑客,但是有更好的方法吗? 下一个问题是Scala's mutable.TreeSet与java.util.TreeSet's ceilingKey,floorEntry,floorEntry,pollFirst,pollLast,pollLa
16 2023-10-26
编程技术问答社区
在TreeSet和TreeMap中使用hashCode()和equals()。
从以下代码中,我知道,不需要对equals()和hashcode()和hashcode()方法进行treeset和treemap的方法,既不用于排序,也不需要进行搜索. public class ComparableTest implements Comparable { private String username; public ComparableTest(String name) { this.username = name; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int compareTo(Compar
14 2023-10-26
编程技术问答社区
一个允许重复的TreeSet或TreeMap
我需要一个Collection对元素进行分类,但不会删除重复项. 我已经去了TreeSet,因为TreeSet实际上将值添加到后台TreeMap: public boolean add(E e) { return m.put(e, PRESENT)==null; } 和tremap使用Comparators compare逻辑 删除重复项 我写了一个Comparator,它在相等的元素中返回1而不是0.因此,在相等元素的情况下,TreeSet带有此Comparator不会覆盖副本,而只会对其进行排序. 我已经对简单String对象进行了测试,但是我需要一组自定义对象. public static void main(String[] args) { List strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );
2 2023-10-26
编程技术问答社区
TreeSet没有添加所有元素?
我一直在研究不同Java收集类型的速度,并遇到了一些奇怪的事情.我将1,000,000个对象从静态数组中添加到不同的收集类型,并返回所需的时间.代码的这一部分正常. 在进行进一步调查下,我注意到TreeSet没有收到所有1,000,000个对象,并且每次都收到不同的金额.以下是将对象从数组传递到TreeSet的方法: public int treeSet(int num) { Date before = new Date(); for(int i=0; i
6 2023-10-26
编程技术问答社区
从 Set<String> 中检查字符串是否包含关键字的优雅方法
我有一个包含一些关键字的TreeSet.我需要测试一些String,以查看它们是否包含这些关键字中的任何一个. 我目前有: String tweet = object.getText(); for (String keyword : keywords_set) { if(tweet.contains(keyword)) { return true; } } 是否有一种更优雅,更有效的方式来进行一系列字符串? 解决方案 aho-corasick多重字符串匹配算法: 其他解决方案 您不会比JDK类和方法更有效.您需要在Set中遍历每个String,然后检查您的String是否包含它. 但是,如果您愿意使用第三方库,Guava. ,可以使其更加干净. 使用Guava,您可以使用 Iterables.any(Iterable, Predicate) 哪个 如果山上的任何元素满足谓词. ,则返
2 2023-10-25
编程技术问答社区
为什么使用\\0将highEndPoint作为子列表的一部分
我从Java教程Oracle看到了下面的代码.为了计算doorbell(包含)和pickle(包含)之间的单词数,作者在单词pickle之后添加了\0.我了解pickle之后添加\0的效果是,现在将单词pickle作为子集的一部分包含.但是我的问题是,为什么要使用\0?有人可以帮我吗?预先感谢您的任何帮助! SortedSet dictionary = new TreeSet(entire collection of words from a dictionary); int count = dictionary.subSet("doorbell", "pickle\0").size(); System.out.println(count); 编辑: 另外,如果变量dictionary是对排序集的引用,会发生什么?如果要包括HighendPoint,该怎么办? 解决方案 subSet(a, b)包括b的b b b.因此,如果您想找到一个包含上限
10 2023-10-05
编程技术问答社区
TreeSet例子
为什么在这里没有将第三个对象添加到这里的第三个对象? ? import java.util.*; class Student implements Comparable{ public String fn,ln; public Student(String fn,String ln){ this.fn=fn; this.ln=ln; } //overiding equals public boolean equals(Object o) { if (!(o instanceof Student)) return false; Student s=(Student) o; if(this==s) return true; if(this.fn.equals(s.fn) && this.ln.equals(s.ln)) return true; return
6 2023-10-03
编程技术问答社区
TreeSet比较器在某些情况下无法删除重复的内容?
我有以下我的树的比较器: public class Obj { public int id; public String value; public Obj(int id, String value) { this.id = id; this.value = value; } public String toString() { return "(" + id + value + ")"; } } Obj obja = new Obj(1, "a"); Obj objb = new Obj(1, "b"); Obj objc = new Obj(2, "c"); Obj objd = new Obj(2, "a"); Set set = new TreeSet((a, b) -> { System.out.println("Comparing " + a + "
10 2023-09-07
编程技术问答社区
树木组中的字母排序不工作
嗨,我的代码就是这样: TreeSet ts=new TreeSet(); ts.add("Testtxt"); ts.add("Testxml"); ts.add("docdoc"); ts.add("ePeoplexml"); ts.add("fantasyxlsx"); ts.add("idaddedgif"); ts.add("idaddedrtf"); System.out.println("Tree set :: "+ts); 输出: Tree set :: [Testtxt, Testxml, docdoc, ePeoplexml, fantasyxlsx, idaddedgif, idaddedrtf] 这不是按字母顺序排序所有字符串. 谢谢 madhu. 解决方案 排序很好.它是以案例敏感的方式完成的.由于T的Unicode代码点是d之前的 由于您想做 case nosistine 排序,因此您可以使用
6 2023-09-07
编程技术问答社区
拥有树形集比手动排序集的好处
在集合中,我们可以根据要求对集合或映射进行排序. TreeTet或Treemap还提供了分类的集合.当我们需要排序的集合 时,使用Treeset有任何好处 解决方案 我面前的海报没有提及一个重要的标准:如果您收藏的元素在插入后经常更改其状态,即您需要多次重新分配同一集合,则也许TreeSet或TreeMap不是理想的选择,因为仅在插入过程中对元素进行排序,从来没有. IE.如果更改TreeSet/TreeMap中元素的排序键,则不会自动重新分组.您需要在更新集合之前从集合中删除该元素并在更新它后重新添加它,以确保将其插入正确的位置.您可以使用我的 updateabletreeset 帮助您保持TreeSet分类. 说过上述话,您可以得出结论,在这种情况下,可能是未分类的集合加上Collections.sort()按需使用Collections.sort()可能是更容易的方法.总体上哪种方式更快取决于您的情况.我想UpdateableTreeSet应该几乎可以帮助您对现有的收藏
4 2023-08-31
编程技术问答社区
如何使用二进制搜索从排序树集中检索元素?
我试图将多个排序的列表合并到一棵树中. 以下是我的代码,我在其中一种方法中将列表列表传递给了TreeSet以避免重复的列表... inputs内部的所有列表均已排序 - private TreeSet tree = new TreeSet(); public void mergeMultipleLists(final List> inputs) { tree = new TreeSet(); for (List input : inputs) { for(Integer ii : input) { tree.add(ii); } } } public List getItem(final Integer x) { // extract elements from TreeS
8 2023-08-30
编程技术问答社区
为什么我的树集没有在第一个元素之外添加任何内容?
我的形式有几个阵列: private static String[] patientNames = { "John Lennon", "Paul McCartney", "George Harrison", "Ringo Starr" }; 然后我做这样的树: TreeSet patTreeSet = new TreeSet(); 患者是使"患者"对象的不同类别. 然后,我循环浏览数组中的每个元素,以创建几个患者,并将它们添加到我的patTreeSet上: for(int i = 0; i
2 2023-08-30
编程技术问答社区