小程序描述:输入两个倒排记录表,求两个倒排记录表的交集
跳表指针合并算法伪代码如下所示:
功能描述:
①运行程序,看到提示“请输入词项word1:”,输入某个倒排记录表的词项。
②运行程序,看到提示“请输入word1的倒排记录表(输入-1,停止输入倒排记录表):”时,输入①步骤词项的倒排记录表,当输入-1时停止输入此倒排记录表。
③运行程序,看到提示“请输入词项word2:”,输入某个倒排记录表的词项。
④运行程序,看到提示“请输入word2的倒排记录表(输入-1,停止输入倒排记录表):”时,输入③步骤词项的倒排记录表,当输入-1时停止输入此倒排记录表。
⑤运行程序,程序会分别对倒排记录表设置其步长,并遍历求解两个倒排记录表的交集。
小程序框架图如下图所示:
代码如下所示:
'''代码说明:基于跳表指针求两个倒排记录表的交集
输入词项的倒排记录表时,当输入-1时,停止输入其倒排记录表
'''
import math
#存储所有数据的字典
data = {}
#分别输入两个词项以及其对应的倒排记录表
#输入词项word1以及它的倒排记录表
word1 = input("请输入word1:")
id_1 = []
while 1:
a1 = int(input('请输入word1的倒排记录表:'))
if(a1 != -1):
id_1.append(a1)
else:
break
data[word1] = id_1
#输入词项word2以及它的倒排记录表
word2 = input('请输入word2:')
id_2 = []
while 1:
a2 = int(input("请输入word2的倒排记录表:"))
if(a2 != -1):
id_2.append(a2)
else:
break
data[word2] = id_2
#求两个词项的并集
#两个倒排记录表的长度
len1 = len(data[word1])
#词项word1倒排记录表需要设置的跳表指针的步长
n1 = math.ceil((pow(len1,0.5)))
len2 = len(data[word2])
#词项word2倒排记录表需要设置的跳表指针的步长
n2 = math.ceil((pow(len2,0.5)))
i = j = 0
result = []
count = 0
while i < len1 and j < len2:
if data[word1][i] == data[word2][j]:
result.append(data[word1][i])
i = i +1
j = j + 1
count = count + 1
elif data[word1][i] < data[word2][j]:
while (i + n1 < len1) and data[word1][i+n1] <= data[word2][j]:
i = i + n1
count = count + 1
else:
i = i + 1
count = count + 1
else:
while (j + n2 < len2) and data[word2][j+n2] <= data[word1][i]:
j = j + n2
count = count + 1
else:
j = j + 1
count = count + 1
print("倒排记录表的并集为:",result)
#print("跳转次数为:",count)