|
发表于 2023-8-14 12:31:10
|
显示全部楼层
这个问题涉及到如何优化查找过程的执行效率。首先,我们来解决源代码不能运行出结果的问题。
源代码中的问题在于,没有定义 find() 函数内的变量 haystack 和 needles 为全局变量。因此,在 find() 函数内部无法访问到这两个变量,导致无法进行查找操作。为了解决这个问题,我们需要将 haystack 和 needles 定义为全局变量。
修改后的代码如下:
- import random
- import timeit
- haystack = [random.randint(1, 10000000) for i in range(10000000)]
- needles = [random.randint(1, 1000) for i in range(1000)]
- def find():
- global haystack, needles
- found = 0
- for each in needles:
- if each in haystack:
- found += 1
- print(f"一共找到{found}个匹配。")
- t = timeit.timeit("find()", setup="from __main__ import find", number=1)
- print(f"查找过程一共消耗{t}秒。")
复制代码
接下来,我们来解决如何使得查找过程的执行效率提高10000倍以上的问题。
在原始代码中,使用了简单的线性查找算法,每次都遍历 haystack 来查找是否存在匹配的元素。这种算法的时间复杂度是O(n),其中n是 haystack 列表的长度。对于大规模的数据集,这种算法的效率较低。
为了提高查找的效率,我们可以使用更高效的数据结构,比如集合(Set)。集合是一种无序且不重复的数据结构,查找操作的时间复杂度是O(1)。我们可以将 haystack 转换为集合,然后使用集合的 intersection() 方法来查找与 needles 的交集。
修改后的代码如下:
- import random
- import timeit
- haystack = set(random.randint(1, 10000000) for i in range(10000000))
- needles = set(random.randint(1, 1000) for i in range(1000))
- def find():
- global haystack, needles
- found = len(haystack.intersection(needles))
- print(f"一共找到{found}个匹配。")
- t = timeit.timeit("find()", setup="from __main__ import find", number=1)
- print(f"查找过程一共消耗{t}秒。")
复制代码
通过将 haystack 和 needles 转换为集合,并使用集合的 intersection() 方法,我们可以大大提高查找过程的执行效率。这样的优化可以使执行时间缩短10000倍以上。 |
|