对数器是什么?

通常我们在笔试的时候或者参加编程大赛的时候,自己实现了一个算法,但是不能够判断该算法是否完全没问题,如果在比赛平台上验证,通常只会告诉你有没有错误,出了错不会告诉你哪里有问题,对于排错来说是非常坑爹的,所以对数器就横空出世了,对数器就是用一个绝对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. Python之Scrapy爬虫的常用命令
  2. msm8953之串口dts配置
  3. ITK:创建一个大小Size
  4. 前端学习(1401):多人管理21新增用户
  5. 我的代码第一次运行时的样子
  6. snmp4j介绍及api使用
  7. JQuery合并table单元格--有限制(table格式需要注意)
  8. MCU VR班會(07)記錄
  9. java jdbc close原理_Java开发笔记(一百四十六)JDBC的应用原理
  10. 口袋精灵java源码_0428数字口袋精灵app优化
  11. 实例99:使用AEGAN对MNIST数据集压缩特征及重建
  12. 辽宁省转升c语言考试真题,『2015年辽宁省考行测真题』2015年辽宁省考行测真题资料大全_2015年公务员辽宁省考行测真题及答案-华图教育...
  13. 19行列式公式和代数余子式
  14. Revit中为房间添加填充图例和“构件快速上色”
  15. 基于JSP的运动会综合管理系统
  16. pandas获取数据集数据类型分布(更细粒度的分割)
  17. Python遥感可视化 — folium模块展示热力图
  18. 如何选择O2OA(翱途)开发平台的部署架构?
  19. 临时解决mac解决安卓模拟器网络
  20. 查询mysql定时任务(事件)及事件的内容

热门文章

  1. flex 布局的浏览器兼容性方案
  2. 优秀的智慧展厅需要有哪些设计?
  3. 给准备自考本科想学汉语言专业的一些建议
  4. Thread守护线程判断每位员工是否可以下班,要求员工时间大于或等于8小时才能够下班
  5. 在windows平台下php使用imagick库把pdf转换成(合并)图片
  6. 昆仑健康增多多3号增额终身护理保险产品计划怎么样,好不好?
  7. 不容忽视的10个新兴硬件技术
  8. 解决JasperReport在Linux系统下中文字体无法显示的问题
  9. 个人服务器搭建过程(win10+ubuntu server虚拟机)
  10. SEO基础知识——SEO是什么?