【问题标题】:Compare DB row values efficiently有效地比较数据库行值
【发布时间】:2010-03-11 15:32:54
【问题描述】:

我想遍历文档数据库并计算成对比较分数。

一个简单的、天真的方法会将一个循环嵌套在另一个循环中。这将导致程序比较文档两次,并将每个文档与其自身进行比较。

是否有有效执行此任务的算法名称? 这种方法有名称吗?

谢谢。

【问题讨论】:

    标签: python mysql database logic


    【解决方案1】:

    假设所有项目都有一个编号 ItemNumber

    简单的解决方案——总是让第二个元素的 ItemNumber 大于第一个元素。

    例如

    for (firstitem = 1 to maxitemnumber)
      for (seconditem = firstitemnumber+1 to maxitemnumber)
        compare(firstitem, seconditem)
    

    视觉说明:如果您将比较视为一个矩阵(一个轴上的项目编号,另一个轴上的另一个项目),则会查看其中一个三角形。

    ........
    x.......
    xx......
    xxx.....
    xxxx....
    xxxxx...
    xxxxxx..
    xxxxxxx.
    

    【讨论】:

    • 我也想过,但也许 OP 不想更改模型类。
    • @Felix :酷...告诉我你的意思是什么?模型课?那到底是什么?
    • 好吧,我假设 OP 以某种方式使用一个类来表示文档(模型)(也许他使用了 ORM)。但我刚刚意识到这很容易用列表索引来完成。首先,我认为您的意思是使文件具有可比性。我仍然认为你可以提供一个更好的例子;)。不过没关系。
    • @Felix :我明白了,您正在为集合作为操作实施解决方案。到具有唯一项目编号的数组/集合。您的解决方案当然是使用套装的方法。很少有数组没有底层唯一索引,但它可能会发生——主要是使用函数式语言和非关系数据库。
    【解决方案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 是一个明显的选择 - 但是你没有说你的比较指标是什么是。

    C.

    【讨论】:

      【解决方案3】:

      您可以跟踪已比较过的文档,例如(带数字;))

      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])
      

      【讨论】:

      • 我的解决方案要快得多。没有这对东西的开销。
      • 这个实现不是把复杂度从 n^2 变成 n^3 吗?您不仅有嵌套循环,而且“未比较的对”是一个 O(n) 操作。有更简单/更有效的实现。但似乎@seanieb 很满意。
      • @Traveling Tech Guy:没错,我从列表更改为setfrozenset。我认为,一个集合可以访问 O(1),因为它是作为字典键实现的。
      【解决方案4】:

      这样的?

      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:]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多