【算法学习系列】05 - 对数器的说明与使用

news2024/11/23 12:30:50

文章目录

  • 对数器说明
  • 对数器使用
    • 创建随机样本生成器
    • 实现 isSorted(int[] arr) 函数验证排序正确性
    • 实现选择排序算法
    • 进行大样本随机测试验证算法正确性
  • 总结

对数器说明


在算法领域中,对数器指的是一个用于测试算法正确性的工具。对于一个需要被测试的算法A,对数器会生成一组随机数据,然后将这组随机数据作为输入分别传递给算法A和一个暴力算法B,然后比较两者的输出结果是否相同。

如果A和B的输出结果相同,则说明A的实现是正确的。否则需要进一步检查并修复A的实现。使用对数器可以帮助程序员在开发算法时更快速地发现并修复错误,提高开发效率。

对数器使用

创建随机样本生成器


我们后面会来验证选择排序算法的正确性,所以这里先实现一个随机样本生成器:返回一个数组 arr,arr的长度∈[0, maxLen - 1],arr中的每个值∈[0, maxValue - 1]。其中 maxLen 和 maxValue 当作参数传入。

该随机样本生成器可以生成一个随机长度和随机值的数组。实现如下:

	// 返回一个数组 arr、arr的长度∈[0, maxLen - 1]、arr中的每个值∈[0, maxValue - 1]
    private int[] createRandomArr(int maxLen, int maxValue){
        int len = (int)(Math.random() * maxLen);
        int[] arr = new int[len];
        for (int i = 0;i < len;i++){
            arr[i] = (int)(Math.random() * maxValue);
        }
        return arr;
    }

实现 isSorted(int[] arr) 函数验证排序正确性


实现代码如下:

	// 验证数组是否排序正确(值是否从小到大排序)
    private boolean isSorted(int[] arr){
        if (arr.length < 2){
            return true;
        }
        int max = arr[0];
        for (int i = 1;i < arr.length;i++){
            if (max > arr[i]){
                return false;
            }
            max = arr[i];
        }
        return true;
    }

后面验证选择排序算法功能正确性需要使用到:

  • isSorted(int[] arr) 函数返回 true 表示排序正确,返回 false 表示排序错误。

实现选择排序算法


排序工具类实现代码如下:

package com.example.myapplication.util;

/**
 * 排序工具类
 */
public class SortUtil {

    private static volatile SortUtil sortUtil;

    private SortUtil() {
    }

    public static SortUtil instance(){
        if (sortUtil == null){
            synchronized (SortUtil.class){
                if (sortUtil == null){
                    sortUtil = new SortUtil();
                }
            }
        }
        return sortUtil;
    }

    // 选择排序算法
    public static void selectionSort(int[] arr){
        if (arr == null || arr.length < 2){
            return;
        }
        for (int i = 0;i < arr.length - 1;i++){
            int minIndex = i;
            for (int j = i + 1;j < arr.length;j++){
                if (arr[minIndex] > arr[j]){
                    minIndex = j;
                }
            }
            swap(arr, minIndex, i);
        }
    }

    // 交换数组 arr 中下标 i 和 j 的值
    private static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

进行大样本随机测试验证算法正确性


这里进行一万次随机数组生成并使用选择排序算法排序。

测试代码如下:

	// 做一万次大样本随机测试 验证选择排序算法正确性
	private void useLogarithm() {
        int maxLen = 10;
        int maxValue = 1000;

        // 做一万次大样本随机测试 验证选择排序算法正确性
        int testCount = 10000;
        boolean isWrong = false;
        for (int i = 0;i < testCount;i++){
            int[] randomArr = createRandomArr(maxLen, maxValue);
            // 对生成的随机数组进行选择排序
            SortUtil.selectionSort(randomArr);
            if (!isSorted(randomArr)){
                // 选择排序算法错误
                isWrong = true;
                break;
            }
        }
        // 结果验证
        if (isWrong){
            System.out.println(":> 通过进行大样本随机测试,算法存在错误。");
        }else {
            System.out.println(":> 通过进行大样本随机测试,算法功能正确。");
        }
    }

运行结果如下图示:

在这里插入图片描述

由上图可知,大样本随机测试都对 那选择排序算法功能确定是对的

总结


Q:什么是对数器?
Ans:生成大量随机样本测试算法正确性的工具。


“Peace Love Respect”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis分片集群搭建及其原理

Redis分片集群搭建及其原理 1.Redis分片集群1.1.搭建分片集群1.2.准备实例和配置1.3.启动1.4.创建集群1.5.测试 2.散列插槽原理2.1.插槽原理2.2.小结 3.集群伸缩3.1.需求分析3.2.创建新的redis实例3.3.添加新节点到redis3.4.转移插槽 4.故障转移4.1.自动故障转移4.2.手动故障转…

十三、进程信号

文章目录 一、什么是信号二、信号列表&#xff08;一&#xff09;查看系统定义的信号列表 三、信号处理四、信号产生&#xff08;一&#xff09;通过终端按键产生信号1.什么是核心转储&#xff1f;2.核心转储功能有什么用&#xff1f;3.core dump标志 &#xff08;二&#xff0…

计算机论文写作入门

什么是顶会 顶级会议一般是,在业界(本领域本方向)受到广泛的承认,影响力较大的会议。一方面一般顶级专家、学者都倾向于将paper投到这些 会议;另一方面这些会议的论文代表了该领域的目前很优秀、有重大意义的进展。"顶级会议"的投稿竞争压力一般都很大,属于在经典 p…

05. 数据结构之队列

前言 队列&#xff08;queue&#xff09;是一种线性数据结构&#xff0c;队列中的元素只能先入先出&#xff08;First In First Out&#xff0c;简称 FIFO&#xff09;。队列和实际生活中的排队相对应&#xff0c;是一种和生活息息相关的数据结构&#xff0c;在很多系统中都会…

MATLAB 之 其他形式的二维图形

文章目录 一、对函数自适应采样的绘图函数二、其他坐标系下的二维曲线图1. 对数坐标函数2. 极坐标图 三、其他特殊二维图像1. 条形类图形2. 面积类图形3. 散点类图形4. 矢量类图形 二维图线除采用直角坐标系外&#xff0c;还可采用对数坐标或极坐标。除了绘制二维曲线外&#x…

大环境不好难找工作?三面阿里,幸好做足了准备,已拿offer

大环境不好难找工作&#xff1f;三面阿里&#xff0c;幸好做足了准备&#xff0c;已拿offer 三面大概九十分钟&#xff0c;问的东西很全面&#xff0c;需要做充足准备&#xff0c;就是除了概念以外问的有点懵逼了&#xff08;呜呜呜&#xff09;。回来之后把这些题目做了一个分…

软件测试学习规划(学习思路、学习方法、面试技巧、后期发展、职业规划等)

软件测试学习思路 1、基础知识、理论知识&#xff08;用例编写&#xff0c;测试方法&#xff0c;用例管理&#xff09;&#xff0c;测试思维的学习&#xff0c;很多人不屑理论&#xff0c;一股劲的扎进测试工具里面。最大的误区&#xff0c;工具永远学不完&#xff0c;测试必须…

【Node.js搭建服务器】使用Nodejs搭建简单的HTTP服务器----公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

C++入门--auto关键字、内联函数学习

目录 1.auto关键字&#xff08;C11&#xff09;1.1auto简介1.2auto的使用细则1.3auto函数不能推导的场景1.auto不能作为函数的参数2.auto不能直接用来声明数组 2.基于范围的for循环&#xff08;C&#xff09;2.1范围for循环的语法2.2使用auto的for循环2.3基于for循环的使用条件…

【linux网络】firewalld 防火墙

firewalld防火墙 一、firewalld防火墙1.1firewalld防火墙概述1.2firewalld与iptables的区别1.3Firewalld网络区域1.4firewalld数据处理的流程1.5firewalld防火墙的配置方法 二、firewall-cmd的命令选项2.1默认区域2.2网卡接口增删改查区域2.3源地址增删改查区域2.4区域规则的增…

接口测试之测试原则、测试用例、测试流程......

之前都是在网上杂乱得看了很多接口测试的资料&#xff0c;但总感觉不够系统&#xff0c;特地找了本书重新系统的学习一下&#xff0c;结合之前收集的一些资料查漏补缺。 《接口自动化测试持续集成postman》&#xff0c;这本大部分内容还是讲的是 postman 工具的使用方法&#…

spark应用程序的执行

1 SparkContext -》{ sparkconf --配置对象&#xff0c;基础配置 sparkEnv --环境对象&#xff0c;通讯环境 SchedulerBackend --通讯后台 住哟啊用于和Executor之间进行通讯 TaskScheduler – 任务调度器 任务调度 DAGScheduler – 阶段调度器 阶段划分 } spark.sparkContext…

贪心算法专练

⭐️前言⭐️ 本篇文章主要分享几道贪心算法的题目&#xff0c;贪心算法是一种基于自然智慧的算法&#xff0c;这类题目并没有统一的解法&#xff0c;但通常都是每一步做出一个局部最优的选择&#xff0c;最终的结果就是全局最优。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 …

图神经网络:(化学领域)再次认识图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 Mutagenicity数据集搭建模型训练模型文献阅读重新回来 Mutagen…

day36_JQuery

今日内容 零、 复习昨日 一、正则表达式 二、JQuery 零、 复习昨日 零、正则表达式 Regular expression RegExp 0.1 正则表达式 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行模式匹配的强大工具。语法&#xff1a; va…

京东云技术团队 —— 浅谈测试用例设计

一、测试用例为什么存在 1.1 定义 测试用例(Test Case)是指对特定的软件产品进行测试任务的描述&#xff0c;体现测试方案、方法、技术和策略。测试用例内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等&#xff0c;最终形成文档类的输出。简而言之&am…

04. 数据结构之栈

前言 栈&#xff08;stack&#xff09;是一种线性数据的逻辑存储结构。栈中的元素只能先入后出&#xff08;First In Last Out&#xff0c;简称FILO&#xff09;。最早进入的元素存放的位置叫作栈底&#xff08;bottom&#xff09;&#xff0c;最后进入的元素存放的位置叫作栈…

网络故障老搞不定,就看这篇笔记

大家好&#xff0c;我是老杨。 做咱们这行&#xff0c;每天遇到的故障千奇百怪什么都有。很多网工每天只是在工作而已&#xff0c;遇到一个问题&#xff0c;就解决一个问题&#xff0c;每天的日子都是一样的&#xff0c;枯燥无趣。 但是&#xff0c;就很少有人去汇总问题&…

分布式事务的21种武器 - 1

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

Scala学习(五)---面向对象

文章目录 1.Scala面向对象的构造器1.1 主构造器和从构造器(辅助构造器)1.2 主构造器参数 2.继承2.1 抽象属性和方法2.2 匿名子类 1.Scala面向对象的构造器 1.1 主构造器和从构造器(辅助构造器) //主构造器 class ConstructorTest(name:String) {//主构造器调用val name1:Stri…