算法导论-递归

递归程序在设计时很常见,有时能很大程度上简化问题解决的复杂性.

下面就算法导论的2.3-4习题进行解答.

具体就是写出插入排序的递归版本.

 1 void insert_sort(int a[],int n)
 2 {
 3     if(n==1) return ;
 4     else
 5     {
 6         insert_sort(a,n-1);
 7         int i=n-1,temp=a[n];
 8         while(a[i]>=temp&&i>=1) a[i+1]=a[i],i--;
 9         a[i+1]=temp;
10     }
11 }

瞧,过程很简洁.

但是要注意这个写法的效率是很低的.不论是空间还是时间都消耗很大.

递归式为:t[n]=t[n-1]+cn,所以时间消耗是n^2的.

另有一点需要说明,调用它时最大消耗递归栈空间有N个栈空间,通常栈空间是有限的,不可能无限制的随意使用递归啊.否则输入数据的变化多端很容易导致系统崩溃.

另延伸一点:2.3-5习题:

习题要求我们做出有关有序二分搜索的例子.

大致思想在题目中就给出了.下面我用代码实现一下子.

 1 void binary_search(int a[],int le,int ri,int x)
 2 {
 3     while(le<=ri)
 4     {
 5         int mid=(le+ri)/2;
 6         if(a[mid]==x) return mid;
 7         else if(a[mid]<x) le=mid+1;
 8         else ri=mid-1;
 9     }
10     return -1;
11 }
12
13 int binary_sear(int a[],int le,int ri,int x)
14 {
15     int mid=(le+ri)/2;
16     if(le>ri) return -1;
17     if(a[mid]==x) return mid;
18     else if(a[mid]>x) return binary_sear(a,le,mid-1,x);
19     else return binary_sear(a,mid+1,ri,x);
20  } 

以上仅限于有序数组的数字的二分搜索.  具体的搜索可视情况而定.

至于2.3-6习题.

显然是不能用二分搜索来优化结果的.这是源于数组自身的缺陷,导致其不能在常数时间内完成数据的插入和删除.

不过我们还是可以用二分搜索来尝试一下的.

但是我是不会去尝试的.

最后,2.3-7习题的解答是有点复杂的.

我能想到的就是先用归并排序,在对其进行遍历,对每一层遍历都尝试用二分搜索来看看是否有能够匹配的?时间也是nlogn

原文地址:https://www.cnblogs.com/zww-kjj/p/12383187.html

时间: 2024-10-10 10:37:21

算法导论-递归的相关文章

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

算法导论--图的遍历(DFS与BFS)

转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51897538 图的遍历就是从图中的某个顶点出发,按某种方法对图中的所有顶点访问且仅访问一次.为了保证图中的顶点在遍历过程中仅访问一次,要为每一个顶点设置一个访问标志.通常有两种方法:深度优先搜索(DFS)和广度优先搜索(BFS).这两种算法对有向图与无向图均适用. 以下面无向图为例: 1.深度优先搜索(DFS) 基本步骤: 1.从图中某个顶点v0出发,首先访问v

算法导论第十二章 二叉搜索树

一.二叉搜索树概览 二叉搜索树(又名二叉查找树.二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search.Maximum.Minimum.Insert.Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成.当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间.这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成.这样的改进结构有AVL(Adelson-Velskii-Landis)

算法导论--动态规划(装配线调度)

装配线问题: 某个工厂生产一种产品,有两种装配线选择,每条装配线都有n个装配站.可以单独用,装配线1或2加工生产,也可以使用装配线i的第j个装配站后,进入另一个装配线的第j+1个装配站继续生产.现想找出通过工厂装配线的最快方法. 装配线i的第j个装配站表示为Si,j,在该站的装配时间是ai,j 如果从 Si,j装配站生产后,转移到另一个生产线继续生产所耗费的时间为ti,j 进入装配线花费时间ei,完成生产后离开装配线所耗费时间为xi 令f*表示通过生产所有路线中的最快的时间 令fi[j]表示从入

算法导论_第二章(1)

年前的时候去逛书店,久仰算法导论这本书的大名看见后也就买了下来.回家看了一段时间,发现看书的进度真的是极慢,书里的课后题很多,那些不会的问题也是通过网上搜别人的答案才得以解决的.所以,我就想把我看这本书的心得连带课后的解答分享给大家.同时也是给我坚持把算法导论这本书看完的一个动力 ^_^ 因为本书的第一章相当于一个导论就直接跳过了,那么,从第二章开始! 第二章主要介绍了插入排序和归并排序: 所谓的插入排序就像是一局扑克刚开始时的摸牌阶段,你对手中的扑克所做的整理排序一样.开始时,我们的左手为空并

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

算法导论-第24章 Dijkstra算法

Dikstra算法解决的是有向图上单源最短路径问题(无向图可以看成有相反的两条有向边),且要求边的权重都是非负值. 算法导论用了很多引理,性质来证明Dijstra算法的正确性,这里不说了,也表达不明白,只说我理解的过程. 有一个图G( V,E) ,选定一个源点s,维护一个集合Q=V-s,  Q中点有一个d值表示此时从s到该点的已知距离,s.d=0 :初始化都为正无穷,表明不可达.然后对s点所连接的点(设为点集M)进行松弛操作,就是设点m属于M, m.d > s.d+ w(s,m) 则更新 m.d

MIT算法导论笔记

详细MIT算法导论笔记 (网络链接) 第一讲:课程简介及算法分析 第二讲:渐近符号.递归及解法