当前位置: 首页 > article >正文

算法----二分法找出有序列表指定值

#第一种:先判断在查询
def BinarySearch(arr,key):
    min=0
    max=len(arr)-1
    if key in arr:
        while True:
            center=int((min+max)/2)
            if arr[center]>key:
                max=center-1
            elif arr[center]<key:
                min=center+1
            elif arr[center]==key:
                print(str(key)+"在数组里面的第"+str(center)+"个位置")
                return arr[center]
    else:
        print("没有该数字!")
if __name__=="__main__":
    arr=[1,6,9,15,26,38,49,57,63,77,81,93]
    while True:
        key=input("请输入你要查找的数字:")
        if key== "   ":
            print("谢谢使用!")
            break
        else:
            BinarySearch(arr,int(key))



# 第二种:判断某个元素是否在列表中
#子问题算法(子问题规模为1)
def is_in_list(init_list,e1):
    return [False,True][init_list[0]==e1]
#分治算法
def solve(init_list,e1):
    n=len(init_list)
    if n==1:#若问题规模等于1,直接解决
        return is_in_list(init_list,e1)
    #分解(子问题规模为n/2)
    left_list,right_list=init_list[:n//2],init_list[n//2:]
    #递归(树),分治,合并
    res=solve(left_list,e1) or solve(right_list,e1)
    return res
if __name__=='__main__':
    #测试数据
    test_list=[12,2,23,45,67,3,2,4,45,63,24,23]
    #查找
    print(solve(test_list,45))
    print(solve(test_list,5))


# 第三种:找出有序列表中的指定值
data = [1, 3, 6, 13, 56, 123, 345, 1024, 3223, 6688]


def dichotomy(min, max, d, n):
    """
    min表示有序列表头部索引
    max表示有序列表尾部索引
    d表示有序列表
    n表示需要寻找的元素
    """
    if min > max:  # 终止条件,当查找区间不存在时表示没找到
        return None
    mid = (min + max) // 2  # 整除,确保mid是整数类型索引
    if d[mid] < n:
        print("向右侧找!")
        return dichotomy(mid + 1, max, d, n)  # 更新区间时,mid + 1避免重复检查当前mid位置元素
    elif d[mid] > n:
        print("向左侧找!")
        return dichotomy(min, mid - 1, d, n)  # 同理,mid - 1避免重复检查
    else:
        print('找到了%s' % d[mid])
        return d[mid]  # 返回找到的元素


res = dichotomy(0, len(data) - 1, data, 56)  # 这里max索引应该是len(data) - 1,因为索引从0开始
print(res)
运行结果:


第二种:
 

 

第三种:
 


http://www.kler.cn/a/397311.html

相关文章:

  • ubuntu安装 Pycharm
  • FreeSWITCH chat 得到的是 Error! Message Not Sent
  • 使用Python实现深度学习模型:智能食品配送优化
  • 大模型基础BERT——Transformers的双向编码器表示
  • Spring Cloud Eureka 服务注册与发现
  • Qt文件目录操作
  • RTSP播放器EasyPlayer.js播放器UniApp或者内嵌其他App里面webview需要截图下载
  • rust高级特征
  • 应用层协议之WebSocket
  • 分享一些关于 C 函数与 lua 交互的实际项目案例
  • 高级数据结构——hash表与布隆过滤器
  • 2024年秋国开电大《建筑工程项目招投标与合同管理》形考任务1-4
  • 【java版本中间件opc ua协议】写入数据,轮询、订阅方式读取数据
  • 鸿蒙进阶篇-Math、Date
  • Redis设计与实现第9章 -- 数据库 总结(键空间 过期策略 过期键的影响)
  • DDRPHY数字IC后端设计实现系列专题之数字后端floorplanpowerplan设计
  • 【循环测试试题2】小X与三次方
  • 如何实现一个既保证顺序又有快速插入删除的数据结构?
  • 蚂蚁金服-OceanBase-测试开发工程师-面经
  • 计算机网络:运输层 —— TCP 的 “三次握手” 与 “四次挥手”
  • 集群策略选择vs生产需求点(负载/可用性、灾备/安全性)
  • sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!
  • 康谋分享 | 确保AD/ADAS系统的安全:避免数据泛滥的关键
  • 网络安全:数字时代的守护盾
  • # ubuntu 安装的pycharm不能输入中文的解决方法
  • 基于的图的异常检测算法OddBall