python 二分法查找字典中指定项第一次出现的索引

import time #引入time库,后续计算时间.
inform_m = {} #创建母字典
inform_s = {} #母字典下嵌套的子字典

#给母字典添加键-for i in range(1,100001):
    inform_m.setdefault(str(i),inform_s.fromkeys(['name','sex','age'],'Undefined'))

def search(dic = inform_m, content = 'Undefined'): #设置dic content默认参数,dic为要查找的字典,content为要查找的内容
    time_b = time.time() #调用方法时记录启动时间

    num_key = dic.items()
    num_keys = len(num_key)
    num_begin = 1
    num_end = num_keys
    state = True
    i = 'off'
    #初始化所有变量

    while state:
        if num_end == 1: #如果num_end == 1 判断第一项是否是我们要查找的。
            if dic['1']['name'] == content:
                num_end = 1
                state = False
                break
            else:
                num_end += 1
                state = False
                break
        value = dic[str(num_end)]['name'] #获取最后一项值
        if value == content: 
            value_b = dic[str(num_end - 1)]['name'] #获取前一项值
            if value == value_b: #如果查找到了content,进而判断前一项是否与content一样,如果一样,则缩小范围,继续查找。如果不一样,证明找到了那么就可以终止循环了
                if i == 'off': #i作为一个标准判断 num_begin 是否赋值,同学自己研究一下为什么要判断这个
                    num_end = num_end // 2
                else:
                    num_m = num_begin
                    num_end = (num_end - num_m + 1) // 2 + num_begin
            else:
                state = False
        else:
            if num_end == num_keys:
                state = False
            else:
                i = 'on'
                num_m = num_begin
                num_begin = num_end
                num_end = (num_end - num_m + 1) // 2 + num_begin

    time_e = time.time()
    print('调用二分查找算法开始时间:{}   结束时间:{}'.format(time_b,time_e))
    return num_end

def normal():
    time_bb = time.time()
    for ii in range(1,100001):
        
        value = inform_m[str(ii)]['name']
        if value == 'Undefined':
            break
        else:
            pass
    time_ee = time.time()
    print('调用普通算法开始时间:{}   结束时间:{}'.format(time_bb,time_ee))
    return ii


for j in range(1,94181): #给字典中的项赋值
    inform_m[str(j)]['name'] = 'Jobs'

print(search(),normal())

 

posted @ 2021-02-01 20:05  Naihe\  阅读(225)  评论(0)    收藏  举报
// 音乐播放器