>source

문제 : MXN 그리드의 왼쪽 상단 모서리에서 바로 오른쪽 모서리에서 오른쪽 아래 모서리에서 오른쪽 아래로 또는 오른쪽으로 이동할 수 있습니다.

여기에 내가 작성한 두 가지 알고리즘이 있습니다. 결과는 괜찮아 보이지만 시간과 우주 복잡성을 알아낼 수는 없지만, 복잡성이 무엇인지에 대해 추측하지만 "적절한"방식으로 그들을 증명할 수는 없습니다.


순진 알고리즘 :

function gridTravel(m, n) {
      if(m<1 || n<1) return 0;
      if (m=== 1 || n=== 1) return 1;
      return gridTravel(m-1, n) + gridTravel(m, n-1);
    };
    console.log(gridTravel(10,10));

내 추측 :

  • 공간 복잡성 -O (n + m)? 가장 긴 가능한 통화 스택은 "선형 적으로"라고 확장 한 것처럼 보입니다. 그래서 그것은 o (n + m) 일 것입니다. 그러나 실제로 그것을 증명하거나 그것을 반증 할 수는 없습니다.
  • 시간 복잡성은 각 위치가 2 개의 새로운 위치를 만들 수 있기 때문에 -O (2 ^ N) 또는 O (2 ^ N + M), 확실하지 않은 확실하지 않기 때문에 지수입니다.

               m:n
        m-1:n                m:n-1
    m-2:n  m-1:n-1     m-1:n-1   m:n-2

그러나 다시, 나는이 설명에 자신감을 느끼지 않기 때문에, 그것은 처음에는 그대로 보이는 것처럼 보이기 때문입니다.


순진한 알고색 + 메모 화 :


    seenGrids= {};
    const gridTravel= (m, n)=> {
      if(m<1 || n<1) return 0;
      if (m=== 1 || n=== 1) return 1;
      if (`${m}:${n}` in seenGrids || `${n}:${m}` in seenGrids) {
        return seenGrids[`${m}:${n}`] || seenGrids[`${n}:${m}`];
      }
      seenGrids[`${m}:${n}`]= gridTravel(m-1, n) + gridTravel(m, n-1);
      return seenGrids[`${m}:${n}`];
    };

내 추측 :

  • space -o (n * m)? Call Stack은 여전히 ​​선형 인 것 같지만 이제는이 성장하는 물체가 있습니다.흔들림내 직감을 바탕으로 한번의 직감은 2 차 방식으로 일종을 확장해야합니까? 나는 그것을 증명하거나 그것을 싫어하는 방법을 모른다.console.log (object.keys (seengrids) .length)~을위한200x200.그리드19900 년어느 것이 아닙니다m * n.또는M + N.이렇게 선형이거나 2 차입니까?
  • 시간 -o (n * m)? -내 머리를 감싸는 것이 가장 힘들어. 많은 하위 트리가 저장된 답변으로 많은 하위 트리가 건너 뛰기 때문에 더 이상 지수가되어서는 안됩니다. 그러나 "적절한"방식으로 시간의 복잡성을 파생시키는 방법은 모릅니다.
  • 답변 # 1

    첫 번째 알고리즘 :

    시간 복잡성을 위해 가장 쉬운 증명은 귀하의 방법입니다! 나는 재귀 함수의 계산 트리를 의미합니다. 볼 수 있듯이 확장을위한 이진 트리가 있으며 트리의 최대 길이는최소 (n, m)...에 따라서 시간의 복잡도가 있습니다o (2 ^ (min (m, n)))...에

    공간 복잡성에 대해서는 언급했듯이 스택의 계산은 깊이 첫 번째 방식으로 수행됩니다. 따라서 각 노드의 최대 분기가 2이고 트리의 최대 길이는최소 (m, n)(이전 단락에서 논의 된 바와 같이, 공간 복잡성은2 분 (m, n)...에

    두 번째 알고리즘 :

    입력의 최대 다른 조합으로M * N.([1, 2, ..., m] 및 [1, 2, ..., n] 각각의 첫 번째와 두 번째 입력과 스택 호출의 최악의 경우가 있습니다.o (min (m, n)), 공간 복잡성은o (m * n)메모리 배열의 크기입니다.

    시간 복잡성을 위해, 우리는 배열의 각 요소가 한 번만 계산 될 수 있도록 할 수 있습니다 (암기 된 것처럼). 따라서 재귀 콜백의 복잡성과 무관하고, 재귀의 첫 번째 컴퓨팅으로 인해 (상향식으로부터), 두 번째 알고리즘의 시간 복잡도가o (m * n)...에

    스택의 크기가 Navie Algo에서 지수가 될 것입니다. 내가 시각화하는 방식, 그것은 나무의 왼쪽 지점을 따라 가고 잎에 도착하면 잎이 튀어 나오는 잎에서 팝을 반환 한 다음 그 잎의 부모로 돌아가서 올바른 자녀로 가서 반복합니다. ...에 그래서 내 pov에서 우리는 실제로 통화 스택을 만들지 않으므로 모든 가능한 통화를 계속해서 팝업으로 팝업합니다. leafs 나는 다른 통화로 분기하지 않는 "노드"를 의미하지만 대신 값을 즉시 반환합니다.

    hdw32021-09-18 08:33:11

    @ hdw3 당신은 확실히 당신입니다. 제가 실수를! 업데이트되었습니다.

    OmG2021-09-18 08:33:11
  • 이전 c++ : STD :: 함수가 기능 템플릿으로 작동하지 않는 이유는 무엇입니까?
  • 다음 java : 주어진 조건을 만족하는 배열의 하위 집합의 수를 최적으로 찾는 방법은 무엇입니까?