一尘不染

优化算法以比较两个URL的模板

algorithm

编辑,请再读一次,因为我添加了我的一些工作

我的任务是比较两个URL的模板。我已经准备好算法。但是,给出最终答案需要花费太多时间。

我使用 JsoupSeleniumJava 编写了代码

在这里, 模板 是指任何页面呈现其内容的方式。

例:-

任何购物网站上都有任何鞋子的页面,其中包含,

Images in the left.
Price and Size in the right.
Reviews in the bottom.

如果两个URL属于任何特定产品,则返回“两者均来自同一模板”。例如,此链接此链接具有相同的模板。

如果一个URL显示任何产品,而另一个URL显示任何类别,则显示“没有匹配项”。例如,此链接此链接来自不同的模板。

我认为该算法需要一些优化,这就是为什么我要在此论坛中发布此问题。

我的算法

  1. 提取,解析两个输入URL并制作其DOM树
  2. 然后,如果任何页面包含,UL和TABLE,则删除该标签。我这样做是因为,可能两个页面包含不同数量的项目。
  3. 然后,我计算两个URLS中的标签数量。例如initial_tag1,initial_tag2。
  4. 然后,如果该树的节点数少于10,则开始删除在相应页面上具有相同位置,具有相同ID的标记及其下层子树。
  5. 然后,如果该树的节点数少于10,则我开始删除在coresponding页面上具有相同位置,相同的Class名称及其下面的子树的标记。
  6. 然后,如果该树的节点数少于10,则开始删除没有Id和No类名的标签及其下层子树。
  7. 步骤4、5、6具有(N * N)复杂度。在这里,N是标签数。[这样,DOM树的每一步都会收缩]
  8. 从此递归中得出结果时,我将检查final_tag1和final_tag2。
  9. 如果final_tag1和final_tag2小于initial_tag1 (0.2)和initial_tag2 (0.2),那么我 可以 这样说Two URL matched,否则not

我对此算法有很多想法,并且发现从DOM树中删除节点是一个非常缓慢的过程。这可能是减慢该算法的罪魁祸首。

我从一些极客那里讨论了

他们说,对每个标记使用分数而不是将其删除,然后将其添加,然后在末尾返回(分数I
Got)/(accumulatedPoints)或类似的值,然后在此基础上,您确定两个URL相似或不。

但是我不明白这一点。因此,您可以解释一些极客的说法,还是可以给出任何其他优化的算法来有效解决此问题。

提前致谢。寻找您的友好回应。


阅读 197

收藏
2020-07-28

共1个答案

一尘不染

为了提高算法的复杂性,假设您正在使用Jsoup,则必须使数据结构适应算法。

4)标签的位置是什么意思?标签的Xpath?如果是,则为每个标签O(n)预先计算一次该值,并将该值存储在每个节点中。如果需要,您也可以将其存储在HashMap中以在O(1)中进行检索。

5)使用MultiMap按类别名称标记您的索引。您将节省大量计算

6)没有ID,没有类名的索引类

所有这些预计算都可以在树的一次遍历中执行,因此O(n)。

通常,如果要减少计算量,则必须在内存中存储更多数据。由于DOM页面是非常小的数据,因此在您的情况下这不是问题。

2020-07-28