Java 中 TreeSet 方法的计算复杂度是否与 AVLTree 相同?
具体来说,我想知道以下方法的计算复杂度: 1.添加 2.删除 3.首先 4.最后 5.地板 6.更高
方法描述的 Java 文档:http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html
对于一个AVL Tree,有没有所有的O(logn)?上述 TreeSet 方法的复杂性如何?
最佳答案
编辑:应该澄清的是,时间顺序通常是指比较的次数。有些操作没有比较,所以时间顺序可以从子任务的数量中获取
下面的代码在 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 operations -> 0.0 comparisons/operation
Performing 10,000 isEmpty operations -> 0.0 comparisons/operation
Performing 10,000 comparator operations -> 0.0 comparisons/operation
Performing 10,000 pollFirst operations -> 0.0 comparisons/operation
Performing 10,000 pollLast operations -> 0.0 comparisons/operation
Performing 10,000 headSet operations -> 1.0 comparisons/operation
O(ln N) comparisons
Performing 10,000 add operations -> 12.9 comparisons/operation
Performing 10,000 ceiling operations -> 12.9 comparisons/operation
Performing 10,000 contains operations -> 12.9 comparisons/operation
Performing 10,000 floor operations -> 12.9 comparisons/operation
Performing 10,000 higher operations -> 13.9 comparisons/operation
Performing 10,000 lower operations -> 13.9 comparisons/operation
Performing 10,000 remove operations -> 10.9 comparisons/operation
O(N ln N) comparisons
Performing 10,000 equals operations -> 128853.0 comparisons/operation
代码
public class TreeSetOrderMain {
public static void main(String[] args) {
System.out.println("O(1) comparisons, however the number of indirections could be O(ln N)");
testOrder("first", (s, i) -> s.first());
testOrder("last", (s, i) -> s.last());
testOrder("size", (s, i) -> s.size());
testOrder("isEmpty", (s, i) -> s.isEmpty());
testOrder("comparator", (s, i) -> s.comparator());
testOrder("pollFirst", (s, i) -> s.pollFirst());
testOrder("pollLast", (s, i) -> s.pollLast());
testOrder("headSet", TreeSet::headSet);
System.out.println("O(ln N) comparisons");
testOrder("add", TreeSet::add);
testOrder("ceiling", TreeSet::ceiling);
testOrder("contains", TreeSet::contains);
testOrder("floor", TreeSet::floor);
testOrder("higher", TreeSet::higher);
testOrder("lower", TreeSet::lower);
testOrder("remove", TreeSet::remove);
System.out.println("O(N ln N) comparisons");
Set<Long> set = LongStream.range(0, 10_000).mapToObj(i -> i).collect(Collectors.toSet());
testOrder("equals", (s, i) -> s.equals(set));
}
static void testOrder(String desc, BiConsumer<TreeSet<Long>, Long> op) {
final LongComparator comparator = new LongComparator();
TreeSet<Long> longs = new TreeSet<>(comparator);
final int count = 10_000;
for (long i = 0; i < count; i++)
longs.add(i);
comparator.count = 0;
for (long i = 0; i < count; i++)
op.accept(longs, i);
System.out.printf("Performing %,d %s operations -> %.1f comparisons/operation%n",
count, desc, (double) comparator.count / count);
}
static class LongComparator implements Comparator<Long> {
long count = 0;
@Override
public int compare(Long o1, Long o2) {
count++;
return Long.compare(o1, o2);
}
}
}
对单个元素的操作都是 O(ln n) 比较,除了 first 和 last 是 O(1) 比较或 O(ln N) 节点搜索时间。
comparator()、iterator()、clear()、first()、isEMpty()、size()、last()、pollFirst()、pollLast()、headSet() 都是 O(1)
add()、ceiling()、contains()、floor()、higher()、lower()、remove()、subSet()、tailSet() 都是 O(ln N)
clone()、hashCode()、toArray() 和 toString() 的操作复杂度为 O(n),但没有比较级
关于java - Java 中 TreeSet 方法的计算复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379515/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2