모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 오유인페이지
    개인차단 상태
    할말이있어님의
    개인페이지입니다
    가입 : 12-10-14
    방문 : 1004회
    닉네임변경 이력
    회원차단
    회원차단해제
    게시물ID : programmer_4880
    작성자 : 할말이있어
    추천 : 0
    조회수 : 435
    IP : 125.177.***.135
    댓글 : 3개
    등록시간 : 2014/08/07 16:17:49
    http://todayhumor.com/?programmer_4880 모바일
    시간여행을 위한 자료구조에 대해서...
    음 여기서 시간 여행이란 자료구조를 어느 순간이든 원하면 저장할 수 있어서 언제라도 그 상태로 돌아갈 수 있음을 말합니다.

    일단 논의에 쓰기 위해 다음과 같은 게임을 생각해 봅시다.
    NxN 개의 칸으로 이루어진 정사각형 판이 있고 각 칸에 돌을 여러개 놓을 수 있습니다. 유저는 다음과 같은 query들을 요청할 수 있게 됩니다
    PUT x y k   ( (x, y)에 k개의 돌을 더 놓아라) )
    SAVE  (현재 바둑판의 상태를 저장하라)
    LOAD n   (n번째로 저장했던 SAVE를 불러오기)

    그리고 query는 M개 들어온다고 합시다. query를 모두 처리한 후 당신의 프로그램은 지금의 판의 상태를 출력하고 끝내야 합니다....

    우선 N과 M의 크기는 신경쓰지 말고 가장 단순하게 위의 프로그램을 구현할 방법을 생각해봅시다.

    판을 BOARD 라는 자료구조로 표현했다고 할 때 다음과 같은 방법을 생각할 수 있습니다.
    CurrentBoard = 현재 다루고 있는 판.
    SAVELIST = BOARD들의 list. (C++에서는 vector, Python에서는 list 쯤으로 구현할 수 있겠군요)

    PUT => CurrentBoard 에 작업한다
    SAVE => CurrentBoard의 Copy를 만들어서 SAVELIST 뒤에 삽입한다.
    LOAD n  => SAVELIST[n] 을 CurrentBoard 으로 copy assign 한다.
    마지막엔 CurrentBoard를 출력

    CurrentBoard의 Copy를 SAVE해야만 하는 이유는 CurrentBoard를 가리키는 포인터 따위를 저장했다가는 CurrentBoard가 바뀌면 SAVE된 것도 바뀌기 때문이겠죠.. 현재가 바뀐다고 과거가 바뀌면 당연히 안될겁니다.

    아주 직관적이고 단순한 방법으로써 위의 프로그램을 구현하는데 하등 문제가 없습니다. 다만 메모리가 폭발하고 시간이 폭발하고 사회가 무너지고 가정이 무너지고... N이 1000쯤 되면 Copy던 Copy Assign이던 시간을 너무 잡아먹겠군요. 메모리도 물론 부족할겁니다.

    위의 방법의 SAVELIST 라는 구조는 생각해보면 1차원적인 구조라는 것을 쉽게 알 수 있습니다. 시간여행의 관점에서 본다면 Time Line 이 단 하나만 존재하는 세계가 되겠군요. 과거를 볼 수 있을 뿐 과거를 가져와서 바꾼다고 해도 그것은 오직 현재의 물체가 될 뿐이죠. 새로운 timeline이 생성되지는 않습니다. 단 하나의 우주만 존재하는거죠.
    제목 없음.png



    그와 비해 이번에 생각해볼 방법은 다중우주가 될겁니다. 과거로 가서 과거를 변경한다면 그 과거를 시점으로 해서 또다른 timeline이 생겨납니다. 여기서 우리의 자료구조가 Tree가 될것임을 느낄 수 있죠 (정말 Tree는 매번 불쑥 튀어나오네요)

    ss.png


    (네 그렇습니다 전 그림을 아주 못그립니다)

    판의 상태에 집중하지 말고 판에 가하는 변경(modification)에 집중해봅시다. 우리의 게임에서 변경을 위한 query는 PUT하나 밖에 없네요. 
    알아야 할 사실은 판의 상태는 사실 그 것에 가해진 변경들의 집합과 똑같다는 것입니다. 변경들을 판에 차례로 적용하기만 하면 언제든 의도된 상태를 만들어 낼 수 있으니까요. 그렇다면 변경들을 다루어 보죠.
    변경을 MOD라는 자료구조로 표현한다고 합시다. 변경들의 집합을 원소로 갖는 Tree Node 를 생각해봅시다.
    현재 작업하는 Node를 CurrentNode라고 합시다. 그럼 query 들을 다음과 같이 처리할 수 있습니다.

    PUT => CurrentNode의 MOD리스트에 추가한다.
    SAVE => 새로운 Node를 만들어서 CurrentNode의 자식으로 만들고 CurrentNode를 새로운 Node로 한다
    LOAD => CurrentNodes는 그냥 삭제해버리고 k  번째 Node로 가서 새로운 Node를 만들어서 자식으로 만들고 CurrentNode를 새로운 Node로 한다.

    (트리와 더불어 LOAD를 위해 k번째 Node가 어딨는지 저장해 놓을 필요가 있겠죠).

    마지막에 출력하기 위해 판의 상태를 알고 싶다면 다음과 같이 하면 되겠죠.
    (여기서 back은 자신의 부모를 가리키는 포인터입니다.)
    void walkup(board& b, node* n) {
        if(n==NULL) return;
        walkup(b, n->back);
        b.modify(n->q);
    }

    walkup(b, CurrentNode);

    1번 노드로 부터 현재 노드 까지의 경로를 밟으며 그 노드가 가지고 있는 변경들을 다 판에 가해주는 걸 하는 코드입니다.

    우리의 게임만 봐도 알겠지만 변경의 정보를 저장하는게 훨씬 메모리 소모가 적습니다. (10만x10만 개의 정수랑  x, y, k 세개의 정수를 비교해 봅시다)

    이제 공간적인 측면은 문제가 안되고 시간적인 측면만 해결하면 될텐데 저는 거기서 막혔네요.


    궁금한 사람들을 위해 원래 문제의 링크를 남김니다.

    1번쨰 방법을 적용했을 경우 30%의 데이터를 빠르게 처리했지만
    2번째 방법을 적용해도 놀랍게도 50%의 데이터 밖에 처리하지 못하네요.

    전 치과가봐야해서 이만 글을 줄입니다.



    이 게시물을 추천한 분들의 목록입니다.
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.

    번호 제 목 이름 날짜 조회 추천
    56
    뭔가 뿌듯 [3] 할말이있어 14/10/26 22:51 46 2
    55
    Windows밀고 Ubuntu 깔고 싶은데요.. [5] 할말이있어 14/10/16 15:31 47 0
    54
    먹을것인가......... [3] 할말이있어 14/10/13 22:50 37 0
    53
    낙성대야식츄천좀 [1] 할말이있어 14/10/13 22:43 39 0
    52
    아아코딩하고싶다 [4] 할말이있어 14/10/13 21:36 35 1
    51
    공대생의 윤리란 무엇인가 (시험준비용) [1] 할말이있어 14/10/06 13:11 37 2
    50
    혈변 [4] 할말이있어 14/10/01 15:58 67 0
    49
    C++ sort() vs qsort() [5] 할말이있어 14/09/29 18:59 42 0
    48
    전기회로에서 [1] 할말이있어 14/09/28 18:00 31 0
    47
    C++ n 개 원소중에 모든 m 쌍 뽑기 [14] 할말이있어 14/09/21 23:18 17 0
    46
    전문연구요원 [8] 할말이있어 14/09/21 21:31 32 0
    45
    전문연구요원 [3] 할말이있어 14/09/21 21:30 41 0
    44
    페이스북 탈퇴한지 몇달되어가는데 할말이있어 14/09/20 13:17 45 1
    43
    잠은안오고 [4] 할말이있어 14/09/20 03:55 37 0
    42
    C++ map [5] 할말이있어 14/09/17 22:59 35 0
    41
    C++ [2] 할말이있어 14/09/17 22:33 43 0
    40
    흥미로운 문제 하나 [12] 할말이있어 14/09/15 22:43 41 0
    39
    ->[] ? [6] 할말이있어 14/09/13 21:32 46 0
    38
    C++ 무거운 return [12] 할말이있어 14/09/13 20:18 61 1
    37
    C++ vector [2] 할말이있어 14/09/13 16:22 43 0
    36
    간단한 질문 [3] 할말이있어 14/09/13 01:38 42 0
    35
    1:1 최적화 문제 [9] 할말이있어 14/09/09 16:27 79 0
    34
    java class return 하는 method [22] 할말이있어 14/09/08 22:55 26 1
    33
    소수 예술 [8] 할말이있어 14/09/03 22:53 93 13
    32
    제일짧은코드 [14] 할말이있어 14/09/02 00:52 61 1
    31
    탑알리;; [6] 할말이있어 14/08/18 18:53 266 0
    시간여행을 위한 자료구조에 대해서... [3] 할말이있어 14/08/07 16:17 47 0
    29
    C++ class static variable 접근 [7] 할말이있어 14/08/07 14:08 37 0
    28
    정렬되지 않은 쌍의 개수 [10] 할말이있어 14/08/04 23:00 31 0
    27
    수학 질문 [4] 할말이있어 14/08/04 22:22 50 2
    [1] [2] [3] [4]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈