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

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

时间: 2024-11-04 20:56:28

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

结对编程初体验——代码复审

这一次和室友结对编程,第一项任务就是互看代码.想到上一次这样认真看她的C++代码,是一年前学程序设计这门课时,帮她人工debug.虽然都是从头到尾认真读代码.通逻辑,感觉却是不同的,之前的关注点是bug在哪,而现在却是带着任务的,要关注代码核查表中的项目.结果看着看着,总感觉自己在找茬dbq 回归正题↓ 编译环境:Dev-C++ 5.9.2 程序语言:C++ (一)优点: 能发现的优点,大多都是自己的缺点 1.代码可读性强. 通过详细的注释,即便是我们两个的个人项目使用的不是同一种语言,我看懂她

软件工程第二次作业—结对编程

一. 作业要求 两人组成一队,进行结对编程. 从第一次软件工程作业中选出一人的作业作为这次作业的基础. 设计一个图形界面(GUI)的四则运算应用程序,可以是PC桌面的图形界面程序.网页程序或者手机程序. 设计的应用程序可以完成加法.减法.乘法.除法运算. 应用程序可以完成真分数的四则运算. 例如:1/2 + 1/3 = 5/6 例如:1/5 + 3/10 = 1/2(而不是5/10) 例如:1'1/3 - 2/3 = 2/3 (是1'1/3而不是4/3,注意:" ' "为1'1/3整数

结对编程——黄金点游戏

结对编程项目-黄金点游戏 一.项目描述:黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业

结对编程——潜艇大战

成员: 孟宪彦 宋鹏 项目描述:操纵战舰向水下扔“炸弹,轰炸位于下方的”潜艇“ 主要代码截图: 运行结果截图: 合作过程合影: 时间过程: 选题讨论:1小时(9.12) 思路分析:1小时(9.12) 编写代码:4天(9.12-9.16) 程序测试:1小时(9.16) 博客记录:30分钟 心得体会: 本次结对编程对我们意义很大,在编程过程中我们遇到了很多困难,两人互相请教,互相帮助,一起克服困难,让我们产生了合作意识,对于以后的学习,工作,生活都有很大的意义

结对编程小游戏2048

作业要求: 自选题目(不少于500行代码),进行结对编程 轮流担任领航员和驾驶员 记录结对编程的过程,写成结对博客 1.结对题目,写清需求 2.上传代码(截图),两人合作的合影 3.约定的规范 4.记录时间 5.心得和体会 Deadline 9月18日 23:59:59 小组成员 019任帅昌 020禹继跃 1.结对题目:2048小游戏 需求分析:在人们学习工作之余,小游戏成为了人们打发时间做的必不可少的事情了,而2048这款小游戏它不仅能在你工作学习疲惫之后使你身心放松,还能益智 2.游戏代码

结对编程2048小游戏

作业要求: 自选题目(不少于500行代码),进行结对编程 轮流担任领航员和驾驶员 记录结对编程的过程,写成结对博客 1.结对题目,写清需求 2.上传代码(截图),两人合作的合影 3.约定的规范 4.记录时间 5.心得和体会 Deadline 9月18日 23:59:59 小组成员 019任帅昌 020禹继跃 1.结对题目:2048小游戏 需求分析:在人们学习工作之余,小游戏成为了人们打发时间做的必不可少的事情了,而2048这款小游戏它不仅能在你工作学习疲惫之后使你身心放松,还能益智 2.游戏代码

第一次的结对编程

选择题目 题目1: 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: - 能够自动生成四则运算练习题 - 可以定制题目数量 - 用户可以选择运算符 - 用户设置最大数(如十以内.百以内等) - 用户选择是否有括号.是否有小数 - 用户选择输出方式(如输出到文件.打印机等) - 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 我在这次作业中担任的是领航员,何涛是驾驶员 一.单元测试 1.运行结果 (1)目录界面 (2)整数运算 (3)分数运算 (4)

结对编程 (201421123002,201421123006,201421123007)

201421123002 翁珊, 201421123006 黄月梅, 2014211007 徐晓珊 题目描述: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功能.一定价值的程序. 1.记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算. 2.有计时功能,能显示用户开始答题后的消耗时间. 3.界面支持中文简体/中

结对编程一二事

一 结队编程过程 作为一次作业,我们进行了这次结对编程.这是我们第一次进行结队编程,感觉还是比较特别的. 这次结队编程的目的是完成微信抢票系统中的查票功能,由张诗文主写,我在旁边进行辅助和帮忙,也就是在旁边协助张诗文一起完成coding.整个过程还是比较流畅的,由于对项目的了解,加之两人之间相互帮助,当他思维阻塞时,我会帮助他疏导思想,当他出现bug时,我也能及时发现.最重要的是这个过程中,他会一直与我进行交流,这就相当于用两人之力共同完成一项任务. 二 遇到的问题 由于是第一次结对编程,而且还