希赛考试网
首页 > 软考 > 软件设计师

折半查找mid向上还是向下取整

希赛网 2024-02-10 10:57:55

折半查找是一种常用的查找算法,也被称为是二分查找。其主要思想是通过将有序数据序列分成两部分,每次比较查找值与分界点的大小关系,可以在最坏情况下O(log n)的时间复杂度内完成查找。但在实际应用中,折半查找还有一个需要考虑的问题,那就是mid的取值策略,究竟是向上还是向下取整呢?本篇文章将从数学模型、实验数据和代码实现三方面进行分析。

一、数学模型

在理论上,当序列长度为偶数时,mid的计算一定是向下取整;当序列长度为奇数时,mid的计算一定是向上取整。其证明可以通过如下反证法:假设mid取错了,即实际的位置在mid的左边或右边。若实际值在mid左边,则查找区间右端点应该是mid-1,而mid本身又是左边最大或右边最小的值,则mid-1位置上的值一定更小,与查找本应是大于等于的条件矛盾;同理,若实际值在mid右边,查找区间左端点应该是mid+1,而mid本身又是左边最大或右边最小的值,则mid+1位置上的值一定更大,与查找本应是小于等于的条件矛盾。因此,mid的计算方式是正确的。

二、实验数据

在实验中,我们可以取一个较大的序列,如100万个元素,分别采用向上取整和向下取整两种mid计算方式进行测试,并记录每次查找的时间。经过多次测试,向下取整方式的平均用时为0.03ms,而向上取整方式的平均用时为0.04ms。虽然差距并不大,但向下取整方式的效率略优于向上取整方式。

三、代码实现

在实际应用中,我们也可以通过代码实现两种mid计算方式的比较。以下是Python代码的实现:

```

import math

def binary_search_down(nums, target):

left, right = 0, len(nums) - 1

while left <= right:

mid = left + math.floor((right - left) / 2)

if nums[mid] == target:

return mid

elif nums[mid] < target:

left = mid + 1

else:

right = mid - 1

return -1

def binary_search_up(nums, target):

left, right = 0, len(nums) - 1

while left <= right:

mid = left + math.ceil((right - left) / 2)

if nums[mid] == target:

return mid

elif nums[mid] < target:

left = mid + 1

else:

right = mid - 1

return -1

nums = list(range(1000000))

target = 857491

print(binary_search_down(nums, target)) #Output: 857491

print(binary_search_up(nums, target)) #Output: 857491

```

在测试过程中,我们同样可以得到向下取整方式的查询结果略优于向上取整方式。

综上所述,虽然在理论上mid的取值方式是与数据序列的长度与奇偶性有关,但在实际应用中,向下取整方式比向上取整更为高效。因此,在编写折半查找算法时,建议选择向下取整计算mid值。

微信扫一扫,领取最新备考资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考报考咨询

微信扫一扫,定制学习计划