모바일 오유 바로가기
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도쿄올림픽
  • 게시판찾기
  • 오유인페이지
    개인차단 상태
    ColaKola님의
    개인페이지입니다
    가입 : 15-05-31
    방문 : 17회
    닉네임변경 이력
    회원차단
    회원차단해제
    게시물ID : programmer_18807
    작성자 : ColaKola
    추천 : 0
    조회수 : 637
    IP : 108.168.***.164
    댓글 : 13개
    등록시간 : 2016/10/24 10:36:34
    http://todayhumor.com/?programmer_18807 모바일
    Minimum Spanning Tree 찾는 알고리즘 조언좀 해주실분?
    <font size="5">Q. 2차원 좌표(x,y)에서 반지름이 1인 원 ((0,0) 기준) 안에서 V개의 랜덤한 point를 생성한 후에, 그 V개를 완전 그래프로 만듭니다.</font> <div><font size="5">(complete graph: 모든 vertexes 가 서로 연결되어 있습니다. )</font></div> <div><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Complete_graph_K5.svg/200px-Complete_graph_K5.svg.png" alt="완전그래프에 대한 이미지 검색결과" style="font-size:9pt;"><font size="5"> </font><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Minimum_spanning_tree.svg/300px-Minimum_spanning_tree.svg.png" alt="mst in graph에 대한 이미지 검색결과" style="font-size:9pt;" filesize="20234"></div> <div><font size="5"><br></font></div> <div><font size="5">아시는 분들은 다 아시겠지만, 왼쪽 그림이 완전 그래프 입니다. 이 완전 그래프에서 MST (Minimum Spanning Tree, 오른쪽 그림)를 찾는것이 문제입니다..</font></div> <div><br></div> <div><font size="5">뭐 간단하게 인접 행렬 또는 리스트 만들어서 거기에 대한 Prim's algorithm을 적용하면 구해지긴 합니다만, 문제는 vertex 개수인 V가 많이 커지게 된다면, (|V| > 30000~ 50000) Memory 문제때문에 인접 행렬 구성은 포기하게 되는 실정입니다. (왜냐면 완전 그래프라 |V|^2 크기의 행렬이 필요합니다.)</font></div> <div><font size="5"><br></font></div> <div><font size="5">근데 이 문제가 좀 웃긴게, vertex 사이의 weight 가 주어지는것이 아닌 직접 point를 random하게 뽑고 (반지름이 1인 원 안에서) 그리고 그 사이의 거리를 알아서 구한뒤에 MST의 크기 (MST의 모든 edges 값)을 구하는 것입니다.</font></div> <div><br></div> <div><font size="5">그래서 제가 고안해 낸 <b>알고리즘</b>은 다음과 같습니다,</font></div> <div><font size="5">1. 1차원 자료형에 Pair 형으로 모든 point(x,y)를 생성해서 담는다. 이것을 basket이라 부른다.</font></div> <div><font size="5"><br></font></div> <div><font size="5">2. HashMap 형태로 <Pair Point, Value> 형으로 '1'에서 생성해낸 point를 다시 담아낸다. (Ex. <Point(x,y), Inf> ) 이것을 Graph라 부른다. 여기서 Value는 그 Point로 가기위한 최소 비용을 의미한다.</font></div> <div><font size="5"><br></font></div> <div><font size="5">3. basket에서 랜덤하게 하나를 뽑아서 시작 포인트를 정한다. </font></div> <div><font size="5">3-1. 그 point에 속하는 Graph의 Value는 0으로 만든다. </font></div> <div><font size="5">3-2. basket에서 뽑은 Point는 삭제한다.</font></div> <div><br></div> <div><font size="5">4. (이미 뽑은) 포인트에서 basket에 담겨져 있는 모든 포인트를 하나씩 꺼내봐서 길이를 잰다, (sqrt((x-x1)^2+(y-y1)^2)). 그 길이가 Graph에 담겨져 있는 해당 Value보다 작다면, 바꿔준다.</font></div> <div><span style="font-size:x-large;"><br></span></div> <div><span style="font-size:x-large;">5. 모든 포인트를 둘러보면서 가장 작은 Value를 가진 Point를 basket에서 뽑는다. (사실 말만 뽑는거지 이미 4에서 계속 비교하면서 Point를 찾음)</span></div> <div><span style="font-size:x-large;"><br></span></div> <div><span style="font-size:x-large;">6. basket에서 뽑은 Point는 삭제한다.</span></div> <div><font size="5">6-1. Point의 value는 결과 값(MST Cost)에 더해진다.</font></div> <div><br></div> <div><font size="5">7. basket에 있는 Point가 모두 없어질때까지 (4-6)을 반복한다.</font></div> <div><font size="5"><br></font></div> <div><font size="5">8. 결과 출력</font></div> <div><font size="5">--------------------------------------------------</font></div> <div><font size="5">이런식으로 알고리즘을 만들고 돌리게되면 V가 50000일때 200초 정도가 나옵니다. 그런데 60초 미만으로 가능하다는 얘기를 들어서, 지금도 고민하고 있습니다. </font></div> <div><font size="5"> 아무리 생각해도 완전 그래프이기때문에 모든 edges들을 하나씩 다 봐줘야 합니다. 그나마 최소한으로 줄일 수 있는것이 (4-6)반복 마다, basket에 있는 Point를 하나씩 없얘주기 때문에 (4-6)이 |V|^2 반복이 아닌, |V|* (|V-1|+|V-2|....+|1|) 입니다.</font></div> <div><font size="5"> 여기서 좀더 발전할 수 있는 여지는 없을까요? </font></div> <div><font size="5"><br></font></div> <div><font size="5">아래의 코드는 제가 만든 (4-6)의 부분입니다. 혹시 제 설명이 이해가 안가시면 코드가 더 편하실수도,,</font></div> <div><pre style="background-color:#272822;color:#f8f8f2;font-family:'Courier New';font-size:11.4pt;"><span style="color:#66d9ef;font-style:italic;">while</span>(repeat)<span style="color:#f92672;">:<br></span><span style="color:#f92672;"> </span>repeat <span style="color:#f92672;">-= </span><span style="color:#ae81ff;">1<br></span><span style="color:#ae81ff;"> </span>min <span style="color:#f92672;">= </span><span style="color:#ae81ff;">100<br></span><span style="color:#ae81ff;"> </span><span style="color:#66d9ef;font-style:italic;">for </span>(x,y) <span style="color:#66d9ef;font-style:italic;">in </span>basket<span style="color:#f92672;">:<br></span><span style="color:#f92672;"> </span><span style="color:#75715e;">#Distance between two nodes is the euclidean distance between the points<br></span><span style="color:#75715e;"> </span>k <span style="color:#f92672;">= </span>math.fabs( (verx<span style="color:#f92672;">- </span>x ) <span style="color:#f92672;">+ </span>(very<span style="color:#f92672;">-</span>y) )<br><span style="color:#66d9ef;font-style:italic;"> if </span>graph[x,y] <span style="color:#f92672;">> </span>k<span style="color:#f92672;">: </span><span style="color:#75715e;">#update weight of vertex if searched way is cheaper.<br></span><span style="color:#75715e;"> </span>graph[x,y]<span style="color:#f92672;">= </span>k<br><span style="color:#66d9ef;font-style:italic;"> if </span>min <span style="color:#f92672;">> </span>graph[x,y]<span style="color:#f92672;">: </span><span style="color:#75715e;">#get the vertex having minimum weight among the adjacent MST.<br></span><span style="color:#75715e;"> </span>min <span style="color:#f92672;">= </span>graph[x,y]<br><span style="background-color:#472c47;"> minIndex</span> <span style="color:#f92672;">= </span>(x,y)<br><span style="color:#66d9ef;font-style:italic;"> if </span>min <span style="color:#66d9ef;font-style:italic;">is </span><span style="color:#ae81ff;">100</span><span style="color:#f92672;">:<br></span><span style="color:#f92672;"> </span><span style="color:#66d9ef;font-style:italic;">break<br></span><span style="color:#66d9ef;font-style:italic;"> else</span><span style="color:#f92672;">:<br></span><span style="color:#f92672;"> </span>result <span style="color:#f92672;">+= </span>min<br> basket.remove(<span style="background-color:#3c3c57;">minIndex</span>)<br> (verx, very) <span style="color:#f92672;">= </span><span style="background-color:#3c3c57;">minIndex</span></pre></div> <div><br></div> <div><br></div> <div><font size="5"><br></font></div> <div><br></div>

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

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

    번호 제 목 이름 날짜 조회 추천
    8
    이별후에 공부하기 너무 힘드네요,, [7] 외부펌금지 ColaKola 17/03/07 20:59 140 2
    7
    전 여자친구가 다시 연락이 왔어요 [2] 외부펌금지 ColaKola 17/02/20 09:04 336 2
    5
    전 여자친구에게 어떻게 하는게 최선일까요.. [3] 외부펌금지 ColaKola 17/02/07 03:12 157 0
    Minimum Spanning Tree 찾는 알고리즘 조언좀 해주실분? [14] ColaKola 16/10/24 10:36 48 0
    2
    유럽으로 배낭여행을 가려하는데.. 고민되네요.. [4] ColaKola 15/05/31 11:18 70 0
    1
    유럽으로 해외여행을 가려고 하는데 고민되네요.. [12] ColaKola 15/05/31 11:14 46 0
    [1]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈