首页 > 编程语言 >扎实打牢数据结构算法根基,从此不怕算法面试系列之week01 02-09 测试算法时间复杂度性能的方式方法

扎实打牢数据结构算法根基,从此不怕算法面试系列之week01 02-09 测试算法时间复杂度性能的方式方法

时间:2023-04-20 22:03:38浏览次数:50  
标签:02 week01 int 数据 规模 毫秒 算法 data public

1、数组生成器

测试算法性能肯定不能自己手动声明创建数组了,在现代计算机上,对于O(n)级别的算法,都需要10W级别以上的数据才能看到性能,我们肯定不能手动声明10W个元素的数组吧?

所以,创建数组生成器。
这里,自己创建一个数组生成器——ArrayGenerator。

package com.mosesmin.datastructure.week01.chap02;

/**
 * @Misson&Goal 代码以交朋友、传福音
 * @ClassName ArrayGenerator
 * @Description TODO 数组生成器
 * @Author MosesMin
 * @Date 2023/4/14
 * @Version 1.0
 */
public class ArrayGenerator {
    private ArrayGenerator() {}
    public static Integer[] generatedOrderedArray(int n){
        Integer[] arr = new Integer[n];
        for (int i = 0; i < n; i++)
            arr[i] = i;
        return arr;
    }
}

2、使用数组生成器进行测试

详细代码如注释:
package com.mosesmin.datastructure.week01.chap02;

/**
 * @Misson&Goal 代码以交朋友、传福音
 * @ClassName LinearSearch03
 * @Description TODO
 * @Author MosesMin
 * @Date 2023/4/14
 * @Version 1.0
 */
public class LinearSearch09 {

    private LinearSearch09(){}
    public static <E> int search(E [] data,E target){
        for (int i = 0; i < data.length; i++)
            if (data[i].equals(target))
                return i;
        return -1;
    }

    public static void main(String[] args) {
        int n = 1000000;
        Integer[] data = ArrayGenerator.generatedOrderedArray(n);// 10w的数据规模
        long startTime = System.nanoTime();//单位是纳秒  纳秒-微妙-毫秒-秒 差距都是1000倍
        for (int k=0;k<100;k++)
            LinearSearch09.search(data,n);//这里为了验证最差的情况,就传一个找不到的目标元素100000
        long endTime = System.nanoTime();
        double time = (endTime-startTime)/(1000*1000*1000.0);// 最后1000.0,因为我们希望结果是个浮点数
        System.out.println(time + " s");
    }


}

10W的数据规模,运行一次,在我的电脑(CPU为:Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz 3.20 GHz)运行时间约为0.0027秒,即2.7毫秒。
3毫秒,可能不够稳定,不一定是线性查找法运行的时间结果,因为操作系统也在运行,我们可以再试下使用更大的数据,比如使用100W的数据规模,看看它们运行
的时间差是否为10倍左右。


运行结果:
10W数据规模:
mark

我们看到100W的运行结果约为6.6毫秒;几毫秒的运行结果还是不够稳。

100W数据规模:
mark

我们再试下1000W的数据规模。
我们看到1000w约为26毫秒;
注:
对于一般的计算机而言,1000W的数据规模已经是个够量的规模了。
1000W数据规模:
mark

我们还可以看一下1亿的规模,但是运行1亿的数据规模时,我的电脑运行了很久,将近20s时间,最终显示结果约为182毫秒。
为什么实际上运行了20s时间呢?
因为对于一般的计算机来说,开1亿个整型空间,尤其时1亿个连续的整型空间时需要一些时间的,特别是我的电脑配置不太高,i5的4代cpu(Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz 3.20 GHz)。

1亿数据规模:
mark


如果我们希望得到的时间更长一些,一个简单方法是,多做几次,这里,我们就用100W的数据规模,然后测试100次。
100W的规模,执行100次,约为218毫秒。

100W数据规模运行100次:
mark


3、一些测试优化

1、优化一下输出log
主要改动的语句为:

System.out.println("数据规模n为:"+n+",运行次数:"+ num +"次,运行时间为:" + time + " s.");

优化后的代码如下:
package com.mosesmin.datastructure.week01.chap02;

/**
 * @Misson&Goal 代码以交朋友、传福音
 * @ClassName LinearSearch03
 * @Description TODO
 * @Author MosesMin
 * @Date 2023/4/14
 * @Version 1.0
 */
public class LinearSearch09 {

    private LinearSearch09(){}
    public static <E> int search(E [] data,E target){
        for (int i = 0; i < data.length; i++)
            if (data[i].equals(target))
                return i;
        return -1;
    }

    public static void main(String[] args) {
        int n = 1000000;
        Integer[] data = ArrayGenerator.generatedOrderedArray(n);// 10w的数据规模
        long startTime = System.nanoTime();//单位是纳秒  纳秒-微妙-毫秒-秒 差距都是1000倍
        int num = 100;
        for (int k=0;k<num;k++)
            LinearSearch09.search(data,n);//这里为了验证最差的情况,就传一个找不到的目标元素100000
        long endTime = System.nanoTime();
        double time = (endTime-startTime)/(1000*1000*1000.0);// 最后1000.0,因为我们希望结果是个浮点数
        System.out.println("数据规模n为:"+n+",运行次数:"+ num +"次,运行时间为:" + time + " s.");
    }
}

mark


2、创建数据规模数组,利用循环一次测试多个数据规模

int [] dataSize = {100000,1000000,10000000};
for (int n:dataSize) {
……
}

添加数据规模数组后的代码如下:

package com.mosesmin.datastructure.week01.chap02;

/**
 * @Misson&Goal 代码以交朋友、传福音
 * @ClassName LinearSearch03
 * @Description TODO
 * @Author MosesMin
 * @Date 2023/4/14
 * @Version 1.0
 */
public class LinearSearch09 {

    private LinearSearch09(){}
    public static <E> int search(E [] data,E target){
        for (int i = 0; i < data.length; i++)
            if (data[i].equals(target))
                return i;
        return -1;
    }

    public static void main(String[] args) {
        int [] dataSize = {100000,1000000,10000000};
        for (int n:dataSize) {
            Integer[] data = ArrayGenerator.generatedOrderedArray(n);// 10w的数据规模
            long startTime = System.nanoTime();//单位是纳秒  纳秒-微妙-毫秒-秒 差距都是1000倍
            int num = 100;
            for (int k=0;k<num;k++)
                LinearSearch09.search(data,n);//这里为了验证最差的情况,就传一个找不到的目标元素100000
            long endTime = System.nanoTime();
            double time = (endTime-startTime)/(1000*1000*1000.0);// 最后1000.0,因为我们希望结果是个浮点数
            System.out.println("数据规模n为:"+n+",运行次数:"+ num +"次,运行时间为:" + time + " s.");
        }
    }
}

创建一个数据规模数组,循环执行,可以看是10W、100W、1000W的运行时间差异确实约为10倍的差距。

mark

ok,到这里,我们的测试方法讲解结束了,后续我们都可以用这样的方式来对不同的算法做测试。

标签:02,week01,int,数据,规模,毫秒,算法,data,public
From: https://www.cnblogs.com/xlfcjx/p/17338497.html

相关文章

  • 2022年中国大学生程序设计竞赛女生专场-比赛题解
    比赛链接:Dashboard-2022年中国大学生程序设计竞赛女生专场-CodeforcesA.减肥计划(模拟)模拟,如果队列第一个人体重是最大的了,则这个人的位置不会再变,直接输出即可。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_......
  • 20201226马瑞婕Exp5- 信息搜集与漏洞扫描
    20201226马瑞婕Exp5-信息搜集与漏洞扫描目录1各种搜索技巧的应用1.1搜索某一个网址目录结构1.2通过搜索引擎进行信息搜索1.3路由侦察二、DNSIP注册信息的查询2.1whois命令查询2.2nslookup、dig域名查询2.3IP2Location地理位置查询三、基本的扫描技术:主机发现、端口扫描......
  • 学习十大排序算法(1)——选择排序【实现方法c语言】
    十大排序算法第一节——选择排序复制代码直接滑到最后!!!选择排序就是找到(最大或者)最小元素,放到最开始的位置,然后就是在没有排序的序列中找到最小的排在已经排好的序列之后,直至没有排数列排完。(自己的理解)大概解释代码其中的细节:第6行中的sizeof的用法是求出括号里面......
  • 2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量
    2023-04-20:有一堆石头,用整数数组stones表示其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎假设石头的重量分别为x和y,且x<=y那么粉碎的可能结果如下:如果x==y,那么两块石头都会被完全粉碎;如果x!=y,那么重量为x的石头将......
  • 2023省选武汉联测7
    T1动点(point)首先考虑两种操作,根据高中计算几何知识很容易得到这两种变换后点的坐标,首先考虑\(1\)操作,假设旋转中心\(P\)为原点,考虑将点\(A(x_0,y_0)\)绕点旋转\(\alpha\)到\(B\),设\(\overrightarrow{OA}\)与\(x\)轴的夹角为\(\beta\),如下图:设\(\mid\overr......
  • 2023省选武汉联测6
    T1线性代数实际上我们需要求解值域\(\len\)的线性空间的个数,考虑将线性空间与线性基一一对应,为了使得一个线性基唯一对应一个线性空间,我们将主元列上的非主元全部消成\(0\),发现此时将线性基全部异或得到的值为原集合的最大值,并且可以做到一一对应。(化简为最简阶梯形矩阵)于......
  • 2023省选武汉联测10
    T1矩阵随机一个向量\(V\),判断\(V\timesA\timesB\)是否等于\(V\timesC\)即可,实质上我们在判断对于每个\(i\in[1,n]\)\(\sum_{k=1}^nV_k\sum_{p=1}^{n}A_{k,p}B_{p,i}\)是否等于\(\sum_{k=1}^{n}V_kC_{k,i}\)。code#include<cstdio>#include<vector>#incl......
  • 2023省选武汉联测9
    T1背包问题模板比较套路的,我们考虑进行二进制拆分,对于数量\(A\),我们首先从小到大拆分为\(1,2,4...2^k\),对于剩余的\(w\),我们直接按照它的二进制位拆分即可,这样问题转化为比较简单的\(0/1\)背包。由于\(b_i\)的范围很小,如果将物体体积用二进制数表示,发现二进制上为\(......
  • 2023省选武汉联测13
    T1构树直接\(O(n^2)\)暴力枚举连边即可。code#include<cstdio>#include<vector>#include<set>#include<utility>usingnamespacestd;constintmax1=1000;intn,Min[max1+5],Max[max1+5];vector<int>part[max1+5];intcolo......
  • # 2023省选武汉联测12
    T1图案首先是题解做法:考虑对于每个\(r\),判断\(s[1,r]\)是否为一个图案,设\(r=ik+j\),其中\(0\lej\lei\),如果存在一组这样的\((i,j)\)满足\(s[1,r-i]=s[i+1,r]\),那么\(s[1,r]\)是一个图案,考虑这样做的正确性,如果\(s[1,r-i]=s[i+1,r]\),那么一定有\(s[i+1,r-2i]=s......