算法第二章上机实践报告

Posted on 2019-09-22 00:35  橘猫  阅读(184)  评论(0编辑  收藏  举报

内容目录:

  1. 实践题目
  2. 问题描述
  3. 算法描述
  4. 算法时间及空间复杂度分析
  5. 心得体会(对本次实践收获及疑惑进行总结)

一、实践题目

        设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

 

二、问题描述

       1. 使用二分搜索算法;

       2. 在经典二分搜索算法的基础上进行改写,搜索方式不改变的情况下输出想要的结果(经典二分搜索方式的思路再此题中依然适用,需要改写输出的部分)。

 

三、算法描述

       1. 代码:

            

#include <iostream>
using namespace std;

int BinarySearch(int a[], int x, int n) {
    int left = 0;
    int right = n - 1;
    
    while (left <= right) {
        
        int mid = (left + right) / 2;
        if (x == a[mid]) {
            cout << mid << " " << mid << endl;
            
            return mid;
        }

        if (x > a[mid]) {
            left = mid + 1;
        }

        else {
            right = mid - 1;
        }

    }

    cout <<right << " "<<left << endl;
    
    return -1;//未找到x
}


int main()
{
    int array[1000];
    int n, x;
    cin >> n >> x;
    for (int i = 0; i < n; i++)
    {
        cin >> array[i];
    }

    BinarySearch(array, x, n);

    return 0;
}

 

      2. 相关实现描述:

          使用二分搜索函数int BinarySearch(int a[], int x, int n)来实现二分搜索的功能,里面将会出现四种情况:

           (1). x == a[mid],即输入要查找的数字在数组中正好存在,此时将会输出两次要查找的数字在数组中的对应下标;

           (2). 要查找的x并不在数组里面,此时不断地查找,指针不断移动,最后的停留会出现三种情况:停留在恰好比x大和比x小的两个数字之间、停留最小数字的左边、停留在最大数字的右边。相对应的输出结果有三种:输出小于x的最大元素的最大下标和大于x的最小元素的最小下标、输出:-1 0 、输出:n-1的值 n的值,

 

四、算法的时间复杂度和空间复杂度分析

       由此容易看出,每执行一次算法的while循环,待搜索的数组大小减小一半。因此,在最坏情况下,while循环被执行了O(logn)次。循环体内运算需要O(1)时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn)。空间复杂度同样为O(logn)。

 

五、心得体会

       经过此次上机实践后,感受到了算法其实并不是想象中的困难,但也不是完全没有难度。所有复杂的算法都是由简单的算法为基础,进行改写或是组合,由此来达到自己想实现的功能。同时,还想要说,有一些问题并没有想象中的复杂,有些时候,可能只是需要改动一个小小的地方就可以达到想要的效果。