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

这篇具有很好参考价值的文章主要介绍了扎实打牢数据结构算法根基,从此不怕算法面试系列之week01 02-09 测试算法时间复杂度性能的方式方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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数据规模:

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

100W数据规模:

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

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

1亿数据规模:


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

100W数据规模运行100次:


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.");
    }
}

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倍的差距。

ok,到这里,我们的测试方法讲解结束了,后续我们都可以用这样的方式来对不同的算法做测试。文章来源地址https://www.toymoban.com/news/detail-419713.html

到了这里,关于扎实打牢数据结构算法根基,从此不怕算法面试系列之week01 02-09 测试算法时间复杂度性能的方式方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想

    接下类,我们学习另外一类非常基础的算法,即排序算法。 排序算法是计算机科学领域研究的非常深入的一类算法,排序这个动作本身也是非常重要的, 很多时候面对无需的数据,首先需要做的就是对他们进行排序。 排序算法——目的:让数据有序。 排序算法——种类:种

    2023年04月21日
    浏览(58)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(53)
  • 【算法与数据结构】--算法应用--算法和数据结构的案例研究

    一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理 : 甘特图算法 :甘特图是一种项目进度管理工具,它使用甘特图算法来展示项目任务

    2024年02月08日
    浏览(58)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(62)
  • 数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(56)
  • 数据结构与算法 --- 数据结构绪论

    早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问

    2024年02月14日
    浏览(54)
  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(63)
  • 【数据结构与算法】不就是数据结构

      嗨喽小伙伴们你们好呀,好久不见了,我已经好久没更新博文了!之前因为实习没有时间去写博文,现在已经回归校园了。我看了本学期的课程中有数据结构这门课程(这么课程特别重要),因为之前学过一点,所以就想着深入学习一下子。毕竟这门课程对于 考研 和 就业

    2024年02月07日
    浏览(49)
  • 【数据结构与算法】1.数据结构绪论

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据结构是计算机中存储、组织数据的方式。 数据结构是一种具有一定逻辑关系,

    2024年01月23日
    浏览(54)
  • 数据结构与算法——什么是数据结构

    当你决定看这篇文章,就意味着系统学习数据结构的开始。下面我们先来讲什么是数据结构。 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储  {1,2,3,4,5}  是为了后期取得它们

    2024年02月15日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包