加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 运行时间与O(nlogn)匹配吗?

发布时间:2020-12-15 08:37:21 所属栏目:Java 来源:网络整理
导读:我写了一个类(贪心策略),起初我使用的是具有O(nlogn)的排序方法 Collections.sort(array,new SortingObjectsWithProbabilityField()); 然后我使用了二元搜索树的插入方法,它取O(h),h这里是树高. 对于不同的n,运行时间将是: n,running time17,51542833,78334
我写了一个类(贪心策略),起初我使用的是具有O(nlogn)的排序方法

Collections.sort(array,new
SortingObjectsWithProbabilityField());

然后我使用了二元搜索树的插入方法,它取O(h),h这里是树高.

对于不同的n,运行时间将是:

n,running time
17,515428
33,783340
65,540572
129,1285080
257,2052216
513,4299709

我认为这是不正确的,因为增加n,运行时间应该几乎增加.

此方法将占用运行时间:

Exponent = -1;



for(int n = 2;n<1000;n+=Math.pow(2,exponent){

     for (int j = 1; j <= 3; j++) {
                Random rand = new Random();
                for (int i = 0; i < n; i++) {
                    Element e = new Element(rand.nextInt(100) + 1,rand.nextInt(100) + 1,0);
                    for (int k = 0; k < i; k++) {
                        if (e.getDigit() == randList.get(k).getDigit()) {
                            e.setDigit(e.getDigit() + 1);
                        }
                    }
                    randList.add(e);
                }
                double sum = 0.0;

                for (int i = 0; i < randList.size(); i++) {
                    sum += randList.get(i).getProbability();
                }
                for (Element i : randList) {
                    i.setProbability(i.getProbability() / sum);
                }
                //Get time.
                long t2 = System.nanoTime();
                GreedyVersion greedy = new GreedyVersion((ArrayList<Element>) randList);
                long t3 = System.nanoTime();
                timeForGreedy = timeForGreedy + t3 - t2;
            }
            System.out.println(n + "," + "," + timeForGreedy/3 );
            exponent++;
            }

谢谢

解决方法

您的数据似乎大致符合nlogn的顺序,如下所示.请注意,曲线几乎是线性的,因为对于n的大值,logn非常小.例如,对于n = 513的最大值,logn为9.003.

有一些方法可以实现更准确的计时,这可能会使曲线更好地适应数据点.比如采用更大的随机输入样本(我建议至少10,100,如果可能的话)并且每个数据集运行多次迭代(5是可接受的数字)以消除计时器的不准确性.您可以使用单个启动/停止计时器为相同的n计算所有迭代的时间,然后除以运行次数,以获得更准确的数据点.只需确保首先生成所有数据集,将它们全部存储起来,然后再运行它们.

在2的幂下对n进行采样的好选择.你可能只想减去1来使它们精确到2的幂,而不是它会产生任何真正的影响.

作为参考,这是用于生成图的gnuplot脚本:

set terminal png
set output 'graph.png'
set xrange [0:5000000]
set yrange [0:600]
f1(x) = a1*x*log(x)/log(2)
a1 = 1000
plot 'time.dat' title 'Actual runtimes',
    a1*x*log(x)/log(2) title 'Fitted curve: O(nlogn)
fit f1(x) 'time.dat' via a1

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读