更好地解释
我有以下问题,我有整数值的源数组,然后我需要通过后缀比较器对源数组进行排序并将其放入一个排序数组,问题是我想知道构造的时间复杂度是多少后缀数组(对源数组进行排序)
这是方法排序:
Collections.sort(sorted, new SuffixComparator<Integer>(source));
这是SuffixComparator类:
public class SuffixComparator<Type extends Comparable<Type>>
implements java.util.Comparator<Integer> {
List<Type> array1;
List<Type> array2;
/**
* Constructor with a single array
*/
public SuffixComparator (ArrayList<Type> array) {
array1 = array;
array2 = array;
}
/**
* Constructor with two arrays
*/
public SuffixComparator (List<Type> a1, List<Type> a2) {
array1 = a1;
array2 = a2;
}
/**
* Constructor with two arrays
*/
public SuffixComparator (ArrayList<Type> a1, ArrayList<Type> a2) {
array1 = a1;
array2 = a2;
}
/**
* Compare two suffixes
* @param offset1 first offset
* @param offset2 second offset
*/
public int compare (Integer offset1, Integer offset2) {
int result;
if ( array1 == array2 && offset1.equals(offset2) ) {
result = 0;
} else {
int n1 = offset1;
int n2 = offset2;
while (n1 < array1.size() &&
n2 < array2.size() &&
array1.get(n1).equals(array2.get(n2))) {
++n1;
++n2;
}
if (n1 == array1.size()) {
result = (n2 < array2.size()) ? -1 : 0;
} else if (n2 == array2.size()) {
result = 1;
} else { // n1 < array1.size && n2 < array2.size
result = array1.get(n1).compareTo(array2.get(n2));
}
}
return result;
}
}
有什么建议吗?
答案 0 :(得分:5)
我认为array1.get()
和array2.get()
花费了O(1),并忽略了计算println()
参数的成本,我认为这只是用于调试。 Java 8的Collections.sort()
对一般输入执行O(n log n)比较。 (更严格的界限可能适用于最初几乎排序的输入。)典型的比较函数花费O(1),但是您的成本似乎为O(k),其中k是array1.size()
和array2.size()
的最小值。因此,基于该比较器的排序行为受O(nk log n)限制。
可以想象的是,实际上两者的结合更紧密,但我并没有立即看到它会如何发生。
但请注意,在某些情况下,关于array1.get()
和array2.get()
费用的假设不会成立。特别是,如果一个或两个对象不提供有效的随机访问(例如链接列表),并且如果这些对象的大小不受常量限制,那么渐近性能会更差。
答案 1 :(得分:-1)
如果您的代码执行if块,则复杂度为O(1)。
如果你的代码执行了else块,则复杂度为O(n1xn2)+ O(logn)。
这里n1 = array1的长度 n2 = array2的长度。
所以复杂性将是O(n1xn2)+ O(logn)
答案 2 :(得分:-2)
我们有3个阵列:sorted
,array1
和array2
。排序操作的复杂性与sorted
数组有关,而与比较操作无关。因此它具有Collections.sort()方法的复杂性,AFAIK是O(n log n),n是sorted
数组的大小。 &#34;复杂性&#34;比较函数不会改变任何一个。
那究竟是什么问题?