(声明:本教程仅供本人学习使用,如有人使用该技术触犯法律与本人无关)
(如果有错误,还希望指出。共同进步)
问题
给定一个值,在指定的列表中找到最接近它的值返回
指定列表
BRM = [1300, 2000, 2300, 4000, 6000, 8000, 14000, 25000]
方案一
思路描述
- 找到指定列表中最中间的值,拆分列表
- 判断后找到最小范围,如 2300 < 3000 < 4000,而不是2300 < 3000 < 6000
- 最后判断取最小范围的左边还是右边
代码
def judge_index_of_num(br, brm, params="left"):
"""
:param br: 给定的值
:param brm: 判断的子列表
:param params: 'left' | 'right' 子列表属于父列表的左边还是右边
:return:
"""
left = brm[0]
right = brm[-1]
if params == "left":
_new_brm = brm[:-1][::-1]
for index, jbt in enumerate(_new_brm):
if br <= jbt:
right = jbt
else:
if left == brm[0]:
left = jbt
else:
_new_brm = brm[1:]
for index, jbt in enumerate(_new_brm):
if br >= jbt:
left = jbt
else:
if right == brm[-1]:
right = jbt
return left, right
# 主执行函数
def bit_rate_transform(bit_rate):
"""
:param bit_rate: 所查找的值
:return:
"""
middle_num = len(BRM) // 2
if bit_rate < BRM[middle_num]:
left, right = judge_index_of_num(bit_rate, BRM[:middle_num + 1])
elif bit_rate > BRM[middle_num]:
left, right = judge_index_of_num(bit_rate, BRM[middle_num:], params="right")
else:
return BRM[middle_num]
if bit_rate <= (left + right) / 2:
return left
else:
return right
方案二
思路描述
- 差值绝对值列表
- 找到最小差值的下标,再找到接近范围的值
代码
def bit_rate_transform(bit_rate):
"""
:param bit_rate: 所查找的值
:return:
"""
_new_bit_poor = [abs(bit_rate - i) for i in BRM]
print(_new_bit_poor)
min_poor = min(_new_bit_poor)
return BRM[_new_bit_poor.index(min_poor)]
总结
时间复杂度 | 梳理点 | 隐患问题 | |
---|---|---|---|
方案一 | N | 1、逻辑复杂,需要对左右列表进行判断 2、没有使用python自身的方法 3、也有可能找到列表右边相近的数值,取决于中间值 | 如果列表再细分的话,会用到递归方法,比较占用内存,原因是judge字段会多种情况,增加多种 |
方案二 | N | 1、逻辑简单 2、使用了内置方法,如min、abs、index | 会找到列表顺序从左到右第一个最接近的值 |