BinarySearchTree搜索速度效率

时间:2011-05-15 15:24:46

标签: java tree binary-tree binary-search-tree

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;


public class BSTSearchTimer {

int [] n = {10000, 50000, 100000, 250000};
Random rand = new Random();

public static void main(String[] args) throws IOException{

    BSTSearchTimer timer = new BSTSearchTimer();
    timer.runBSTSearchTimer();

}

public void runBSTSearchTimer() throws IOException{
    PrintWriter out = new PrintWriter( new FileWriter("tree2.csv"));
    int reps = 10000; // the number of searches that we will do on the tree


    for (int i = 0; i < n.length; i++){
        BinarySearchTree<Long> longBST = new BinarySearchTree<Long>();
        boolean success = true;

        int numOfElements = n[i];

        while (longBST.size() < numOfElements){

                success = longBST.add(rand.nextLong());
                while (!success){ // should keep attempting to add values until success is true
                    success = longBST.add(rand.nextLong());
            }

        }

        long start = System.currentTimeMillis(); // start the timer for searching

        for ( int j = 0; j < reps; j++){ // search rep times
            longBST.find(rand.nextLong());
        }
        long end = System.currentTimeMillis(); // end timer for searching tree

        double time = end-start;

        System.out.printf("%d, %f\n", longBST.size(), time);
        out.printf("%d, %f\n", n[i], time);

    }
    out.close();
}
}

当我运行这个程序时,它应该是4个不同大小的树:10000,50000,100000,250000。我知道搜索BST的速度效率应该是O(Log n)但我得到这些数:

当进行10,000次搜索时,我得到这些数字:(第一列是树的大小,第二列是进行搜索所花费的时间)

10000, 9.000000
50000, 3.000000
100000, 4.000000

进行100,000次搜索时:

10000, 41.000000
50000, 31.000000
100000, 40.000000
250000, 74.000000

任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

你最有可能看到“失误”的影响。由于您只是在搜索随机数字,因此不在树中的数字将比数字长得多。

此外,二叉搜索树的效率是O(h),其中h是树的高度。 Red-Black treesAVL trees保证它们的构造高度为O(log n),但随机构造的树很容易以高度接近O(n)结束。