首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单for循环循环与>>算子的区别

简单for循环循环与>>算子的区别
EN

Stack Overflow用户
提问于 2019-08-22 16:51:43
回答 3查看 146关注 0票数 4

我在vue.js中找到了这段代码。但是,使用snippet-1而不是snippet-2来编写模板重复有什么好处呢?

Snippet -1- Source

代码语言:javascript
复制
const repeat = (str, n) => {
    let res = ''
    while (n) {
      if (n % 2 === 1) res += str
      if (n > 1) str += str
      n >>= 1
    }
    return res
  }

代码片段-2

代码语言:javascript
复制
const repeat = (str, n) => {
  let res = ''
  while (n--) {
    res += str;
  }
  return res
}
EN

回答 3

Stack Overflow用户

发布于 2019-08-22 17:29:12

这是不同的迭代次数。

在第二个代码片段中,您有n迭代。但是在第一个代码片段中,您有大致的log n迭代。这意味着函数的复杂性从O(n)一直到O(log n),这对于巨大的n来说可能很重要。

它怎麽工作?作为一个开始,这里的逻辑以一种过于简单的方式进行了总结:如果我们将迭代次数减半,我们可以将添加到结果中的内容加倍。

所以>> 1的工作原理有点像integer division by 2。整数除法意味着对于5 / 2,结果是2。但这意味着我们错过了迭代!?

对于每个奇数,我们在将其加倍到结果之前添加当前字符串,因此在继续之前,我们可以在结果中保存该迭代的总和(当前字符串)。因此,知道我们的迭代是节省下来的,我们就以同样的方式向下迭代,每一步都将剩余的迭代减半,同时将我们很快添加到结果中的内容加倍。

通过这种重复,我们跳过了很多迭代,这是降低复杂性的关键。

对于n = 5

代码语言:javascript
复制
1 'str: ' 'kk' 'res: ' 'k'
2 'str: ' 'kkkk' 'res: ' 'k'
3 'str: ' 'kkkk' 'res: ' 'kkkkk'

对于n = 10

代码语言:javascript
复制
1 'str: ' 'kk' 'res: ' ''
2 'str: ' 'kkkk' 'res: ' 'kk'
3 'str: ' 'kkkkkkkk' 'res: ' 'kk'
4 'str: ' 'kkkkkkkk' 'res: ' 'kkkkkkkkkk'

对于n = 11

代码语言:javascript
复制
1 'str: ' 'kk' 'res: ' 'k'
2 'str: ' 'kkkk' 'res: ' 'kkk'
3 'str: ' 'kkkkkkkk' 'res: ' 'kkk'
4 'str: ' 'kkkkkkkk' 'res: ' 'kkkkkkkkkkk'
票数 4
EN

Stack Overflow用户

发布于 2019-08-22 17:36:59

Javascript中的字符串连接具有连接性( historically created a lot of discussion ),多年来已经尝试了许多方法(平面连接、字符串数组连接等)。

看看how the method is actually used,我们可以看到它被进一步包装在一个循环中:

代码语言:javascript
复制
tree.map((vm, i) => `${
    i === 0 ? '---> ' : repeat(' ', 5 + i * 2)
}...`

这意味着任何性能差异都会被进一步放大。

考虑到在高迭代次数时性能差异很大,在这方面选择性能而不是可读性似乎是合理的:

票数 1
EN

Stack Overflow用户

发布于 2019-08-22 17:23:57

它真的会更快

can see here

代码语言:javascript
复制
const takeTime = (f,...arg) => {
  const st = Date.now()
  const result = f(...arg)
  const et = Date.now()
  return {time: et - st, result}
}

console.log(takeTime(repeat1.bind(null,"string",1000000)))
console.log(takeTime(repeat2.bind(null,"string",1000000)))

在这个例子中,我在chrome 76中有100毫秒的差异。

谢谢你!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57605505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档