Java 什么';这段代码有多复杂?我必须用什么符号?

Java 什么';这段代码有多复杂?我必须用什么符号?,java,arraylist,complexity-theory,notation,Java,Arraylist,Complexity Theory,Notation,当我确定像这样的Java代码的复杂性时,我必须用θ或大O表示法来表示吗 List<Person> sortedPersons = new ArrayList<Person>(); List<Person> people = new ArrayList<Person>(); for (int i = 0; i < people.size(); i++) { Person toadd = people.get(i);

当我确定像这样的Java代码的复杂性时,我必须用θ或大O表示法来表示吗

List<Person> sortedPersons = new ArrayList<Person>();
List<Person> people = new ArrayList<Person>();

    for (int i = 0; i < people.size(); i++) {
        Person toadd = people.get(i);

        int index = 0;
        while(index < sortedPersons.size() && sortedPersons.get(index).compareTo(toadd) < 0)
            index++;

        sortedPersons.add(index, toadd);

    }
List sortedPersons=new ArrayList();
List people=new ArrayList();
for(inti=0;i
我知道for循环是O(n)(或者是\Theta(n)?) get操作以恒定的时间运行,因此O(1)。 但是while循环呢? sortedPersons.size():O(1) sortedPersons.get():O(1) 比较运算是线性的吗? 我认为add操作也是在固定时间内运行的。 代码的总复杂度是多少?

代码是O(n²) 如果你考虑数字,然后将它们从小到大排序。

  • 如果您的输入是反向排序的(从大到小),代码将是Θ(n)
  • 如果您的输入已排序,则此代码将为Θ(n²)
该代码只是的一个变体,它只使用列表而不是数组

考虑这个例子的复杂性:

数字是1 2 3 4 5,您需要从小到大进行排序

  • 首次提交后,您的列表将由1个组成。(这发生在o(1)中)你赢了 不要访问内部循环
  • 在第二部分中,您有一个{1}列表,因为您要插入2,所以您将访问while循环一次,然后再插入它
  • 第三,列表是{12}您访问while循环两次,并在其后插入3
  • 最后,您将得到如下结果: 0 1 2 3 4次访问了内部循环

    现在你可以把123445写成(5(5+1))/2)


    现在你可以把O(n(n+1)/2+n写成O(n²)。

    你在进行n次迭代,其中n是people.size()并将其乘以n,因为你再次迭代到n(索引),在复杂度1/3中,n(2)仍然是n(2),并且你使用的时间可能最差,所以n(2)是复杂度,在这种情况下,你使用的是插入排序算法,它是O(n^2)算法好的,谢谢,但是你怎么知道的?@ruakh,你是对的。我删除了它。虽然Nactive的答案是正确的,但下次有什么不清楚的地方,你应该来上课,问助教(即我)。