C++ 数据结构(一)绪论(5)迭代与递归(2)

来源:我的博客站 OceanicKang |《C++ 数据结构(一)绪论(5)迭代与递归(2)》

上一篇:《C++ 数据结构(一)绪论(5)迭代与递归(1)》

数组倒置

问题描述

任给数组 A[0, n),将其前后颠倒

统一接口:void reverse(int *A, int lo, int hi);

递归版

void reverse(int *A, int lo, int hi)
{
    if (lo < hi) { // 问题规模的奇偶性不变,需要两个递归基
        swap(A[lo], A[hi]);
        reverse(A, lo + 1, hi - 1);
    }
}

1.png

迭代原始版

void reverse(int *A, int lo, int hi)
{
    next:
        if (lo < hi) {
            swap(A[lo], A[hi]);
            lo++; hi--;
            goto next;
        }
}

迭代精简版

void reverse(int *A, int lo, int hi)
{
    while (lo < hi) swap(A[lo++], A[hi--]);
}

分而治之

为求解一个大规模的问题,可以:

1、将其划分为若干(通常两个)子问题,规模大体相当

2、分别求解子问题

3、由子问题的解,得到原问题的解

2.png

数组求和:二分递归

/**
 * 对 A[lo, hi] 内元素求和
 * 入口形式为 sum(A, 0, n - 1)
 */
sum(int A[], int lo, int hi)
{
    if (lo == hi) return A[lo];
    int mi = (lo + hi) >> 1; // 等价于 (lo + hi) / 2
    return sum(A, lo, mi) + sum(A, mi + 1, hi);
}

3.png

递归跟踪分析

4.png

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ T(n) &= 各层递归实例…

递推方程

从递推的角度看,为求解 sum(A, lo, hi),需

递归求解 sum(A, lo, mi) 和 sum(A, mi + 1, hi) 2 * T(n/2)

进而将子问题的解累加 O(1)

递归基:sum(A, lo, lo) O(1)

递 推 方 程 : { T ( n ) = 2 ∗ T ( n 2 ) + O ( 1 ) T ( 1 ) = O ( 1 ) = &gt; T ( n ) = ( c 1 + c 2 ) n − c 1 = O ( n ) 递推方程: \begin{cases} T(n) = 2 * T( \frac{n}{2} ) + O(1) \\ \\ T(1) = O(1) \end{cases} =&gt; T(n) = (c_1 + c_2)n - c_1 = O(n) T(n)=2T(2n)+O(1)T(1)=O(1)=>T(n)=(c1+c2)nc1=O(n)

下一篇:《C++ 数据结构(一)绪论(5)迭代与递归(3)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值