我觉得你已经走得很远了。我可以向您展示一个实现,但您已经描述了该算法,因此您自己实现它应该不难。但也许你对你的描述没有信心。
让我以缓慢而准确的方式重述您的描述,省略我们不需要的关于查询等的信息。我们有两个预先排序的列表,我们想找到它们的交集。用一个稍微完整的例子来调整你的图表,从 list a = [1, 4, 5, 7, 8]
、b = [5, 8, 9]
、i=0
和开始j=0
,以及一个空的输出列表out = []
,我最初将在图表中省略...
i = 0
a = 1 4 5 7 8
j = 0
b = 5 8 9
首先我们检查它们是否相等。它们不是,所以我们取 和 的a[i]
最小值b[j]
。在这种情况下,a[i] == 1
和b[j] == 5
,所以我们想要增加i
。
i = 1
a = 1 4 5 7 8
j = 0
b = 5 8 9
通过相同的步骤,我们i
再次递增:
i = 2
a = 1 4 5 7 8
j = 0
b = 5 8 9
现在情况不同了;a[i]
和b[j]
是相同的,所以我们想将该值附加到输出列表并增加两个值:
i = 3
a = 1 4 5 7 8
j = 1
b = 5 8 9
out = 5
现在我们继续。再次小于... a[i]
_b[j]
i = 4
a = 1 4 5 7 8
j = 1
b = 5 8 9
并且值是相同的,所以我们将该值添加到out
并递增i
和j
...
i = 5
a = 1 4 5 7 8
j = 2
b = 5 8 9
out = 5 8
但现在我们发现了i == len(a)
。所以我们知道算法已经终止。
现在我们拥有了确定我们需要哪些变量以及逻辑应该如何工作所需的一切。我们需要 list a
、 list b
、 index i
、 indexj
和 list out
。我们想创建一个在i == len(a)
或时停止的循环j == len(b)
,并且在该循环中,我们想测试a[i]
与 是否相等b[j]
。如果它们相等,我们将i
andj
和 appenda[i]
都递增out
。如果它们不相等,那么我们测试是否a[i] < b[j]
。如果是,那么我们增加i
; 否则,我们增加j
.
这决定了两个列表之间的交集;现在我们只需要将它应用于第一个和第二个列表,然后将结果应用于第三个列表,然后将结果应用于第四个,依此类推。