• 算法第二章上机实践报告


    1、实践题目:7-1 二分查找(此题与詹泽伟同学一同完成)

    2、问题描述:

     3、算法描述:

      第一种方法(循环):

    #include<iostream>
    using namespace std;
    int BS(int a[],int x, int n){
        int l = 0;
        int r = n - 1;
        int count = 0;
        while(l <= r){
        count ++;
        int m =(l + r) / 2;
        if(x == a[m]) {
            cout << m <<endl << count;
            return m;
        }
        if(x > a[m]){
            l = m+1;
            }
        else {
            r = m-1;
        }
        }
    
        cout << "-1" <<endl << count;
        return -1;
    }
    int main(){
        int a[1005];
        int n, x;
        cin >> n;
        for(int i = 0; i < n; i++){
            cin >> a[i];
        }
        cin >> x;
        BS(a, x, n) ; 
        return 0;
    }
    View Code

      第二种方法(递归):

    #include <iostream>
    using namespace std;
    int BS(int a[], int x, int l, int r, int &count){
        count ++;
        if(l == r){
            if(x == a[l])
                return l;
            else
                return -1;
        while(l < r){
            int m = (l + r) / 2;
            if(x == a[m])
                return m;
            if(x < a[m]) 
                return BS(a, x, l, m-1, count);
            if(x > a[m])
                return BS(a, x, m+1, r, count);
        }
        }
    }
    int main()
    {
        int a[1005];
        int n, x ,count = 0;
        cin>>n;
        for(int i = 0; i < n; i++){
            cin>>a[i];
        }
        cin>>x;
        cout<<BS(a, x, 0, n-1, count) << endl ;
        cout<<count;
        return 0;
    }
    View Code

      其中count用来判断循环次数,此题比较基础。

    4、算法时间及空间复杂度分析

      第一种方法(循环): 通过代码分析,BS函数当中假设最坏情况下,循环X次之后找到,则:2^x=n; x=logn(算法中如果没写,log默认底数为2),循环的基本次数是log2 N,所以时间复杂度是O(logN),而main函数里面有一个构建数组的for循环,共经过了n次循环,因此时间复杂度为O(n),所以函数的空间复杂度为O(n)。(时间复杂度)

      main函数里面定义了一个a[n]因此需要一个长度为n的空间,而常数则忽略不计,因此空间复杂度为O(n)。(空间复杂度)

      第二种方法(递归): 通过代码分析,BS函数当中假设最坏情况下,循环X次之后找到,则:2^x=n; x=logn(算法中如果没写,log默认底数为2),递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的。(时间复杂度)

      BS函数里的空间复杂度为O(log2 N),而main函数里面定义了一个a[n]因此需要一个长度为n的空间,所以函数空间复杂度为O(n + log2 N)。(空间复杂度)
    5、实践收获

      1)遇到的问题:

      在写第一种方法的时候,一开始在BS函数中没有return m,还好我的小伙伴及时提醒了我(一直没意识到QAQ),第二种方法用了递归,琢磨了半个小时也没有琢磨出来,最后请教了老师,老师指出了问题的关键。开始时cout<<BS(a, x, 0, n-1, count) << endl << count ;这样的count只会是1,正确的做法应该是cout<<BS(a, x, 0, n-1, count) << endl ;  cout<<count;

      2)心得体会:感觉有个小伙伴真的比自己码要好(起码有个人陪自己一起脑壳疼嘿嘿...

  • 相关阅读:
    转linux ln命令详解 简单
    商业智能哲学思索
    IE8 RTM 和 IE8 RC1 版本比较。
    汇编语言发展树.
    IE8卸载后遗症,不得不继续当小白鼠。。。
    商务智能系统实现数据管理的关键技术
    商务智能 是什么? 不是什么?
    Standard and Custom Toolset Configurations
    统一论:3G手机、云计算、SaaS、业务开发平台、SOA、BPEL [转]
    JAVA Atm测试实验心得
  • 原文地址:https://www.cnblogs.com/yyxbokewang/p/11564888.html
Copyright © 2020-2023  润新知