对数器的简单使用

1.前言

学习左神的数据结构的过程中,推荐使用对数器检验自己的算法是否正确

2.内容

简介对数器

1.对数器的作用:在一个题目未OJ的时候,可以通过对数器检验自己算法是否正确。
(比如,自己写了两种方法,一种是暴力但正确(也可能错误),另一种是复杂度较小,但不知道是否正确的B,此时可以通过对数器检测两种方法得出的结果是否一致,来判断对错)
(如果两种都有可能错,可以在中间结果不同 时 进行打印,通过比较,更好地修改两种方法)
2.对数器的实现
进行数据量尽可能大的测试,比如测试次数>=100000,如果两种方法的结果都一致,那么很有可能就是对的

以排序算法的检测为实例

这里选择插入排序,检测自己写的插入排序是否存在问题

#include<iostream>
using namespace std;                //整个对数器玩儿玩儿,嘿嘿
#include <ctime>        
#include <cstdlib>
#include <algorithm>    
//思路 :  利用系统的排序方法 和 自己写的方法 比较每次排序后的结果 
//如果在数据量较大的时候也可以 两个都对,那么 说明写的没毛病

void main()
{
	void test();           //测试
	test();
}

void test()
{
	int GenerateArrayAndCompare();     //生成一个随机数组并进行比较
	srand((unsigned int)time(NULL));    //设置随机种子
	int testtime = 10000;                 //测试次数
	int i;
	for (i = 0; i < testtime; i++)
	{
		if (!GenerateArrayAndCompare())     //返回为0,说明排序不对
			break;
	}
	if (i == testtime)         //通过了所有测试
		cout << "success!" << endl;
}

void InsertionSort(int* a, int n)       //插入排序
{
	for (int i = 1; i < n; i++)
	{
		for (int j = i; j > 0 && a[j] < a[j - 1]; j--)     //j从i向前看
		{
			a[j] = a[j] ^ a[j - 1];
			a[j - 1] = a[j] ^ a[j - 1];
			a[j] = a[j] ^ a[j - 1];
		}
	}
}
int Compare(int *a, int *b, int n)
{
	sort(b, b + n);     //用系统提供的快速排序将b排序好
	InsertionSort(a, n);    //用自己写的插入排序排好a

	for (int i = 0; i < n; i++)     //比较排序后的两个数组
	{
		if (a[i] != b[i])           //有不同的则先把所有的数字先打印,再返回0
		{
			cout << "fail!" << endl;
			for (int j = 0; j < n; j++)
			{
				cout << a[j] << " ";
			}
			cout << endl;
			for (int j = 0; j < n; j++)
			{
				cout << b[j] << " ";
			}
			return 0;
		}
	}
	return 1;                 //都相同返回1
}

int GenerateArrayAndCompare()
{
	int MaxValue = 100;               //数值范围为0~100
	int MaxArea = 5000;              //数组最大大小在5000以内
	int n = rand() % MaxArea + 1;     //数组大小1~5000
	int* a = new int[n];             //动态内存分配
	int* b = new int[n];
	int i;
	for (i = 0; i < n; i++)
	{
		a[i] = rand() % MaxValue + 1;            //每个元素1~100
	}
	for (int j = 0; j < n; j++)           //将a的每个元素赋给b
		b[j] = a[j];                 
	int flag = Compare(a, b, n);
	delete[]a;
	delete[]b;
	if (flag)
		return 1;
	else
		return 0;
}

在这里插入图片描述
这里设置测试次数为10000次,基本已经可以确定是正确的了

3.总结

现在只觉得很巧妙
希望在之后的学习中能更加灵活运用~~

4.更新日志

2022.4.20 整理
欢迎评论留言、指正~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值