Javascript 同串优化

Javascript 同串优化,javascript,algorithm,Javascript,Algorithm,昨天我问了一个关于检查两个字符串是否相同的算法的问题。我写道: var isSame = function(a, b) { if (a.length !== b.length) return false; for (var i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } var isSame=函数(a,b){ 如果(a.length!==b.length

昨天我问了一个关于检查两个字符串是否相同的算法的问题。我写道:

var isSame = function(a, b) {
  if (a.length !== b.length) return false;

  for (var i = 0; i < a.length; i++) {
    if (a[i] !== b[i]) return false;
  }

  return true;
}
var isSame=函数(a,b){
如果(a.length!==b.length)返回false;
对于(变量i=0;i

但之后,一位面试官让我优化它。我没有这么做,因为我不明白我怎么能做到。我忘了问面试官答案,因为面试官很快就离开了。现在,我在网上也找不到怎么做。这是可能的吗?

在我看来很规范。您只需检查长度是否不同,然后检查每个字母


如果有一个散列函数,你可以比较两者。但无论哪种方式,它都不会让你避免触摸每个字符串的每一位。

那么
strA===strB
对于字符串来说就足够了

或者使用ES2015的
Object.is
(我认为这对字符串来说太过苛刻了)


在实践中,您显然只需要比较字符串。但是如果你问自己如何从算法的角度来改进,让我说你所做的是比较两个字符串最有效的方法(至少我认为是这样,我没有证明它)。 从实现的角度来看,您可以测试是否有助于加快代码的速度

使用循环展开,基本上可以将代码复制并粘贴到循环体中。这样可以减少比较(跳跃)。像这样使用它:

var isSame = function(a, b) {
   if (a.length !== b.length) return false;

   var unrollFactor = 5; // This is where you can play around to find better solutions
   var i = 0;

   for (i = 0; i < a.length - unrollFactor; i += unrollFactor) {
      if (a[i] !== b[i]) return false;
      if (a[i+1] !== b[i+1]) return false;
      if (a[i+2] !== b[i+2]) return false;
      if (a[i+3] !== b[i+3]) return false;
      if (a[i+4] !== b[i+4]) return false;
   }

   // If there is a rest, compare it:
   for (i = i-unrollFactor; i < a.length; i++) {
      if (a[i] !== b[i]) return false;
    }

   return true;
}
var isSame=函数(a,b){
如果(a.length!==b.length)返回false;
var unrollFactor=5;//在这里您可以找到更好的解决方案
var i=0;
对于(i=0;i

这只是理论上的。在实践中,我怀疑你是否真的需要javascript:)

@TagirValeev:显然,通过使用内置库,你不会在算法优化方面显示太多的信息,在什么意义上?为了表演?可读性?维护?如果您想优化以使其不爆炸,请首先检查
a
b
是否不为空或未定义我认为@Codor已经在那里提出了百万美元的问题!如果是为了性能,只需谷歌搜索strcmp算法节奏。如果是为了维护,请在其中添加一些注释和更好的变量名@是的<代码>函数isame(a,b){返回a==b;}
实际上,您不需要触摸每个字符串的每一位,OP也不需要。一旦发现差异,您就可以停止,而不必检查其余字符串。在最坏的情况下,您会发现字符串仅在最后一位存在差异。@Ridcully:但这里就是这种情况,因为
if
语句中的
返回false
。@WillemVanOnsem。正如我所说,OP并没有触及每一个字符串的每一位。这是否也适用于这一点<代码>变量a='Bar';var b=‘Bar’;var equal=对象。is(a,b)?当然可以,只需在浏览器开发人员控制台中尝试即可。
var isSame = function(a, b) {
   if (a.length !== b.length) return false;

   var unrollFactor = 5; // This is where you can play around to find better solutions
   var i = 0;

   for (i = 0; i < a.length - unrollFactor; i += unrollFactor) {
      if (a[i] !== b[i]) return false;
      if (a[i+1] !== b[i+1]) return false;
      if (a[i+2] !== b[i+2]) return false;
      if (a[i+3] !== b[i+3]) return false;
      if (a[i+4] !== b[i+4]) return false;
   }

   // If there is a rest, compare it:
   for (i = i-unrollFactor; i < a.length; i++) {
      if (a[i] !== b[i]) return false;
    }

   return true;
}