1 / 26
文档名称:

《程序员编程艺术:面试和算法心得》第二部分算法心得摘要.docx

格式:docx   页数:26页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

《程序员编程艺术:面试和算法心得》第二部分算法心得摘要.docx

上传人:分享精品 2016/3/28 文件大小:0 KB

下载得到文件列表

《程序员编程艺术:面试和算法心得》第二部分算法心得摘要.docx

相关文档

文档介绍

文档介绍:第四章查找匹配 有序数组的查找题目描述给定一个有序的数组,查找某个数是否在数组中,请编程实现。分析与解法一看到数组本身已经有序, 我想你可能反应出了要用二分查找, 毕竟二分查找的适用条件就是有序的。那什么是二分查找呢? 二分查找可以解决( 预排序数组的查找) 问题: 只要数组中包含 T( 即要查找的值), 那么通过不断缩小包含 T 的范围,最终就可以找到它。其算法流程如下: ?一开始,范围覆盖整个数组。?将数组的中间项与 T 进行比较, 如果 T 比数组的中间项要小, 则到数组的前半部分继续查找,反之,则到数组的后半部分继续查找。?如此,每次查找可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围, 最终就会在数组中找到 T ,或者确定原以为 T 所在的范围实际为空。对于包含 N 个元素的表,整个查找过程大约要经过 log(2)N 次比较。此时,可能有不少读者心里嘀咕,不就二分查找么,太简单了。然《编程珠玑》的作者 Jon Bentley 曾在贝尔实验室做过一个实验, 即给一些专业的程序员几个小时的时间, 用任何一种语言编写二分查找程序( 写出高级伪代码也可以), 结果参与编写的一百多人中: 90% 的程序员写的程序中有 bug (我并不认为没有 bug 的代码就正确)。也就是说:在足够的时间内,只有大约 10% 的专业程序员可以把这个小程序写对。但写不对这个小程序的还不止这些人: 而且高德纳在《计算机程序设计的艺术第 3卷排序和查找》第 . 1 节的“历史与参考文献”部分指出,虽然早在 1946 年就有人将二分查找的方法公诸于世,但直到 1962 年才有人写出没有 bug 的二分查找程序。你能正确无误的写出二分查找代码么?不妨一试, 关闭所有网页, 窗口, 打开记事本, 或者编辑器,或者直接在本文评论下,不参考上面我写的或其他任何人的程序,给自己十分钟到 N 个小时不等的时间,立即编写一个二分查找程序。要准确实现二分查找,首先要把握下面几个要点: ?关于 right 的赋值 o right = n-1 => while(left <= right) => right = middle-1; o right =n => while(left < right) => right = middle; ? middle 的计算不能写在 while 循环外,否则无法得到更新。以下是一份参考实现: int BinarySearch ( int array[], int n, int value) { int left =0; int right =n-1; // 如果这里是 int right =n的话,那么下面有两处地方需要修改,以保证一一对应: //1 、下面循环的条件则是 while(left < right) //2 、循环内当 array[middle] > value 的时候, right = mid while (left <= right) // 循环条件,适时而变{ int middle = left + ((right - left) >> 1 ); // 防止溢出,移位也更高效。同时,每次循环都需要更新。 if (array[middle] > value) { right = middle -1; //right 赋值,适时而变} else if (array[middle] < value) { left = middle +1; } else return middle; // 可能会有读者认为刚开始时就要判断相等,但毕竟数组中不相等的情况更多// 如果每次循环都判断一下是否相等,将耗费时间} return -1;}总结编写二分查找的程序时?如果令`left <= right ,则 right = middle - 1; ?如果令 left < right ,则 right = middle;` 换言之,算法所操作的区间, 是左闭右开区间, 还是左闭右闭区间, 这个区间, 需要在循环初始化。且在循环体是否终止的判断中, 以及每次修改 left, right 区间值这三个地方保持一致, 否则就可能出错。 行列递增矩阵的查找题目描述在一个 m行n 列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数, 判断数组中是否含有该整数。例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字 6 ,则返回 true ; 如果查找数字 5 ,由于数组不含有该数字,则返回 false 。分析与解法解法一、分治法这种行和列分别递增的矩阵, 有一个专有名词叫做杨氏矩阵, 由剑桥大学数学家杨表在 1900