对二分法的学习体会以及关于结对编程的体验分享

对二分法的学习体会以及关于结对编程的体验分享

1) 二分搜索技术

  1. 二分搜索算法是运用分治策略的典型例子。二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)时间完成搜索任务。
  2. 问题描述:给定已排好序的n个元素a[0: n-1],现要在这n个元素中找出特定的元素x
  3. 解决方法:

    a) 顺序搜索方法:逐个比较a[0: n-1]中元素,直至找出元素或搜索整个数组后确定x不在其中。该方法没有很好地利用n个元素已排好序这个条件,因此在最坏的情况下,顺序搜索方法需要O(n) 次比较。

    b) 二分搜索方法:将n个元素分成个数大致相同的两半,取a[n/2]x作比较。如果x = a[n/2],则找到x,算法终止;如果x < a[n/2],则只在数组a的左半部继续搜索x;如果x > a[n/2],则只在数组a的右半部继续搜索x。具体算法可描述如下:

int BinarySearch(Type a[], const Type& x, int n){
    //在a[0] <= a[1] <= ... <= a[n-1]中搜索x
    //找到x时返回其在数组中的位置,否则返回-1
    int left = 0, right = n - 1;
    while(left <= right){
        int mid = (left + right) / 2;
        if (x == a[mid]) return mid;
        else if (x > a[mid]) left = mid + 1;
        else right = mid - 1;
    } 
} 

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

2) 二分排序技术

  1. 问题描述:给定无序的n个元素a[0: n-1],编写一个程序输出该数组的有序序列a[0: n-1]
  2. 解决方法:

    a) 归并排序:用分治策略实现对n个元素进行排序的算法。基本思想就是将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

    归并排序实现代码如下:

void MergeSort(Type a[], int left, int right)
{    //A[left:right]是一个全程数组,
    //含有 right-left+1个待排序的元素。
    if (left < right){  //至少有2个元素
        int mid = (left + right) / 2;  //求当前数组的分割点
        MergeSort(a, left, mid);  
        MergeSort(a, mid + 1, right);  
        Merge(a, b, left, mid, right);  //合并两个排好序的子问题,放入另一个数组b中
        copy(a, b, left, right);
    }
}

     计算出归并排序的时间复杂度T[n] = O(nlogn)

    b) 快速排序:将数组A[1:n]分解成两个子数组B[1:p]B[p+1:n],使得B[1:p]中的元素均不大于B[p+1:n]中的元素,然后分别对这里两个数组中的元素进行排序(非降的),最后再把两个排好序的数组接起来即可。

    快速排序实现代码如下:

void QuickSort(Type a[], int p, int r){
     if(p < r){
        int q = Partition(a, p, r);  //Partition函数负责将a进行一次分割,返回分割元素的位置
        QuickSort(a, p, q - 1);  //对左半段排序
        QuickSort(a, q + 1, r);  //对右半段排序
     }
} 

     计算出快速排序的时间复杂度T(n) = O(nlogn)

    c) 但当数据量越来越大时,归并排序比快速排序慢,快速排序的优势愈发明显。

    阅读:https://blog.csdn.net/jymn_chen/article/details/17359003

3) 相关资料:

  a) 高等学校规划教材《计算机算法设计与分析》 王晓东著

  b) 思想:https://blog.csdn.net/u011082606/article/details/47834519

  c) 实践:https://blog.csdn.net/jacob_007/article/details/52601847

  d) 改进:https://blog.csdn.net/lxs2016/article/details/75125217

  e) 快速排序与归并排序的比较:

  https://blog.csdn.net/jymn_chen/article/details/17359003 

  https://blog.csdn.net/louiswang2009/article/details/5616064

 

4) 结对编程情况

  1. 课堂上:在算法课堂上我和我的partner会不时的交流问题,共同学习并理解课堂上老师讲述的内容。
  2. 课后交流:课后我们除了会继续讨论课堂上没有解决的问题(通过问老师、查资料等),也会就作业的一些特点发表自己的看法,在各自单独完成作业后再进行交流。
  3. 对于具体的一个编程任务,我们先在某些关键代码思想上进行交流,并尽量达成共识,而后再各自独立完成任务,之后再进行代码的分享与进一步交流。

转载于:https://www.cnblogs.com/ljl-gd/p/9786677.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值