Javascript DFS+;备注:我如何分析时间和空间的复杂性

Javascript DFS+;备注:我如何分析时间和空间的复杂性,javascript,algorithm,big-o,depth-first-search,Javascript,Algorithm,Big O,Depth First Search,我一直在打磨leetcode,遇到了这个问题,我用JavaScript编写的DFS+备忘录解决了这个问题 如果没有备忘录,解决办法是 var canCross=函数(石头){ 常量递归=(索引,跳线大小)=>{ if(index==stones.length-1)返回true for(设i=index+1;i=跳线尺寸-1&&gap{ if(index==stones.length-1)返回true 常量键=`${index}${DELIMITER}${jumpSize}` if(cache.h

我一直在打磨leetcode,遇到了这个问题,我用JavaScript编写的DFS+备忘录解决了这个问题

如果没有备忘录,解决办法是

var canCross=函数(石头){
常量递归=(索引,跳线大小)=>{
if(index==stones.length-1)返回true
for(设i=index+1;i=跳线尺寸-1&&gap{
if(index==stones.length-1)返回true
常量键=`${index}${DELIMITER}${jumpSize}`
if(cache.has(key))返回cache.get(key)
for(设i=index+1;i=跳线尺寸-1&&gap简短回答
算法的上界是O(n2.5)

长话短说 对于每个
canCross()
函数调用,您要么立即从缓存返回一个值,要么执行
For循环
以启动递归调用以获得结果:

   ...
   if (recurse(i, gap)) {
      cache.set(key, true)
      return true
   }
   ...
在最坏的情况下(
recurse(i,gap)
总是
false
),对于给定的密钥(如果未缓存),您必须执行具有线性复杂度的
for循环
。反过来,您的键由索引和跳转大小组成。这意味着您必须至少执行
n
方法调用一个固定的跳转大小来缓存结果。这是O(n2)但不是这样。跳转大小也是可变的,但它可能永远不会
n/2
,这意味着要缓存的跳转大小不超过sqrt(n)。因此,最糟糕的时间复杂度是O(n2.5)。它甚至感觉可能是O(n2)因为一个完整的
for循环
将只对所有方法调用的一小部分运行,但我不知道如何证明它

由于映射可能最多有n1.5个唯一键,因此空间复杂度为O(n1.5)