算法设计与分析复习——第二章:递归与分治

简介:

 

第二章:递归与分治

1  请问二分搜索算法、快速排序算法、线性时间选择算法和最近点对问题的时间复杂性各为多少?

答:二分搜索算法:最坏情况O(logn)

快速排序算法:最坏情况O(n2),最好情况和平均情况均为O(nlogn)

线性时间选择算法:最坏情况O(n)

最近点对问题:时间复杂性O(nlogn)

 

2, 分治法的基本思想是什么?分治法的要领是什么?(分治法可分为哪三个主要步骤?)

答:分治法的基本思想:是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

分治法是把一个规模较大的问题分解为若干个规模较小的子问题,这些子问题相互独立且与原问题同类; 首先求出这些子问题的解,然后把这些子问题的解组合起来得到原问题的解。由于子问题与原问题是同类的,故使用分治法很自然地要用到递归。

因此分治法分三步:

1 ),将原问题分解为子问题(Divide

2 ),求解子问题(Conquer

3 ),组合子问题的解得到原问题的解(Combine

 

3,分治法的适用条件是什么?

         答:分治法所能解决的问题一般具有以下几个特征:

该问题的规模缩小到一定的程度就可以容易地解决;

该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质

利用该问题分解出的子问题的解可以合并为该问题的解;

该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

 

 

 

 

 

 

 

 

 

4,二分搜索算法程序:

         


 


public static int find(int[] data,int goal,int left,int right){

        int mid = (left+right)/2 ;  

        if(left>right){   

            return -1 ;    

        }       

        if(goal==data[mid]){  

            return mid ;

        } 

        else if(goal<data[mid]){

            //注意right = mid -1 ;

            return find(data,goal,left,mid-1);

        }

        else if(goal>data[mid]){       

            return find(data,goal,mid+1,right);

        } 

        return -1 ;   //未找到     

}

 

template<class Type>

int BinarySearch(Type a[], const Type& x, int L, int R){

while (R >= L){

int m = (L+R)/2;

         if (x == a[m]) return m;

         if (x < a[m]) R = m-1; else L = m+1;

 }

return -1;

}

 

 

例题:

 

1,排列问题:

设计一个递归算法生成n个元素{r1,r2,,rn}的全排列。

解:

 

Template<class type>

void Perm(Type list[ ], int k, int m)

{//Generate all permutations of list[k:m].

     if (k==m)  //第一版中有错误

     {//list[k:m] has one permutation, output it

            for (int i=0;i<=m;i++)

                  cout<<list[i];

             cout<<endl;

       }

       else//list[k:m] has more than one permutation

            //generate these recursively

              for(i=k;i<=m;i++)

             {     Swap(list[k],list[i]);

                   Perm(list,k+1,m);

                   Swap(list[k],list[i]);

               }


本文转自 梦朝思夕 51CTO博客,原文链接:http://blog.51cto.com/qiangmzsx/802713


相关文章
|
11月前
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
736 4
|
9月前
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
444 127
|
6月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
367 3
|
6月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
124 0
|
8月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
737 2
|
7月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
387 0
|
8月前
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
5月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
512 0
|
5月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
337 2
|
6月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
311 3