通常情况下,问题有不同的解决方案。我的目的是找到重复的整数。我有两种方法。
第一个是对整数数组进行排序并进行比较。第二个就是使用HashSet。你能告诉我哪个更有效率,为什么?请注意,原始数组不得被覆盖。
主要课程
public class Main {
static DuplicateNumbers dn;
static DuplicateNumbersHash dnh;
public static void main(String[] args) {
int[] arrayOfIntegers = {9, 7, 1, 3, 4, 2, 7, 5, 9};
// 1st class test
dn = new DuplicateNumbers(arrayOfIntegers);
dn.searchForDuplicates();
System.out.println("\n\n2nd test\n\n");
// 2nd class test
dnh = new DuplicateNumbersHash(arrayOfIntegers);
dnh.searchForDuplicates();
}
} // Main class
非HashSet 方法
public class DuplicateNumbers {
protected int[] arrayOfIntegers;
public DuplicateNumbers(int[] arrayOfIntegers) {
this.arrayOfIntegers = arrayOfIntegers;
}
public void searchForDuplicates() {
// do not overwrite original array, so create a temp one instead
int[] tempArray = new int[arrayOfIntegers.length];
System.arraycopy(arrayOfIntegers, 0, tempArray, 0,
arrayOfIntegers.length);
// sorting temp array only
Arrays.sort(tempArray);
// now look for duplicates
for (int i = 0; i < tempArray.length - 1; i++) {
if (tempArray[i] == tempArray[i + 1]) {
System.out.printf(
"Duplicates: tempArray[%d] and tempArray[%d]\n", i,
i + 1);
System.out.printf("Repeated value: %d %d\n", tempArray[i],
tempArray[i + 1]);
System.out.println();
} // if
} // for
} // searchForDuplicates()
} // DuplicateNumbers class
HashSet 方法;继承上一个类以在此处粘贴较少的代码
public class DuplicateNumbersHash extends DuplicateNumbers {
public DuplicateNumbersHash(int[] arrayOfIntegers) {
super(arrayOfIntegers);
}
@Override
public void searchForDuplicates() {
Set<Integer> s = new HashSet<Integer>();
for (int i = 0; i < arrayOfIntegers.length; i++) {
if (!s.add(arrayOfIntegers[i])) {
System.out.printf("Repeated value: %d\n", arrayOfIntegers[i]);
}
}
s = null;
}
}
哪一个更好?还有更好的解决方案吗?
答案 0 :(得分:5)
最佳排序算法的时间复杂度为O(n log n)
,因此排序方法也为O(n logn)
。 HashSet方法的复杂性为O(n)
。所以你应该理想地使用HashSet方法。
答案 1 :(得分:1)
Hash-set实现更节省时间,但是在内存使用方面,数组排序实现更有效。
时间:向哈希集添加值具有恒定的复杂度,O(1) - 哈希集的大小并不重要。但是,arrayCopy具有线性复杂度O(n)。此外,根据您对数组的排序方式,这也需要一些时间。
内存:您的数组实现仅使用原始数组的两倍内存。您的哈希集可能比原始数组大得多。