알고리즘 12

정렬, 검색 알고리즘에서 꼭 한 번 해볼 과제

STL에서 사용하는 정렬(stable, non-stable 둘 다) 구현해 볼 것 검색 중 실제로 B트리와 레드블랙트리 구현할 실제로 써봄직한 예제를 직접 만들고 성능을 테스트해 볼 것 참고) B트리의 경우 외부검색방식으로(하드디스크에서 파일 오픈) 구현 B+트리 구현해 볼 것 검색 알고리즘 관련해서는 스킬의 날카로운 향상을 위해,,, C / C++ 모든 버전으로 작성해 볼 것

레드블랙트리(RB Tree) 정리 및 분석

이진 검색 트리의 경우 인서트시 오름차순이나 내림차순으로 넣으면 우측자식으로만 혹은 좌측자식으로만 계속 자라는 편향적인 구조가 되버린다. 이것은 트리의 깊이가 집어 넣는 개수만큼 계속 깊어지므로 결국 순차검색(Sequence Search)과 다름없는 최악의 결과가 된다. 순차적으로 집어넣는 경우는 일상적으로도 아주 많을 것이다. 그러므로 이런 삽입과 삭제시 밸런스를 맞추는 알고리즘에 대한 연구가 많이 진행되었다. 레드블랙트리는 밸런스 트리의 대명사인 B트리에서 차원이 3인 경우와 이론적 구조가 같다. 다만 이진트리는 각 노드에 요소가 한개밖에 들어갈 수 없으므로 이를 레드와 블랙이라는 논리적인 요소를 도입함으로써 이진트리의 형식으로 구현한 것이다. 실제로도 B트리나 2-3-4트리 다음에 등장한 이론으로 ..

B트리 삽입, 삭제 도식화와 좀 특이한 방식 분석

위 파일은 인터넷서 얻은 도식화 파일이다. 그림으로 설명이 참 깔끔하게 잘 된듯 하다. 참조... http://swblog.net/entry/B-Tree B트리의 처리 방식은 제각각인 듯 하다. B트리의 원칙만 잘 지키면 되는 듯 하다. 삽입의 경우 좀 특이하게 처리했던 경우는(이재규 알고리즘 강좌) 일단 위에서부터 아예 포화상태에 놓인 경우(5차원시 노드에 5개 요소가 있는경우) 먼저 분할시키면서 아래로 내려와서 마침내 들어갈 자리를 찾으면 해당 노드에 요소를 삽입하는 방식이다. 이때문에 해당 노드에서 분할시에 부모가 오버플로우될 상황은 없다.(부모노드 요소의 갯수는 모두 4개 이하이므로) 다른 방식은 위 도식화에서 표현하듯이 저질러놓고 수습하는 방식인 데 이게 일반적인 경우인 듯 하다. 일단 해당 값..

이분 검색(Binary Search) 삽입시 개선점

이분 검색의 삽입방식은 맨 끝에 요소를 놓고 노말하게 삽입정렬을 하는 방식이다. 이 부분을 조금 더 빨리 개선할 수 있는 점이 보인다. 이미 정렬된 상태이므로 find와 유사한 함수를 만들어 들어갈 자리를 쉽게 찾을 수 있으리라 본다. 가령 1,3,5,9,11 등에서 7을 집어 넣는다 할 때 우선 7을 찾아보면 인덱스 2 중간값 5보다 큰 수이므로 오른쪽으로 가고 인덱스 3 중간값 9보다는 작으므로 다시 찾는 루틴을 시도하지만 조건 불만족으로 탈출할 것이다. 탈출시 조사한 곳의 mid값을 가지고 위치판단이 가능할 것이다. 위와 같은 식으로 자리를 찾는 수고를 덜 수 있으리라 본다. 찾을 때 O(N)을 O(lon(2)N) 수준으로 줄인다. 그 뒷자리 메모리를 일괄적으로 한칸씩 미는 수고는 어쩔 수 없지만,..

병합정렬(Merge Sort) 분석과 소스 작성해 보기

이 알고리즘 역시 이해는 어렵지 않다. 트리구조로 파악 후 하위트리들을 작은수를 앞에 놓는 식으로 차례차례 상위로 이동하면서 병합하는 방식이다. 그런데 이해는 쉽게 되는데 선뜻 코드가 바로 짜여지지 않는다. 아무래도 트리구조로 탐색, 이동해야 되니 이동방식에 대한 고민이 만만찮고 배열 갯수가 2의 제곱으로 나누어지지 않는 부분에 대한 처리도 신경써야 되기 때문일 것이다. 여기저기 참고하고, 손질 좀 하고 시간 좀 걸려 짜 놓은 소스를 보니 참 길고 루프문도 많이 사용됨을 볼 수 있었다. 사용된 지역변수가 11개나 된다. 원래 각 트리 단계별로 보통 버퍼에 결과를 저장한 후 다시 원본배열로 이를 복사하는 방식을 사용하기도 하지만 이를 개선하는 방법도 있다.(이재규 알고리즘 서적 참조) 어차피 버퍼와 원본배..

힙정렬(Heap Sort) - topdown, bottomup 두 방식 소스 작성과 비교 등등 해봄

생각보다 코딩 작업이 더디었다. 개념은 이해하기 쉬운 데 막상 코딩을 할려니 이것저것 세밀하게 따져야 하는 부분이 상당수 있어서 그런듯 하다... 시작과 끝 인덱스라든지, 노드 공식, 갯수 파악 등 신경써서 해야하는 부분이 많으므로 시간이 좀 오래 걸렸다. 일부 알고리즘 서적이나 강의에서 계산의 편의로 실제 인덱스에 +1을 하고 작성하는 경우가 있는 데(이재규 알고리즘 참조) 굳이 그렇게 하지 않고 그냥 작성했다. 충분히 직관적으로 쉽게 파악가능하고 어차피 나중에 실제 요소값 바꿀 때는 원래의 인덱스를 취해야 하므로 그렇다. 인트형 무작위 100만개를 입력해 테스트해보았는데 책에서 나오는대로 bottomup방식이 쬐금 더 빨랐다....;;; 퀵소트랑 비교해봣는데 역시 퀵소트한테는 못당한다.... medi..