疑问

王老师,每次听你的课有一种醍醐灌顶的感觉。

昨天上课的时候,你讲到分治法的时候,有个例子,在P98页算法例4.11 合并排序的分治算法。有一些疑问。

疑问

算法4.11代码如下:

template <class Type>
void mergesort(Type A[],int low,int high)
{
 int mid;
 if(low<high){
 mid = (low+high)/2;//昨天你在PPT上面是(high-low)/2
 mergesort(A,low,mid);
 mergesort(A,mid+1,high)
 merge(A,low,mid,high);
}
}

这里的疑问你在于 昨天你说求数组的中间元素两种方法是一样的。你的证明如下:

(low+high)/2-(high-low)/2=low

我感觉这里你理解错了 low的含义了,low应该是一个未知的变量,不是你所说的0;
另外我在查找资料后,发现应该是这样写的。

(low+high)/2=(high-low)/2+low

这里说明了寻找数组的中间元素有两种方法,但是在资料中显示这样一段话

int binary_search(int arrSeq[], int nLength, int nKey)  
{  
if (arrSeq == NULL || nLength<1)  
{  
return -1;//不合法  
}  
else if (nKey<arrSeq[0] || nKey>arrSeq[nLength - 1])  
{  
return -1;//不合法  
}  
int low = 0;  
int high = nLength - 1;  
while (low <= high)  
{  
int middle = (high - low) / 2 + low; // 直接使用(high + low) / 2 可能导致溢出  
if (arrSeq[middle] == nKey)  
return middle;  
//在左半边  
else if (arrSeq[middle] > nKey)  
high = middle - 1;  
//在右半边  
else  
low = middle + 1;  
}  
//没找到  
return -1;  
}  

问题

**直接使用(high + low) / 2 可能导致溢出 **
这里有很大的疑问,为什么会有这种区别,都是定义的整型变量,而且基本上这句话的时间复杂度都是1,为什么使用(high+low)/2会出现栈溢出,这是案例http://www.magicsite.cn/blog/Java/Java/Java237595.html。希望王老师给出一些资料,让我去找一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 就全句提出问题,希望对方给予肯定或否定答复的问句,叫做一般疑问句。回答时要用Yes或No来开头,句末用问号...
    铁岩阅读 13,278评论 0 5
  • Block 梳理与疑问 时隔一年,再次读 《Objective-C 高级编程》,看到 block 一章,这一次从头...
    DeerRun阅读 3,875评论 0 2
  • 最近做基于BFF架构的分布式移动端API接口的系统设计。工作过程中发现有些工程师对JWT安全验证的认识存在一些偏差...
    offbye西涛阅读 17,508评论 16 19
  • 在日语中,疑问词并不是只能出现在特殊疑问句中, 它同样也可以用于陈述句、一般疑问句,祈使句中。今天要讲的就是这部分...
    不帅任你踹阅读 18,671评论 3 15
  • 切割果实: 可以切割一切包括空间、时间、甚至是世界。 技能: 融合:可以配合武装色和剑与剑气一起使用。 可以和武器...
    太上布衣阅读 6,682评论 0 1