我的任务是比较两个html页面'内容,如他们彼此之间的差异。根据差异,我的意思是两者有多少不同/相同w.r.t. div
s,img
s,内容和其他标记(用户可以直观地解释所有差异。如果您要比较两个html页面以购买产品,那么购买流程有3个步骤。我比较step2(信用卡信息)和step3(Checkout / Confirmation页面),然后几乎所有两个页面的购买面板之外的内容都相同,但内部所有内容都不同。因此用户可以直观地解释两个页面都不同)。
为此,我使用了Levenshtein距离,代码低于
/**
* The method levenshteinDistance() is use to calculate the distance between
* two strings
*
* @param lhs
* first string
* @param rhs
* secont sreing
* @return distance
*/
public static int levenshteinDistance(CharSequence lhs, CharSequence rhs) {
int len0 = lhs.length() + 1;
int len1 = rhs.length() + 1;
// the array of distances
int[] cost = new int[len0];
int[] newcost = new int[len0];
// initial cost of skipping prefix in String s0
for (int i = 0; i < len0; i++)
cost[i] = i;
// dynamically computing the array of distances
// transformation cost for each letter in s1
for (int j = 1; j < len1; j++) {
// initial cost of skipping prefix in String s1
newcost[0] = j;
// transformation cost for each letter in s0
for (int i = 1; i < len0; i++) {
// matching current letters in both strings
int match = (lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1;
// computing cost for each transformation
int cost_replace = cost[i - 1] + match;
int cost_insert = cost[i] + 1;
int cost_delete = newcost[i - 1] + 1;
// keep minimum cost
newcost[i] = Math.min(Math.min(cost_insert, cost_delete), cost_replace);
}
// swap cost/newcost arrays
int[] swap = cost;
cost = newcost;
newcost = swap;
}
// the distance is the cost for transforming all letters in both strings
return cost[len0 - 1];
}
问题
1) Levenshtein距离是比较两个大 html页面的正确方法吗?
1.1)如果是,则有时字符串长度大于120000个字符。在这一点上,Levenshtein距离消耗了太多资源,有时它会暂停其他进程/ tomcat-server几分钟。 Levenshtein再一次是一种比较两个大 html页面的正确方法吗?
1.2)如果没有那么建议我一个好的/有效的算法来比较这些大 html页面。
P.S:我使用Java 8和tomcat 8作为服务器。
答案 0 :(得分:0)
如果你想知道“用户可以在视觉上解释的所有差异”方面的差异,我认为比较代码(html)来提取差异是不合逻辑的。因为视觉上相同的部分可能来自不同的代码,所以它对你来说是误报。
我可以通过屏幕截图比较来查看视觉差异。