上机实践报告
Posted chenyuqi32-2-11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上机实践报告相关的知识,希望对你有一定的参考价值。
一、实践题目———二分查找
二、问题描述
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入格式:
输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。
输出格式:
输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入样例:
4
1 2 3 4
1
输出样例:
0
2
三、算法描述
主要是运用递推的方法,不断的折半查找x,如果查找不到x,devide_selsct将会返回-1;而查找次数,则交给全局变量i。
#include<iostream>
using namespace std;
int i = 0;
int devide_select(int a[], int x, int left, int right)
if( left <= right)
i++;
int mid = (left + right) / 2 ;
if( a[mid] == x ) return mid;
if( a[mid] > x ) return devide_select( a, x, left, mid - 1);
if( a[mid] < x ) return devide_select( a, x, mid + 1, right);
else return -1;
int main()
int n;
cin >> n;
int a[n];
for(int i = 0; i < n; i++)
cin >> a[i];
int x;
cin >> x;
int x_sign = devide_select( a, x, 0, n-1);
cout << x_sign << endl;
cout << i;
四、算法时间及空间复杂度
1、时间复杂度
由于是递归的二分搜索算法所以,devide_selsct的时间复杂度为O(log n),而循环输入的时间复杂度为O(n),再加上其他语句的时间复杂度O(1),则可得算法的时间复杂度为,上面的相加,即O(n)
2、空间复杂度
这段代码里,向计算机请求的空间只有int和int[],他们的空间复杂度分别为O(1)和O(n),将他们相加即可得到算法的时间复杂度,即O(n)
五、心得体会
本来刚开始做这个题的时候,笔者以为是一道挺简单的题(本来也是挺简单的),但是呢,做的途中,却遇到过许多问题。比如输出错误,笔者犯了2次,首先是输出的格式,格式搞错了许多次。但解决完这个后,输出的结果还是错误,笔者左思右想,最后发现出现在了递归的return上,递归的某些地方没有return,导致数据输出错误。还遇到过许多问题,因篇幅问题,笔者就不展开讨论。
希望以笔者的例子来告诫大家,学算法还是要多学多试多练,你不试,不练,你永远不知道简单的算法里,你会犯多少错误。
以上是关于上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章