首页 > 其他分享 >使用benchmark比较分治法与归纳法求解最大子数组问题的性能

使用benchmark比较分治法与归纳法求解最大子数组问题的性能

时间:2023-04-05 11:45:59浏览次数:38  
标签:right int max 分治 benchmark subarray 归纳法 array size

#include <benchmark/benchmark.h>

#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <random>
#include <string>
#include <vector>

using namespace std;

static const int _num = 5000;
static const int _lrange = -1000;
static const int _rrange = 1000;
static const int _iter = 20;




int max_across_subarray(vector<int> _array, size_t left, size_t mid,
												size_t right) {
	int lmax = -10000, rmax = -10000, lsum = 0, rsum = 0;
	for (auto lIter = _array.begin() + mid; lIter >= _array.begin() + left;
			 lIter--) {
		lsum += *lIter;
		lmax = max(lsum, lmax);
	}
	for (auto rIter = _array.begin() + mid + 1; rIter <= _array.begin() + right;
			 rIter++) {
		rsum += *rIter;
		rmax = max(rsum, rmax);
	}
	return lmax + rmax;
}

int max_subarray(vector<int> _array, size_t left, size_t right) {
	if (left == right) return _array.at(left);
	size_t mid = (left + right) / 2;
	int lmax = max_subarray(_array, left, mid);
	int rmax = max_subarray(_array, mid + 1, right);
	int mmax = max_across_subarray(_array, left, mid, right);
	return max(max(lmax, rmax), mmax);
}

int max_across_subarray_induction(vector<int> _array, size_t right) {
	int lmax = -10000, lsum = 0;
	for (auto lIter = _array.begin() + right; lIter >= _array.begin(); lIter--) {
		lsum += *lIter;
		lmax = max(lsum, lmax);
	}
	return lmax;
}

int max_subarray_induction(vector<int> _array, size_t right) {
	if (right == 0) return _array.front();
	int former_max = max_subarray_induction(_array, right - 1);
	int left_max = max_across_subarray_induction(_array, right);
	return max(former_max, left_max);
}


static void BM_demo_1(benchmark::State& state) {
	for (auto _ : state) {
		state.PauseTiming();
		vector<int> a;
		random_device rd;
		mt19937 gen(rd());
		uniform_int_distribution<int> dist(_lrange, _rrange);
		for (int i = 0; i < _num; ++i) {
			a.push_back(dist(gen));
		}
		state.ResumeTiming();
		max_subarray(a, 0, a.size() - 1);
	}
}
BENCHMARK(BM_demo_1)->Iterations(_iter);

static void BM_demo_2(benchmark::State& state) {
	for (auto _ : state) {
		state.PauseTiming();
		vector<int> a;
		random_device rd;
		mt19937 gen(rd());
		uniform_int_distribution<int> dist(_lrange, _rrange);
		for (int i = 0; i < _num; ++i) {
			a.push_back(dist(gen));
		}
		state.ResumeTiming();
		max_across_subarray_induction(a, a.size() - 1);
	}
}
BENCHMARK(BM_demo_2)->Iterations(_iter);

BENCHMARK_MAIN();

标签:right,int,max,分治,benchmark,subarray,归纳法,array,size
From: https://www.cnblogs.com/fjnhyzCYL/p/17289052.html

相关文章

  • 使用benchmark比较插入排序与归并排序性能
    #include<benchmark/benchmark.h>#include<algorithm>#include<deque>#include<functional>#include<iostream>#include<random>#include<string>#include<vector>usingnamespacestd;staticconstint......
  • 030 高阶导数求导之推导归纳法、公式法
    030高阶导数求导之推导归纳法、公式法......
  • 分治(Divide and Conquer)算法之归并排序
    顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为1的子数组;“......
  • CF429D Tricky Function 题解 分治/平面最近点对
    题目链接:http://codeforces.com/problemset/problem/429/D题目大意:给定一个长度为\(n\)的数列\(a_1,a_2,\ldots,a_n\)。用\(s\)表示\(a\)的前缀和数组,即\(s_......
  • CF743B Chloe and the sequence 题解 分治
    题目链接:http://codeforces.com/problemset/problem/743/B题目大意:对于一个n-序列,如果n==0,那么它是一个空的序列(也就是说空序列中没有元素)。然后会进行i次操作,每次......
  • CF768B Code For 1 题解 分治
    题目链接:http://codeforces.com/problemset/problem/768/B解题思路:分治。本题和的解题思路相似。tips:如果如果\(n\)对应的区间完全被\([l,r]\)覆盖了,则区间\([......
  • 0001-算法笔记分治法实现棋盘覆盖问题
    今天上课老师讲了分治法,下课后自己把程序碼了一遍,还是存在一个疑问--为什么每个方格都会填充到,在下面将会解决并叙述。    首先贴上程序:#include<stdio.h>#incl......
  • 「分治」黑白棋子的移动
    本题为3月23日23上半学期集训每日一题中A题的题解题面题目描述有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:○○○○○●●●●......
  • 权值(点分治)
    264.权值-AcWing题库引:\(\color{Yellow}水何澹澹,山岛竦峙。\)Solution这是一棵无根树,所以据此使用点分治。点分治适合处理大规模的树上路径信息问题。我们先......
  • 分治策略
    分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这......