전체 (32)
알림... (4)
주저리... (10)
유용할만한(?) 정보 (0)
프로그래밍 (5)
게임 (0)
애니&만화 (1)
일상 (7)
ColorSwitch 00 01 02
▣  코딩최적화 - 해당되는 글 1건

뭐 인덱스트리의 기본적인 알고리즘은 스킵하도록 하고... 나중에 시간 있으면 알고리즘 강좌 올리면서 같이 올리던지...



보통 구현을 할때 바이너리트리로 구현을 하는데 구현하는게 해보면 꾀 귀찮고 추가메모리도 꾀 많이 잡아먹습니다 -.-;


여기 추가메모리를 전혀 사용하지 않고 바이너리인덱스트리보다 훨씬 빠르게 구현할수 있는 방법이 있습니다 !!

사용자 삽입 이미지

대충 구조를 그려보면 이렇습니다. 척 보기에도 트리가 훨씬 간결해 졌군요
잘 보시면 범위의 끝값(ex:1~8의 8)은 유일합니다. 그러므로 추가메모리가 들지 않죠..

Sum indexed-tree를 만들때 왼쪽과 오른쪽 모두 저장할 필요가 없다는 점에서 착안됀 것입니다. 3~4는 1~4에서 1~2를 빼면 돼니까요.
1~k 까지의 합을 구할려면 같은 높이의 왼쪽에 노드들을 모두 더하기만 하면 됍니다.


구현방법에는 아주 기가 막힌 방법이 있더군요...



이 알고리즘과 소스의 제공자는 "김원재"군(Arubirate) 이라고 밝힙니다...

void update(int val, int ix) { // ix에 val이 더한다
  do {
  tree[ix] += val;
  ix += ix&(-ix); // add least-sig one
  } while(ix<=N);
}

int get_sum(int ix) { // 1~ix에 있는 합을 구한다
  int res = tree[0];
while(ix>0) {
  res += tree[ix];
  ix &= (ix-1); // remove least-sig one
  }
  return res;
}

멋지지 않은가!! 아주 간단한 방법으로 구현시켰다..


저기 ix 의 변화부분에 대해 간략히 설명하자면

ix & (-ix)는 ix를 이진수로 표현했을때 마지막으로 나오는 1을 뽑습니다.
(6(110) 의 경우 2(010) )  그리고 이 값을 더하면 트리의 위로 올라갑니다.
ix & (ix-1)은 마지막으로 나오는 1을 지웁니다 ( 6(110)의 경우 4(100) )

뭐 직접 계산해보는게 좋을것 같군요...
(전 소스만 보고 이 과정을 연구한다고 죽는줄 ㅜㅜ)



이걸 응용하면 2차원의 인덱스트리도 빠르게 구할 수 있습니다


참고로 "김원재"군(Arubirate)은 이걸로 ioi기출문제이기도 한 pku1195 모바일을 6위로 풀어내었다고 합니다... 원본을 보고 싶으신분도 여기 들어가보시길...

Trackback Address :: http://isair.silpir.net/trackback/18
  1. BlogIcon 아루비 2007/01/19 09:26 수정/삭제 댓글에댓글달기

    진짜 강조해놨네 -_-;;

    그렇게 까지할꺼야 ㅎㅎ;;

    • BlogIcon 자유치 2007/01/22 14:35 수정/삭제

      난 다 까먹었다네 저거 -_-;;

  2. BlogIcon say no to sex 2008/03/13 02:58 수정/삭제 댓글에댓글달기

    너는 차가운 위치를 만들었다!

  3. BlogIcon 101 dog tip training 2008/03/13 06:33 수정/삭제 댓글에댓글달기

    여보세요, 아주 좋은 위치!

  4. BlogIcon cock cravers interracial 2008/03/13 07:25 수정/삭제 댓글에댓글달기

    위치에 중대한 일은 그것을 좋아했다!

  5. BlogIcon gun part 2008/03/13 08:06 수정/삭제 댓글에댓글달기

    좋은 위치는 그것 찾아본 즐겼다!

  6. BlogIcon dom fem male strap 2008/03/13 08:50 수정/삭제 댓글에댓글달기

    그런 경이롭 위치를 위해 많게의 감사!

  7. BlogIcon horse movies 2008/03/14 03:49 수정/삭제 댓글에댓글달기

    중대한 위치 축하!경이롭 위치!

  8. BlogIcon nude movie star 2008/05/23 04:37 수정/삭제 댓글에댓글달기

    너는 아름다운 웹사이트가 있는다!

  9. BlogIcon glamourmodelsgonebad 2008/05/23 05:11 수정/삭제 댓글에댓글달기

    여보세요, 좋은 아주 위치!

  10. BlogIcon nitro celeb 2008/05/23 05:43 수정/삭제 댓글에댓글달기

    걸출한 디자인! 좋은 디자인.

  11. BlogIcon simpson porn pics 2008/05/23 06:53 수정/삭제 댓글에댓글달기

    나의 너의 친구는 위치의 현재 팬이 되었다!

  12. BlogIcon porn video rss feed 2008/05/23 06:55 수정/삭제 댓글에댓글달기

    관심을 끌. 너가 좋을 동일할 지점을.

  13. BlogIcon bdsm slave collar 2008/05/23 07:37 수정/삭제 댓글에댓글달기

    이 위치는 아니라 유익한뿐 재미있는다!

  14. BlogIcon naked thirteen year olds 2008/05/24 01:39 수정/삭제 댓글에댓글달기

    걸출한 뉴스!! 종류 블로그!

  15. BlogIcon nystatin vaginal tablets 2008/05/24 01:56 수정/삭제 댓글에댓글달기

    우수한과 아주 도움이 되는!

  16. BlogIcon sex in norway 2008/05/24 03:03 수정/삭제 댓글에댓글달기

    아주 유용한 정보!

  17. BlogIcon pyrex company 2008/05/24 03:21 수정/삭제 댓글에댓글달기

    정말 같지 않는 블로그!










articles
recent replies
recent trackbacks
notice
BLOG main image
세상은 너무나 좁다 그렇기에...
6 28262
  rss skin by  m22m