在Java中获取TreeSet的headSet的时间复杂度是多少?另外,如果我将headSet方法调用“ n”次该怎么办?

时间:2019-06-29 21:28:25

标签: java algorithm time-complexity treeset

我在做一个hackerrank问题,要求我找出使用插入排序对数组进行排序所需发生的移位次数,而不用插入排序对数组进行实际排序,因为否则将需要O(n ^ 2)时间-复杂! 这是我的代码超时。据我了解,n次调用headSet方法应该达到O(n logn)。

static class MyComp implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 <= o2 ? -1: 1;
    }
}



// Complete the insertionSort function below.
static int insertionSort(int[] arr) {

    SortedSet<Integer> set = new TreeSet<>(new MyComp());
    int count=0;
    for(int i=arr.length-1; i>=0;i--){
        set.add(arr[i]);
        int pos = set.headSet(arr[i]).size();
       // System.out.println(pos);
        if(pos>0){
            count=count+pos;
        }

    }

    return count;
}

1 个答案:

答案 0 :(得分:0)

创建耳机的复杂度为O(1)

为什么?

因为耳机不是新套装。它实际上是现有集的视图。创建一个对象不涉及复制原始集合,甚至不涉及在集合中查找“绑定”元素。

因此,进行N次就是O(N)

但是,您的代码不是O(N)的原因是

  set.headSet(someElement).size();

不是O(1)。原因是size()的子视图上的TreeSet方法是通过计数视图中的元素来计算的。

(AFAIK,javadocs中未对此进行说明,但是您可以通过查看TreeSetTreeMap的源代码来推断出它。)