上机实践报告

Posted jewfer-03-08

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上机实践报告相关的知识,希望对你有一定的参考价值。

1.实践题目

  PTA算法 7-1 二分查找

2.问题描述

技术图片

 

3.算法描述

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int number = 0;  //定义比较次数
 5 
 6 //left和right分别代表a[]最小值下标和最大值下标
 7 void binarySearch(int a[], int x, int left, int right)
 8     //如果x不存在,输出-1
 9     if(left > right)
10         cout << "-1" << endl;
11         cout << number;
12     
13     else
14         number++;  //每次查找都是一次比较
15         int mid = (left + right) / 2;
16         //当二分查找的中间值就是要找的x,则输出下标和比较次数
17         if(a[mid] == x)
18             cout << mid << endl;
19             cout << number;
20         
21         //如果中间值大于x,则递归查找中间值左边的一半数组
22         else if(a[mid] > x)
23             binarySearch(a, x, left, mid - 1);
24         
25         //如果中间值小于x,则递归查找中间值右边的一半数组
26         else if(a[mid] < x)
27             binarySearch(a, x, mid + 1, right);
28         
29     
30  
31  
32 int main()
33     int n, x;
34     int a[1000];
35     cin >> n;
36     for(int i = 0; i < n; i++)
37         cin >> a[i];
38     
39     cin >> x;
40     binarySearch(a, x, 0, n - 1);
41     return 0;
42         

 

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

(1)时间复杂度:

   每经过一次比较,数组a的大小就变为原来的一半,则有T(n) = O(1) + T(n/2) = O(logn)

(2)空间复杂度:

  因为定义的变量a[]所分配的空间大小不随n和x的变化而变化,所以该算法的空间复杂度S(n) = O(1)

5.心得体会

   该题主要是要理解分治法的思想,二分法顾名思义就是讲一个大的问题分为两个较小的子问题进行求解,我这里用的是递归的算法,在将a[mid]和x进行比较后,要分清当x<a[mid]时应该在左边的子数组里进行递归查找,反过来则在右边的子数组里进行查找。还有就是x不存在的情况,就是当你二分查找完,left指向的下标已经超过了right指向的下标时,就可以返回-1了。

  遇到的主要问题是开始没有想到number++放在哪里比较合适,没有想到每进行一次二分查找就是一次比较的情况。

以上是关于上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章

第二章上机实践报告

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

第二章上机实践报告

算法第二章上机实践报告

算法第二章上机实践报告

算法第二章上机实践报告