我在这里找到了另一个问题的答案How to count string occurrence in string? 所以我正在使用算法here,在对一些函数进行基准测试后,我想知道为什么向后循环比前进慢得多。
注意:下面的代码不能正常工作,有 其他工作(这不是这个问题的重点),请注意 在复制之前>粘贴它
转发
function occurrences(string, substring) {
var n = 0;
var c = 0;
var l = substring.length;
for (var i = 0, len = string.length; i < len; i++) {
if (string.charAt(i) == substring.charAt(c)) {
c++;
} else {
c = 0;
}
if (c == l) {
c = 0;
n++;
}
}
return n;
}
向后
function occurrences(string, substring) {
var n = 0;
var l = substring.length - 1;
var c = l;
for (i = string.length; i > 1; i--) {
if (string.charAt(i) == substring.charAt(c)) {
c--;
} else {
c = l;
}
if (c < 0) {
c = l;
n++;
}
}
return n;
}
答案 0 :(得分:4)
我认为向后测试有一个错误:
for (i = string.length; i > 1; i--) {
应该是
for (i = string.length - 1; i >= 0; i--) {
当i
为string.length
时,string.charAt(i)
未定义。这样做几千次,它可以产生很大的差异。
Here's a modified test似乎更接近相同的表现。
答案 1 :(得分:2)
当我这样做时
for (i = string.length; i > 1; i--) {
我意外地删除了var i
中的“var”,因此我将i
设为全局。
修好之后,我得到了预期的结果。
for (var i = string.length; i > 1; i--) {
我从不认为这可能是一个巨大的差异,所以要注意人。
PS:实际使用时,请勿使用此功能,indexOf版本要快得多。
答案 2 :(得分:0)
您正在测试哪些数据。如果您的数据有许多匹配的前缀,但反过来没有多少错误匹配,那可能会影响它。
对于像“aaabbaaa”这样的案件试图查找“aab”它会匹配aa然后失败,然后从第三个a继续并失败的那个搜索bug也不会。 ?
答案 3 :(得分:0)
因为它们不是完整的镜像函数,所以在两个函数的所有console.log()
和if
内添加else
并比较结果,您将看到测试不是公平。
你做错了什么。我建议在开始测试之前确保它们都按预期工作。