对数器验证算法正确性----bug寻找,文章中含有测试源码

简介: 对数器验证算法正确性----bug寻找,文章中含有测试源码
先写一个随机数组生成函数
再写一个暴力求解函数
再写一个二分法函数
循环打印,产生任意随机数组,验证暴力求解和二分法求解是否一致,一致则正确,不一致则错误,打印出错误例子方便后面寻找bug
[打印出错误例子](https://editor.csdn.net/md?articleId=122718241)
package cn.Text;
import java.util.Arrays;
/**
 * 二分法
 * 一次找一半,比较找位置/数字(num)   保证有序
 * 注:我们中点位置一般去上中点
 * 135679      上中点为5
 */
public class Dichotomy {
    /**
     *  二分法查找
     */
    public static boolean find(int[] arr,int num){
        //TODO 边界条件,先剔除掉不符合条件的一部分
        if((arr==null)||(arr.length==0)){
            return false;
        }
        //TODO 左边界
        int L=0;
        //TODO 有边界
        int R=arr.length-1;
        /**
         * arr的[L...........R]之间查找一个数num
         */
        while(L<=R){
            int media=(L+R)/2;
            if(arr[media]==num){
                return true;
            }
            else if(arr[media]<num){
                L=media+1;
            }
            else{
                R=media-1;
            }
        }
        return false;
    }
    /**
     * 遍历,暴力求解
     * @param sortedArr
     * @param num
     * @return
     */
    public static boolean test(int[] sortedArr, int num) {
        for (int cur : sortedArr) {
            if (cur == num) {
                return true;
            }
        }
        return false;
    }
    /**
     * 生成一个随机数组
     */
    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            //TODO 最后减去一个(int) (maxValue * Math.random())是为了产生复数的测试集合,
            //         例如不减(int) (maxValue * Math.random())之前数组是  1,15,2,33,9
            //             减去(int) (maxValue * Math.random())之后数组是  -31,5,7,23,-11
            //             产生负数,增加测试机效果,减少耦合性
            arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
            /** TODO int 取整     int(8.9)=8     int(1.2)=1  int(0.9)=0
             * 上面的(maxValue+1)是应为数字全部扩大maxValue倍,为什么不是maxValue呢
             * int(9.9)=9  ,   Math.random的取值范围是[0,1),左闭右开,举个例子说明一下
             *  TODO  maxValue=9,Math.random()=0.99【因为范围为[0,1),左闭右开,故不能到1,只能无限趋近于1】
             *  int((maxValue) * Math.random())=int(9*0.99)=int(8.91)=8,
             *  TODO  maxValue=1,Math.random()=0.99
             *  int((maxValue) * Math.random())=int(1*0.99)=0
             *  所以maxValue要加1
             *  int((maxValue+1) * Math.random())=int(2*0.99)=1
             */
        }
        return arr;
    }
    /**
     * 主函数
     *
     * @param args
     */
    public static void main(String[] args) {
        int testTime = 500000;
        int maxSize = 10;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTime; i++) {
            int[] arr = generateRandomArray(maxSize, maxValue);
            //TODO 打印出随机生成的数组,循环一次生成一个
            System.out.println(Arrays.toString(arr));
            //TODO 因为二分法的先决条件是数组有序,所以我们来个排序使数组从小到大排序
            Arrays.sort(arr);
            //TODO 排列后的数组
            System.out.println(Arrays.toString(arr));
            int value = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
            //TODO 二分法和暴力法进行比对,看是否一样
            if (test(arr, value) != find(arr, value)) {
                System.out.println("出错了!");
                succeed = false;
                break;
            }
        }
        System.out.println(succeed ? "Nice!" : "Fucking fucked!");
    }
}
**
## 验证算法正确
**

image.png

目录
相关文章
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
51 8
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
39 7
|
1月前
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
381 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
30天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
59 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
1月前
|
机器学习/深度学习 JSON 算法
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
185 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
|
1月前
|
机器学习/深度学习 算法 PyTorch
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-7.0版本进行目标检测的完整流程,包括算法介绍、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。YOLOv5以其高精度、快速度和模型小尺寸在计算机视觉领域受到广泛应用。
411 0
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
|
1月前
|
缓存 数据挖掘 测试技术
目标检测实战(三):YOLO-Nano训练、测试、验证详细步骤
本文介绍了YOLO-Nano在目标检测中的训练、测试及验证步骤。YOLO-Nano是一个轻量级目标检测模型,使用ShuffleNet-v2作为主干网络,结合FPN+PAN特征金字塔和NanoDet的检测头。文章详细说明了训练前的准备、源代码下载、数据集准备、参数调整、模型测试、FPS测试、VOC-map测试、模型训练、模型测试和验证等步骤,旨在帮助开发者高效实现目标检测任务。
44 0
目标检测实战(三):YOLO-Nano训练、测试、验证详细步骤
|
1月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
55 3
|
2月前
|
SQL 安全 测试技术
『软件测试6』bug一两是小事,但安全漏洞是大事!
该文章强调了在软件测试中识别与处理安全漏洞的重要性,并详细介绍了常见的安全测试类型、测试流程及使用的主要工具,帮助测试人员有效地检测和防止安全问题。
『软件测试6』bug一两是小事,但安全漏洞是大事!