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)的排序方法
然后我使用了二元搜索树的插入方法,它取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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |