我需要计算BST实现的最小比较次数,给定一个长度为N的数字数组,并改变添加元素的顺序。
例如,如果我有一个一个数组[1 2 3] ,它将打印出与给定订单的最小比较量为2,从6种不同的方式添加数字到那个树。
我实际编写的代码可能已经计算出来了,为每个组合创建一个新树以查找比较次数,最后通过使用方法 comparisonTree.findMin(); 来计算它们的最小值EM>。它很顺利,直到数组中的元素数量更大;实施不够有效。
我用于获取组合的代码是来自Generating all permutations of a given string的代码的修改版本。我正在寻找一种更有效的方法来完成这项任务,如果有的话。
public static int[] readInts(String cad) {
String lines[] = cad.split("");
int arr[] = new int[lines.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(lines[i]);
}
return arr;
}
public static int findMinimumComp(String str, BinarySearchTree<Integer> t) throws Exception {
BinarySearchTree<Integer> compTree = new BinarySearchTree<>();
int compAux = 100;
findMinimumComp("", str, t, compTree, compAux);
return compTree.findMin();
}
private static BinarySearchTree<Integer> findMinimumComp(String prefix, String str, BinarySearchTree<Integer> t, BinarySearchTree<Integer> compTree, int compAux) throws Exception {
int n = str.length();
int arr[] = new int[n];
int comparation;
if (n == 0) {
arr = readInts(prefix);
for (int a = 0; a < arr.length; a++) { // add elements
t.insert(arr[a]);
}
comparation = t.getCompareCount(); //method for getting number of comparisons
if (comparation < compAux || compTree.isEmpty()){
compTree.insert(comparation); //comparisons tree
compAux = comparation;
}
t.initializeCompareCount();
t.makeEmpty();
} else {
for (int i = 0; i < n; i++) {
findMinimumComp(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), t, compTree, compAux);
}
}
return compTree;
}