std::Set + std::List의 장점을 가진 자료구조가 있나요?
글쓴이: ignore444 / 작성시간: 금, 2010/06/18 - 12:53오후
* binary search tree의 장점 : 삽입/삭제/찾기가 빠르다
* liked list의 장점 : 삽입한 순서대로 순회가 가능하다.
위의 특징을 만족시키는 자료구조가 있나요?
list에서 set의 iterator의 포인터를 간직하고 있다... 라는 식의 구현은 별로 라고 생각합니다. set의 공개된 인터페이스를 사용하지 않고 set구현에 의존된 변수를 list에서 건들고 있으니깐요, 또한 어떤 item을 삭제한다고 했을때, set에서는 삭제가 빠르지만, list에서 삭제하려면 전부 훑어 봐야 하니깐요. 이 문제를 해결하기 위해서는 set에서도 list의 iterator의 포인터를 가지고 있고... 점점 소스는 지저분해지고요
그렇기 때문에 이런 자료구조가 있는지 찾고 있습니다.
혹시 아시는 분 있나요? 아마 없을듯 싶지만요..
Forums:
그런 자료구조가
그런 자료구조가 있는진 모르겠지만, linked list의 장점은 삽입한 순서대로 순회가 가능하다가 아닙니다.
linked list의 삽입이 빠르다는 것입니다.
linked list는 삽입한 순서대로가 아니라, 노드가 연결된 순서대로만 순회가 가능합니다.
공개된 interface를 사용하지 않고 구현에 의존한다라...
우선 set은 그렇게 빠르지 않습니다. logN 이 많은 경우 빨라보여도 대용량의 경우
성능을 상당히 저하시킬 수 있습니다.
list와 set은 application의 자료이용방식에 따라 각 연산의 성능이 달라지므로
누가 더 빠르다 느리다고 할 수는 없습니다.
생각하시는 것은 보통 흔히 영속저장방식(예를 들어 파일 혹은 DB)에서 index를 활용하는 방식같은데
set을 기반으로 list를 덧붙이는 방식이 아니라 거꾸로 list 기반에서 set을 활용하는 방식을 씁니다.
공개된 interface와 구현이야기는 정확히 어떤 것을 원하는지 모르겠습니다만
두가지를 모두 활용해야 하는 것이 일반적인 방식인 것 같습니다.
자료구조는 생각보다 다양하니까 깊이 공부해보시면 원하는 것을 찾을 수 있을지도 모르겠네요.
B+ tree를 참고해 보세요
님의 응용 분야가 어떤 분야인지는 모르겠지만 데이터 베이스의 구현이나 파일 시스템의 구현에 B+ Tree를 많이 사용합니다.
(트리 구조와 리스트 구조의 혼합 형태입니다)
http://en.wikipedia.org/wiki/B%2B_tree
인터넷에 공개된 소스도 많으니 참고가 될겁니다.
B+ Tree는 유사 변종도 많습니다. B* Tree, B# Tree등이 있지요.
댓글 달기