对数器是什么?

通常我们在笔试的时候或者参加编程大赛的时候,自己实现了一个算法,但是不能够判断该算法是否完全没问题,如果在比赛平台上验证,通常只会告诉你有没有错误,出了错不会告诉你哪里有问题,对于排错来说是非常坑爹的,所以对数器就横空出世了,对数器就是用一个绝对OK的方法和随机器生成的样本数据进行合体,如果你的算法是没问题的,那么和对数器的这个百分之百正确的方法一个元素一个元素的比较,也一定是equals的。如果返回false,说明你的算法有问题。

纳尼??我都能写出一个百分之百正确的对数器了,还用得着跟我自己实现的算法比较么?肯定也是对的啊,话是如此,没错,但是算法的目的是更高效、更优的处理一些问题,你的比较器的时间复杂度和空间复杂度往往是比较低的,因为这样才能保证它的准确性,而你笔试或者比赛写出的算法,复杂度往往比较高,所以可以通过低复杂度但是绝对正确的方法验证你的算法正确不正确。

看一下左神大佬是怎么定义对数器的概念的:


1.有一个你想要测的方法a;
2.实现一个绝对正确但是复杂度不好的方法b;
3.实现一个随机样本产生器;
4.实现对比算法a和b的方法;
5.把方法a和方法b比对多次来验证方法a是否正确;
6.如果有一个样本使得比对出错,打印样本分析是哪个方法出错;
7.当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

对数器怎么用?

知道了对数器是什么之后,我们来看看应该怎么实现一个自己的对数器,以冒泡排序为例,直接上代码:

package com.bean.bubble_sort;import java.util.Arrays;public class BubbleSorted {public static void bubbleSort(int arr[]) {if (arr == null || arr.length < 2) {return;}for (int end = arr.length-1; end > 0; end--) {for (int i = 0; i < end; i++) {if (arr[i] > arr[i+1]) {swap(arr, i, i+1);}}}}public static void swap(int[] arr, int left, int right) {int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}//正确的排序方法public static void rightSort(int[] arr) {Arrays.sort(arr);}//生成一个随机大小,最大数随机的数组public static int[] generateRandomArray(int maxSize, int maxNum) {int[] arr = new int[(int) ((maxSize+1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) (Math.random()*(maxNum+1)) - (int)(Math.random()*maxNum);}return arr;}//复制当前数组的一个样本public static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] newArray = new int[arr.length];for (int i = 0; i < arr.length; i++) {newArray[i] = arr[i];}return newArray;}//判断两个数组是否完全相同public static boolean isEquals(int[] arr1, int[] arr2) {if (arr1.length != arr2.length) {return false;}if (arr1 != null && arr2 == null || arr1 == null && arr2 != null) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}if (arr1 == null && arr2 == null) {return true;}return true;}//打印数组public static void printArray(int[] arr) {if(arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}public static void main(String[] args) {int testTims = 10000;//测试次数int maxSize = 20;//最大测试容量int maxNum = 20;//最大测试数据boolean euqals = true;for (int i = 0; i < testTims; i++) {int[] arr1 = generateRandomArray(maxSize,maxNum);int[] arr2 = copyArray(arr1);//这两个数组除了//数值相同内存地址完全没关系,请看copyArray()方法实现bubbleSort(arr1);//用自己的算法排序rightSort(arr2);//用java.util.Arrays包的排序算法排序if (!isEquals(arr1,arr2)) {//比较是否相同euqals = false;//一旦有不一样的值就设为false;break;}}System.out.println(euqals ? "Success:恭喜你!没毛病!" : "Error:抱歉,有错误" );//没错就恭喜,有错就报错int[] newArr = generateRandomArray(maxSize, maxNum);printArray(newArr);//没排序的数组打印出来bubbleSort(newArr);//排序后printArray(newArr);//再次打印,程序员自己看看有没有毛病}
}

结果:

这就说明自己实现的冒泡排序是没毛病的,回过头再看一下对数器的概念,是不是更加理解了呢?
1.有一个你想要测的方法a;
2.实现一个绝对正确但是复杂度不好的方法b;
3.实现一个随机样本产生器;
4.实现对比算法a和b的方法;
5.把方法a和方法b比对多次来验证方法a是否正确;
6.如果有一个样本使得比对出错,打印样本分析是哪个方法出错;
7.当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

代码原理前面已经解释的比较清楚了,不懂得话多看两遍代码就会了~想学会一定要动手敲!!!

什么是对数器?对数器的作用是什么?相关推荐

  1. 什么是axios拦截器?有哪些作用和使用场景

    axios拦截器 拦截器介绍 一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器.响应拦截器. 请求拦截器 在请求发送前进行必要操作处理,例如添加统一cookie.请求体加验证.设置 ...

  2. python中修饰器的优点和作用_python 装饰器

    1. 装饰器装饰器其实是一个函数,作用是装饰其他函数 装饰器的特点:1. 不改变被装饰的函数的源代码的情况下添加函数的功能 2. 不改变被装饰的函数的调用方式 装饰器的组成方式:高阶函数+嵌套函数 1 ...

  3. python三大器_Python - 三大器 迭代器,生层器,装饰器

    Python - 三大器 迭代器,生层器,装饰器 在介绍三大器之前先来了解一下容器和可迭代对象... 一. 容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, ...

  4. 本科生尝试安卓APP开发:手机调音器节拍器(音乐学习者使用)

    目录 写在前面 本项目的灵感来源 作品完成度 项目介绍 APP的名字:沐尘调音器 APP功能介绍 调音器 节拍器 实际测试 调音器测试 节拍器测试 项目内容 开发环境 APP功能原理 1.调音器-编程 ...

  5. 【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )

    文章目录 一.调度子系统组件模块 二.主调度器.周期性调度器 三.调度器类 一.调度子系统组件模块 调度器 需要对 被调度的进程 进行 排序 和 调度管理 , 进程管理过程需要 调度器 的 组件模块 ...

  6. spring mvc拆分_Spring集成–强大的拆分器聚合器

    spring mvc拆分 健壮是什么意思? 在本文的上下文中,健壮性是指在不立即返回给调用者的情况下管理流中的异常条件的能力. 在某些处理方案中, n个 m个回答足以做出结论. 通常具有这些趋势的示例 ...

  7. Spring集成–强大的拆分器聚合器

    坚固是什么意思? 在本文的上下文中,健壮性是指在不立即返回到调用者的情况下管理流中的异常条件的能力. 在某些处理方案中, n个 m个回答足以做出结论. 通常具有这些趋势的示例处理场景是: 财务,保险和 ...

  8. 51 Python - 装饰器 参数化装饰器——装饰器更通用

    05参数化装饰器--装饰器更通用 参数化装饰器如何理解,简单理解就是让装饰器可以通用.场景举例,现在有个需求要改某一段文字,既要加<P>标签,又要加<B>,还有加<Div ...

  9. 矩阵的对数运算公式_必修一——对数与对数运算

    一.前言(废话) 高中数学我们已经学习了二次函数,指数函数(如果不记得的读者可以往前面翻看一下),这次作者为读者们讲解的是对数与对数运算,对数是什么呢?读者们心里有自己的认知吗? 二.对数 对数函数是 ...

  10. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成...

    原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页] [源码下载] 与众不同 wi ...

最新文章

  1. 《Haskell趣学指南》笔记之I/O
  2. linkText()的用法
  3. 【智能汽车与自动驾驶】
  4. 创新工场董事长兼首席执行官 李开复 发 言 稿
  5. 突发! 重庆全面封杀P2P!下一个会是谁?
  6. 如何通过提前Bake Docker镜像加快基础设施的启动速度
  7. 获取git的当前分支名称
  8. Centos7 Zabbix监控部署
  9. 离线语音空调插座设计应用案例
  10. SQLSERVER去重
  11. 计算机文件夹操作教案,文件文件和文件夹教案
  12. 关于雪花算法id冲突的思考解决思路
  13. 解决C++中调用Python脚本的LNK2001错误
  14. android 微信摇一摇代码,Android微信摇一摇
  15. 物联网通信技术原理第5章 移动通信技术
  16. 【spark实训】-- Scala实现单词计数
  17. C语言:关键字---struct(声明结构体类型)
  18. 前端使用sockJs进行聊天通讯的功能
  19. 无源NFC方案 无源NFC对外供电 NFC感应电源 无源NFC通讯 NFC无线充电方案 NFC无线取电方案 显示NFC标签
  20. [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)

热门文章

  1. 从独步全球到缺乏创新,苹果正迷失在5G全面屏时代?
  2. 2016蓝桥杯 凑算式
  3. 生产成本 - 异想天开
  4. RTSP视频推流方法汇总
  5. 10款优秀Bootstrap响应式后台管理系统模板
  6. 树莓派Odroid等卡片式电脑上搭建NAS教程系列2-SSH连接访问
  7. Linux环境部署与xshell连接虚拟机
  8. Struts2的配置 struts.xml Action详解
  9. win8计算机刻录功能吗,系统之家详解自带功能刻录Win8.1 32位系统盘
  10. Lucene分词详解