Hard deck/일자별 방문

220830(화)

서버관리자 페페 2022. 8. 31. 14:21

 

int treeHeight = 0;
int length = N;
while (length != 0) {
    length /= 2;
    treeHeight++;
}

*주의 : length /= 2 는 2로 나눈 몫 보다는, 다음 번의 length는 이번 length를 반으로 나눈다는 뉘앙스

*주의 : 트리 배열은 우측 반쪽이 N의 공간이며, 트리 자체는 최하단 리프 우측 반쪽이 아닌 최하단 전부를 공간으로 사용하고 있다

 

-

트리 모양을 생각하되

최하단 리프 전체에 N이 들어가 있는 부분을 생각

 

그리고 아래에서 위로 움직이면서 높이를 계산할 것이다

 

-

N을 2로 나눌 수 있으면

트리에서 한 칸 씩 올라갈 수 있다는 말이고 높이가 1씩 더해진다는 것

 

이제부터 세밀한 부분

for 문에서 tree[i] 등을 projecting 하는 범위에서, < 이냐 <=, 0부터 시작하느냐 1부터 시작하느냐를 날카롭게 구분하는 법은 

어디서 시작하고 어디서 끝나는지, 그 influx structure 의 point를 잘 관찰하는 것에 달려있음

 

-

최하단 공간은 

N 뿐 아니라 N+a = 2^?로 나오도록 보정되어 있다

 

-

직전 length 값이 2 이상 4 미만이라 몫이 1이 되면

마지막에 노드, 즉 부모 노드에 도달했다는 뜻이므로 높이 계산은 종료된다

그런데 length가 0이 될때 종료이므로, 높이 하나의 단위를 더 가져간다

 

맨 

 

int treeSize = (int) Math.pow(2, treeHeight + 1);
int leftNodeStartIndex = treeSize / 2 - 1;
MOD = 1000000007;
tree = new long[treeSize + 1];