优化大输入程序

时间:2015-06-12 14:33:49

标签: python algorithm python-2.7

考虑一下:

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 arrayno of queries

第二行是array

第三个是query,它只询问元素是否在array中。如果它是打印YES其他NO。 这是一个非常简单的程序。但问题是当我使用1000010000查询数组运行时,程序会在其中一个站点上超出时间限制。

问题是我可以在此优化什么?

解决方案1,我认为它引入了binary search,但需要sorting,即使使用最快,即快速排序,也需要nlogn

任何想法????

2 个答案:

答案 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中,它还会为输入YES3报告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元素"输入;不确定这对评分是否重要......