• 算法导论-递归


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

    下面就算法导论的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

  • 相关阅读:
    java学习——abstract 和 final
    apache配置访问目录的默认页面
    Beyond Compare 4
    idea常用插件
    linux关闭防火墙
    本地项目上传到gitlab
    删除数据库中多余的数据
    git上传本地项目到gitlab
    谷歌浏览器插件
    域名
  • 原文地址:https://www.cnblogs.com/zww-kjj/p/12383187.html
Copyright © 2020-2023  润新知