Эффективность скорости поиска в двоичном дереве поиска

#java #tree #binary-tree #binary-search-tree

#java #дерево #двоичное дерево #двоичное дерево поиска

Вопрос:

 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, %fn", longBST.size(), time);
        out.printf("%d, %fn", n[i], time);

    }
    out.close();
}
}
  

Когда я запускаю эту программу, предполагается, что она создает 4 дерева разного размера: 10000, 50000, 100000, 250000. Я знаю, что эффективность скорости при поиске BSTS должна быть O (Log n), но я получаю эти цифры:

при выполнении 10000 поисковых запросов я получаю эти цифры: (первый столбец — это размер дерева, второй — время, затраченное на выполнение поиска)

 10000, 9.000000
50000, 3.000000
100000, 4.000000
  

при выполнении 100 000 поисковых запросов:

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

Приветствуются любые советы.

Ответ №1:

Скорее всего, вы наблюдаете эффект «промахов». Поскольку вы просто ищете случайные числа, числа, которых нет в дереве, займут намного больше времени, чем числа, которые есть.

Кроме того, эффективность бинарного дерева поиска равна O (h), где h — высота дерева. Красно-черные деревья и деревья AVL гарантируют, что они будут построены с высотой O (log n), но случайно построенные деревья могут легко получить высоту, близкую к O (n).

Комментарии:

1. Это действительно имеет смысл. Теперь я это понимаю. Спасибо за совет. Мне было действительно интересно, почему этот код выдавал то, что я считал случайными числами. Но тот факт, что я ищу случайные числа, может привести к множеству разных результатов. Спасибо!