考虑一下:
i=raw_input()
y=int(i.split()[1])
r=raw_input()
for k in range(0,y):
if raw_input() in r: #####introduce binary search here
print "YES"
else:
print "NO"
这是一个非常简单的程序。输入将是:
3 1
34 54 36
54
YES
第一行是no of elements in an array
,no of queries
第二行是array
第三个是query
,它只询问元素是否在array
中。如果它是打印YES
其他NO
。
这是一个非常简单的程序。但问题是当我使用10000
和10000
查询数组运行时,程序会在其中一个站点上超出时间限制。
问题是我可以在此优化什么?
解决方案1,我认为它引入了binary search
,但需要sorting
,即使使用最快,即快速排序,也需要nlogn
。
任何想法????
答案 0 :(得分:2)
我认为你想要的是:
elements, queries = map(int, raw_input().split())
array = set(raw_input().split()) # not really an array, but...
if len(array) != elements:
raise ValueError('unexpected number of elements in array')
for _ in range(queries):
print 'YES' if raw_input() in array else 'NO'
set
进行O(1)
成员资格测试,因为元素可以播放(我已选择将字符串直接放入集合中,但您可以将它们转换为整数,这是也是可以清洗的,订单并不重要,你可以获得显着的加速。
请注意,elements
的数量在Python中并不常用,因为您可以简单地选择任意输入并split
。您可以针对len(array)
取消测试,只需将其解压缩到_, queries
。
答案 1 :(得分:1)
正如评论中所提到的,您可以通过首先在数字列表中创建set
来显着改善查找时间。但请注意,您实际上是在搜索字符串中的字符串!例如,在您的示例输入34 54 36
中,它还会为输入YES
或3
报告4 5
。您应该将两个输入都转换为int
。试试这个:
nums = set(map(int, r.split()))
for k in range(0, y):
if int(raw_input()) in nums:
print "YES"
else:
print "NO"
另请注意,您实际上并未使用数组中的" no元素"输入;不确定这对评分是否重要......