码迷,mamicode.com
首页 > 其他好文 > 详细

对二分法思想的理解 及 结对编程情况汇报

时间:2018-10-19 02:13:53      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:while   辅助   二分搜索   含义   arc   复杂度   partner   数组   style   

一、对二分法思想的理解

1.特点:又称为折半算法,是分治策略的一个典型例子。主要是用于:在已排好序的n个元素组成的数组a[0:n-1]中,找出一个特定的元素x。

2.基本思想:(1)将n个元素分成个数大致相同相同的两半,然后取a[n/2]与x作比较。

      (2)如果x = a[n/2],则已找到x,返回下标并结束算法;

        如果x < a[n/2],则只在数组a的左半部继续搜索x;

        如果x < a[n/2],则只在数组a的右半部继续搜索x;

3.时间复杂度:在二分搜索算法中,x每进行比较,待搜索的数据范围就折半一次,直到找到x;

       最坏情况为数组中没有x,则x需进行log n次比较,此时二分搜索算法的时间复杂度为O(log n);

       最好情况为x为数组最中间的值,即x只需进行一次比较,此时二分搜索算法的时间复杂度为O(1);

4.空间复杂度:在二分搜索算法中,只需要n个空间用于存放n个元素组成的数组a,无需其余辅助空间,所以二分搜索算法的空间复杂度为O(1);

5.优点:时间复杂度小,可用于数据量较大的情况。

6.缺点:只可用于一事先排好序的数组。

7.实现算法

(1)循环

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

(2)递归

int BinarySearch(int a[],int left,int right,int x)
{
    int middle = (left + right) / 2;
    if(x = a[middle]) return middle;
    if(x < a[middle]){
        BinarySearch(a,left,middle-1,x);
    }
    else{
        BinarySearch(a,middle+1,right,x);
    }
    return -1;
} 

 

二、结对编程情况汇报

  跟partner结对至今,我们总共开展了两次合作讨论。

  第一次合作是讨论pintia上的“第二章作业”。刚开始时,我们对于选择题第7、12和15题的答案都是有点迷茫的,所以我们重点针对这些题目查找一些相关的资料并展开讨论,在经过多次讨论之后,我们最终成弄懂这些题目的含义并算出正确的答案。

  第二次合作是共同完成pintia上的“第二章实践”,由于我partner在课前已事先完成了这些题目,所以在课上,主要是我负责在思考解题方式和敲代码,而我partner主要负责在旁边忙纠错。三道题完成后,我们俩针对如何采用二分法解决第三题这个问题展开了讨论,并得出了解法的基本思想,但还有许多细节有待继续讨论。

  总而言之,这次个partner的结对编程在一定程度上拓宽了自身的解题思维,也帮助自己更好地去套用每一个算法。

对二分法思想的理解 及 结对编程情况汇报

标签:while   辅助   二分搜索   含义   arc   复杂度   partner   数组   style   

原文地址:https://www.cnblogs.com/wanna-acm/p/9813927.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!