解释得更好
我有以下问题,我有整数值的源数组,然后我需要通过后缀比较器对源数组进行排序并将其放入一个排序数组,问题是我想知道构造后缀的时间复杂度是多少 – 数组(排序源数组)
这是方法排序:
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;
}
}
有什么建议?
最佳答案 我想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()成本的假设不成立.特别是,如果一个或两个对象不提供有效的随机访问(例如链接列表),并且如果这些对象的大小不受常量限制,则渐近性能更差.