我想循环浏览文档数据库并计算成对比较得分。
一个简单的,天真的方法会将循环嵌套在另一个循环中。这将导致程序两次比较文档,并将每个文档与自身进行比较。
有效执行此任务的算法是否有名称? 这种方法有名字吗?
感谢。
答案 0 :(得分:3)
假设所有项目都有一个数字ItemNumber
简单的解决方案 - 始终让第二个元素的ItemNumber大于第一个项目。
例如
for (firstitem = 1 to maxitemnumber)
for (seconditem = firstitemnumber+1 to maxitemnumber)
compare(firstitem, seconditem)
视觉注释:如果您将比较视为一个矩阵(另一个轴上另一个轴项目的项目编号),则会查看其中一个三角形。
........
x.......
xx......
xxx.....
xxxx....
xxxxx...
xxxxxx..
xxxxxxx.
答案 1 :(得分:2)
我认为它不够复杂,无法获得名称。
您可以通过强制对不同行之间可能不同的任何值进行比较来避免重复对 - 主键是一个明显的选择,例如。
独特的配对:
SELECT a.item as a_item, b.item as b_item
FROM table AS a, table AS b
WHERE a.id<b.id
可能有很多方法可以使用比较操作来生成数据总结并因此识别可能类似的项目 - 对于单个单词soundex是一个明显的选择 - 但是你没有说明你的比较指标是
下进行。
答案 2 :(得分:0)
您可以跟踪已比较的文档,例如: (带数字;))
compared = set()
for i in [1,2,3]:
for j in [1,2,3]:
pair = frozenset((i,j))
if i != k and pair not in compared:
compare.add(pair)
compare(i,j)
另一个想法是首先创建文档组合并迭代它们。但是为了生成这个,你必须遍历两个列表,然后再次遍历结果列表,所以我认为它没有任何优势。
<强>更新强>:
如果您已将文档列入清单,那么Hogan的答案确实更好。但我认为它需要一个更好的例子:
docs = [1,2,3]
l = len(docs)
for i in range(l):
for j in range(i+1,l):
compare(l[i],l[j])
答案 3 :(得分:0)
这样的东西?
src = [1,2,3]
for i, x in enumerate(src):
for y in src[i:]:
compare(x, y)
或者您可能希望生成一对配对列表:
pairs = [(x, y) for i, x in enumerate(src) for y in src[i:]]