zoukankan      html  css  js  c++  java
  • Python-没啥用的分块随机查找程序

    在数量巨大的list中查找一个元素是否存在,想提高效率,想当然的以为和在java里面一样for循环查找是有优化余地的,于是给自己立了一个题目:

    利用Python语言中list切片特性,使用分块后随机找到一个块进行查找,如果成功就直接退出本次查找;如果失败就随机找另一个分块,知道查找成功或失败;

    思路:

    1、按照list长度,假定一个切片的长度,如len(list)=62734  则切片长度 slice_len就随意设定个10000,最多查7次就找到,最少一次就命中

    2、需解决:查找过的分块,不再被随机选中的逻辑。利用slice_len=1000产生一个7个元素(元素包含2个数,第一个数是分块起始坐标,第二个数是分块结束坐标)的list,用过的元素就删除

    3、被搜索的list中的元素可能有重复

    代码如下:

     1     def binarysearch(self,sour_list,target, slice_len):
     2         if not slice_len > 0 : slice_len = 1
     3         section_count = math.ceil(len(sour_list) / slice_len)
     4         def search_areas(sour_list,slice_len):
     5             listnew=[]
     6             length=len(sour_list)
     7             for section in range(section_count):
     8                 if (section+1)*slice_len <= length: 
     9                     listnew.append([section*slice_len, (section+1)*slice_len -1])
    10                 elif section*slice_len == (length-1):
    11                     listnew.append([length-1])
    12                 else:
    13                     listnew.append([section*slice_len ,length-1])
    14             return listnew
    15         section_list = search_areas(sour_list,slice_len)
    16         section_count_copy = section_count 
    17         for section in range(section_count):
    18             rand = math.floor(random.random()*(section_count_copy))
    19             section_count_copy-=1
    20             templist = sour_list[section_list[rand][0]:section_list[rand][1]]
    21             for index,item in enumerate(templist):
    22                 if item == target:
    23                     loaction = section_list[rand][0]+index
    24                     return True,loaction
    25             del section_list[rand]
    26         return False,None
    随机分块list查找

    测试脚本:

    1     def test_binarysearch():
    2         lista = [1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,1,1,1,1,2,2,2,2,3,3,3,4,4,4,4,5,5,5,5]
    3         print (u2.binarysearch2(lista,6,8)[1])
    4         print (u2.binarysearch2(lista,6,128)[1])
    5         print (u2.binarysearch2(lista,4,13)[1])
    6         print (u2.binarysearch2(lista,5,128)[1])
    7         print (u2.binarysearch2(lista,-1,8)[1])
    8         print (u2.binarysearch2(lista,3,0)[1])
    9         print (u2.binarysearch2(lista,3,-3)[1])
    View Code

    结果:

    1 None
    2 None
    3 28
    4 32
    5 None
    6 None
    7 None
    8 [Finished in 0.1s]
    测试结果

    测试结果证明,查找脚本能按照符合条件查找到目标结果,或不符合条件的查不到结果

    随后又进行了list长度100000的随机查找目标的测试,发现循环100次:

    如果slice_len-20000则平均查找时间490ms,如果slice_len-200则平均查找时间420ms。证明切片长度影响计算时间。

    这里特别强调一点,如果list长度100000,slice_len<8时,目标:41664 使用该脚本查不到数据,但41664肯定是存在list中,这是一个bug,没解决办法。

    随后10000次单独用 list的判断元素是否在list里的in方法直接查找:耗时:6ms

    随后10000次用随机分块法(slice_len=10000)的耗时:55268ms

    结论:不用瞎折腾了,list自带的查找方法效率挺高!!!

    随机分块算法的主要时间都消耗在变量新增与赋值之类的。。。。

    就当练习实现自己想法的脚本,这个脚本实际上没用

  • 相关阅读:
    【原创】Zend Framework快速开发(二)使用命令完成项目
    分析CMMS系统笔记使用js控制快捷键
    学习笔记——php利用@来抑制错误
    WINDOWS + WAMP + Zend Framework 配置
    PHP的$_SERVER变量笔记
    【原创】Zend Framework快速开发(一)zend框架的配置和项目创建(原创)
    带符号的8位2进制数最小值为多少?
    动态规划笔记
    我一直在拖国家的后退
    手机客户端和服务器通信时如何安全高效的进行身份验证
  • 原文地址:https://www.cnblogs.com/kuzaman/p/7285360.html
Copyright © 2011-2022 走看看