2018-06-14 机试准备05

查找


一、例2.9 找x

此题很简单 线性遍历数组查找 O(m) 只是为了回忆该题型 

发现自己写的和参考实例不同的地方:我写了一个flag判断是否找到,并且找到就直接输出;参考实例则直接把ans设置为-1,找到也把下标赋值给ans,最后统一输出。(逻辑挺不一样的 不过都不影响)


二、例2.10 查找学生信息

首先回归了一下二分法的思路 注意该方法的基础是待查找数列已经排好序了;当出现查找起始点大于查找结束点时,说明查找子集已经为空集,查找失败。该法的时间复杂度为O(logm)

此题如果用线性查找,复杂度会达到O(n*m)千万数量级,而利用二分查找可以优化到O(nlogn*nlogm) 其中nlogn为升序排列复杂度

遇到的问题:

1) 忘记要升序排序了; 后来排序还是用的cmp 忘了可以重载<就不要cmp了; 而且cmp中比较字符串大小不确定如何实现,第一遍是return !strcmp(); 第二遍改为return strcmp()>0对了

2)结合数组和结构后二分查找代码实现部分下标比较混乱 容易想不清楚 base/i和top/j和(base+top)/2或(i+j)/2

3)初始化的问题 对大数组在外部定义 内部初始化时 直接初始化为{}好像不行 必须for循环来一步步{} (好吧这个还待确认?

和示例的区别:

1)示例的输出都是 输入一行就输出一行结果 我的处理是输入所有的待查序号后 再统一输出结果 这个需要在确认一下?

2)示例没有直接找到就输出 而是记住目标元素的下标 赋值给ans 而ans初始化为-1 所以可以最后直接判断是否=-1来判断是否找到 再统一输出 同例1

扩展:

二分查找的定界应用:如:在一个升序数组中,确定一个下标点,使在这个下标点之前的数字均小于等于目标数字,而数组中的剩余部分均大于目标数字。

编写程序:上例二分查找中的while循环条件里的跳出循环的top 即为该问题的数组下标点。 

你可能感兴趣的:(2018-06-14 机试准备05)