简介:我想用相应的 TEX 代码替换数学百科全书上大约 280,000 张数学公式的图像。为此,我将所有这些图像(或者更好的是:它们的 URL)分类到一个包含 100'000 个列表的列表中。
每个“子列表”都包含 url 字符串,这样子列表中的每个 url 都链接到同一个图像。该列表看起来像[["https://www.encyclopediaofmath.org/legacyimages/a/a130/a130010/a1300105.png", "https://www.encyclopediaofmath.org/legacyimages/a/a010/a010080/a01008021.png", ...], ["https://www.encyclopediaofmath.org/legacyimages/w/w130/w130080/w1300801.png", "https://www.encyclopediaofmath.org/legacyimages/w/w130/w130080/w130080211.png"], ...]
.
对于每个子列表,我已经(或仍在处理中)为该子列表的一个图像确定了相应的 TEX 代码。由于每个子列表中的图像都是相同的,我已经(或仍然)确定了整个列表中每个图像 url 的 TEX 代码。
现在我想用已知的 TEX 代码替换每篇文章中的图片(比如这篇文章) 。这导致我不得不在这个子列表列表中索引每篇文章的图像 URL。
我的问题:您是否知道比上述任务的列表列表更好的数据结构?
示例代码:
dups = [[i, i+1] for i in range(100000)]
for i in range(10000):
for j in range(100000):
if i in dups[j]:
print(f"Found number {i} in {j}-th list")
break
在上面的示例中,dups
是我的列表列表的简化版本(我使用数字而不是字符串。)如您所见,上述程序需要一些时间才能完成。我想改进 dups,以便可以更快地完成类似类型的索引。
备注 1:如果 dups 的长度为 n,则上述代码本质上会进行 1 + 2 + 3 + ... + n 次比较。这导致 n * (n+1)/2 次比较。由于在我的情况下 n = 100'000,这已经是很多比较了。
备注 2:一个明显的改进是将每个子列表转换为 Python 集合并考虑集合列表。但是,我的大多数子列表包含少于 3 张图像,所以我怀疑这会大大提高运行时间。
备注3:请注意,我几乎无法控制“传入”图像的顺序(基本上我必须遵循文章结构)并且我无法在列表列表中构建完整的顺序(因为我无法将子列表分开.) 因此,我还没有找到实现二进制搜索的方法。