博客
关于我
分治法查找最大值最小值实验
阅读量:802 次
发布时间:2019-03-25

本文共 1607 字,大约阅读时间需要 5 分钟。

分治法寻找数组最大最小值

问题描述

输入一组数据,找出其中的最大值和最小值。这是一种典型的分治问题,可以通过将数据不断划分,然后分别处理子部分来解决。

分治思想

在传统的分治方法中,我们采用递归的方式来解决问题。以下为寻找数组最大最小值的分治实现思路:

  • 初始检查:如果当前范围只包含一个元素,那么最大值和最小值就是该元素本身。
  • 分割数组:将当前数组范围分为左右两部分,取中间点mid。
  • 递归处理
    • 对左半部分(l到mid)使用递归查找最大值和最小值。
    • 对右半部分(mid+1到r)同样使用递归查找最大值和最小值。
  • 合并结果
    • 比较左右两部分的最大值,取较大的作为整体的最大值。
    • 比较左右两部分的最小值,取较小的作为整体的最小值。
  • 代码实现

    #include 
    #include
    #include
    #include
    using namespace std;void search(int *a, int l, int r, int &maxi, int &mini) { if(l == r) { maxi = mini = a[l]; return; } int mid = (l + r) / 2; int max1, max2, min1, min2; search(a, l, mid, max1, min1); search(a, mid+1, r, max2, min2); maxi = max(max1, max2); mini = min(min1, min2);}int main() { int n, i; LARGE_INTEGER nFreq, nBegin, nEnd; double time; ifstream in("input.txt"); ofstream out("output.txt"); in >> n; int a[n]; for(i = 0; i < n; ++i) { in >> a[i]; } QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&nBegin); search(a, 0, n-1, maxi, mini); QueryPerformanceCounter(&nEnd); time = (double)(nEnd.QuadPart - nBegin.QuadPart) / (double)nFreq.QuadPart; out << "maxi: " << maxi << " mini: " << mini << "\n" << "search time: " << time << "s\n"; in.close(); out.close(); return 0;}

    复杂度分析

    主函数时间复杂度分析

    递归函数复杂度

  • 递推关系

    • T(n) = 2*T(n/2) + 2
  • 主定理

    • T(n) = k*T(n/m) + f(n^d),其中m^d = 1,k = 2
  • 时间复杂度简化

    • T(n) = O(n)
  • 迭代处理

    迭代方法虽然也能解决问题,但速度是线性的,时间复杂度为O(2n),与分治法相当。

    测试数据及结果分析

    以下是不同规模数据的运行时间测试结果:

    规模(n) 10 100 1000 10000 100000 500000
    耗时/s 1.48e-5 1.7e-5 6.01e-5 6.54e-4 6.71e-3 4.017e-2

    转载地址:http://ozdyk.baihongyu.com/

    你可能感兴趣的文章
    java旅店管理系统(ssm)
    查看>>
    java旅拍平台(ssm)
    查看>>
    620道 Python开发工程师面试题合集
    查看>>
    Ansible Ad-hoc 命令详解
    查看>>
    APR学习失败问题定位排查
    查看>>
    BitLocker驱动器加密概述
    查看>>
    Burp Suite使用进阶
    查看>>
    BurpSuite实战九之使用Burp Repeater
    查看>>
    BurpSuite实战八之使用Burp Intruder
    查看>>
    BurpSuite浏览器代理插件使用(附switchyomega与foxyproxy浏览器代理插件)
    查看>>