问题描述
穷举搜索就是在整个搜索空间范围内尝试每一种可能性,直到找到目标值或者整个搜索空间都找完也没有找到目标值。最常见的穷举搜索就是线性搜索,即按照顺序简单检查所有不同的可能性。
例如:2个警察追逐强盗到了一个废弃旅馆的二楼走廊,走廊有30道门,全部关闭,其中一个警察已经封锁了对面的楼梯,该如何找到强盗呢?
解决方案
方法1:
随机打开一扇门,没有强盗,再随机打开一扇门……? |
按照以上方法,特警如果运气好,可能一下就找到了;运气不好时,可能有的门找了很多遍,有的门呢一次都没找。这样就有可能出现遗漏和重复,反而找不到需要的信息。处理这种搜索空间不是很大的情况下最佳的就是穷举搜索。
方法2:
搜索整个楼层,把所有门一次踢开! |
代码实现:
1 通过index实现
listdata=[1,2,3,4,5,6] x=3 i=listdata.index(x) if(i>=0 and i<len(listdata)): print(x,'is in data') else: print('{}is not in list'.format(x)) #异常处理 try: i=listdata.index(x) except ValueError: print('{}is not in list'.format(x)) else: if(i>=0 and i<len(listdata)): print(x,'is in data') |
2 通过in判断
listdata=[1,2,3,4,5,6] x=3 if(x in listdata): print('1:',x,'is in data') else: print('1:{}is not in list'.format(x)) |
3 通过count函数统计
listdata=[1,2,3,4,5,6] x=3 c=listdata.count(x) if(c>0): print(x,'is in data') else: print('{}is not in liat'.format(x)) |
4 通过正则表达式RE实现各种搜索
4.1 查找所有的匹配
import re listdata='hello,everyone!hello,mum.hello,daddy!' x='hello' print(re.findall(x,listdata)) |
4.2 只要找到1个匹配就返回
import re listdata='hello,everyone!hello,mum.hello,daddy!' x='hello' comp=re.compile(x) y=re.search(comp,listdata).group() print(y) |
结语
正则表达式解决的是很多复杂的匹配,比如查找所有以‘a’开头的,或者找所有包含3个数字的这种更一般性的问题用正则表达式是更方便的。也可以使用循环实现穷举搜索。当然,Python中的list自己就有许多函数可以实现查找。穷举搜索在任何领域都容易实现,即使要处理非结构化的数据,但是它的效率也很低。