输入一个值在列表中找到最接近的值

输入一个值在列表中找到最接近的值


(声明:本教程仅供本人学习使用,如有人使用该技术触犯法律与本人无关)
(如果有错误,还希望指出。共同进步)


问题

	给定一个值,在指定的列表中找到最接近它的值返回

指定列表

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)]

总结

时间复杂度梳理点隐患问题
方案一N1、逻辑复杂,需要对左右列表进行判断
2、没有使用python自身的方法
3、也有可能找到列表右边相近的数值,取决于中间值
如果列表再细分的话,会用到递归方法,比较占用内存,原因是judge字段会多种情况,增加多种
方案二N1、逻辑简单
2、使用了内置方法,如min、abs、index
会找到列表顺序从左到右第一个最接近的值
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值