컴퓨터과학과 과목 중에 <Data Structure 자료구조> 라는 것이 있다. 보통 <Algorithm 알고리듬> 의 선수 과목이기도 하다. <자료구조>는 쉽게 말해 공간 + 시간 + 비용 관점에서 효율적으로 이용하기 위해 데이타를 메모리에 어떤 배열 및 구조로 저장해야 하나, 에 관한 학문이고, <알고리듬>은 어떤 문제를 풀기 위한 일련의 액션들을 어떤 순서로 배열할 것인가, 에 관한 학문이라 할 수 있을 것 같다. 알고리듬은 그 응용범위가 대단히 광범위한 것으로 알고 있다.

대학교 때 <자료구조> 를 들을 때는 머리가 나빠서 좋은 점수를 받지는 못했는데, 예전 회사에서 실무 C/C++ 프로그래밍을 하면서 효율적인 프로그래밍의 중요성과 매력에 대해 새삼 깨닫고는 프로그래밍 일을 하면서 뒤늦게 다시 공부를 한 적이 있는데, 잘은 못했지만 어쨌건 매우 흥미로운 학문이었으며 지금도 가장 좋아하는 과목 중 하나다.

<자료구조>를 배울 때 가장 먼저 접하는 구조가 스택 (Stack) 과 큐 (Queue) 라는 선형 구조이다. 스택이란 말 그대로 쌓아 올린 것을 의미하는데 하나씩 쌓아 올리다 보니 나중에 올린 것부터 먼저 꺼내야 한다. 그래서 스택에서의 저장 방식을 보통 LIFO (Last In First Out) 이라고 한다. 반면에 큐는 줄서기를 떠올리면 되는데 먼저 들어 간 사람이 먼저 나간다. 그래서 큐에서의 저장 방식을 보통 FIFO (First In First Out) 이라고 한다.



스택은 입구와 출구가 같은데 그곳을 일렬로 들어가는 경우를 떠올려도 된다. 가장 먼저 들어간 놈이 가장 늦게 나올 수 밖에 없다. 그러나 큐에서는 들어간 곳과 나오는 곳이 다르다. 입구와 출구가 구별되고 일렬로 줄을 서서 이동하니 가장 먼저 들어 간 놈이 가장 먼저 나온다.

그런데 이 두 구조 모두 배열 중간에 있는 데이타에 접근을 하려면, 가령 출구로부터 N 번째에 위치한 데이타를 찾으려면 N-1 개의 데이타를 꺼내 보아야 한다. 그러니까, 데이타 검색 시간 O(n) = N. (보통 시간 복잡도 (time complexity) Big O 로 표현한다.) 선형 구조가 지닌 한계라 할 수 있다.

이 선형의 단점을 극복하기 위해 메모리를 동적으로 할당하면서 메모리 주소와 데이타를 함께 저장하는 구조 단위를 만들고 그 단위들이 연결된 리스트 (Linked List) 를 구현할 수 있는데, Tree 라는 비선형 구조가 그렇다. 특정 배열과 저장 규칙을 만들어 데이타를 저장하게 되면 데이타 검색 시간을 O(n) = log N, 으로 감소시킬 수 있다.




어느날 문득, 분명히 읽고 싶어서 산 것들임에도 읽히지도 못한 채 방안 한가득 쌓여만 가는 책들을 보고는 이 스택 (Stack) 생각이 났다. 맨 아래에 깔려 있는 놈들. 중요하지 않아서가 아니라 단순히 먼저 내 방에 들어왔다는 이유만으로 깔려 있는 것들인데 깔려 있다 보니 있는지 없는지 조금만 지나면 구입 여부 조차도 잊게 되고 심지어 다시 주문하는 경우까지 생긴다.

어떻게 해야 이 방에서 책이 놓이는 방식을 큐 (Queue) 의 구조로 바꿀 수 있을까, 라는 생각을 자주 하게 되는데 그러다보니 참 별 생각이 다 든다. 나의 뇌에 지식이 저장되는 방식은 스택일까, 아니면 큐, 아니면 트리?   트리는 아닐 거다. 그렇지 않고서야 좀더 이전에 넣었던 지식들 검색 시간이 왜 이렇게 오래 걸려... 그나마 O(n) = N 이면 다행이다. 지금 드는 생각은 O(n) = N^2 이 되어가고 있는 것은 아닐까... 솔직히 두렵다. 인터넷 때문에 더한 것일지도 모르겠다.

좀더 거시적으로 보면 '세상의 역사' 라는 자료의 저장 방식은 스택일까 아니면 큐일까... 시간이라는 측정단위가 선형이니까, 세상의 모든 역사는 선형으로 차곡차곡 쌓일테니, 그 검색에 트리구조를 적용하기는 어려울 것 같기도 하고...

결국 하나씩 꺼내 봐야 하는데 스택이라면 연대기의 역순으로 봐야하므로 객관적이기 어렵고, 큐라면 도대체 어디가 처음인지를 알 수도 없고 그것을 찾는 동안 계속 역사들이 큐로 들어 오기 때문에 엄두가 안난다. 정치, 경제, 사회, 문화 모든 분야의 지식들이 다 그렇다. 도대체 이놈들을 어떻게 처리를 해야 효율적으로 쌓고 검색을 한단 말인가.

그러다가 방안에 쌓여 가는 책더미를 보는 순간 문득 혹시 저놈들이 나의 뇌 저장 구조를 무의식 중에 드러낸 것을 아닐까, 싶어진다. 만약에 그렇다면 조금 두렵다. 스택. 예전에 들어온 나의 지식들은 최근 들어온 놈들을 다 꺼내야 비로소 꺼내 볼 수 있다는 것인데 요즘의 내 독서 습관을 돌이켜 보니까 아 정말 그런 것 같기도 하고....

*

내가 지금 책을 읽어 얻는 지식, 공부를 통해 터득하게 진리, 경험을 통해서 깨닫게 되는 진실 등은 지금 나의 뇌 속에서 어떤 식으로 저장되고 있는 것일까...

요즘 부쩍 이런 저런 공부를 하고 싶다는 생각을 많이 하는데, 참 고민이다. 공부를 시작하고 그놈들이 이 놈의 스택 방식의 뇌에 차곡차곡 저장이 될 경우, 지금까지의 쌓아 온 지식들을 꺼내려면 최근 놈들을 한참을 꺼내야 접근이 가능하게 되는 것 아닌가... 거기에다가 CPU 속도도 점점 더뎌지니 정말로 O(n) = N^2 가 되는 건가... -_-;;

넓은 집이 해결해 줄 수 있을까? 요즘같이 엉망진창이 된 경제 시대에 '집의 사이즈'를 통해  O(n) 을 개선해 보겠다는 것은 멍청한 짓. 아니면 공부도 하지 말고, 책도 사지 말고, 스택에 아무것도 쌓지 말까?  나 같은 중독자가?

이런 생각도 들긴 한다. 그래도 아직 모르는게 많아 뭔가를 배우고 싶어하는 맘이 강한 것을 보니 아직은 젊다. 그런 생각. 참고로 나는 가르치려 들 때 늙었다라고, 배우려고 할 때 아직은 젊다, 라고 생각을 하는 편이다. 하루에도 몇번씩 젊었다 늙었다를 반복하기는 하지만 전반적으로 아직은 배우고 싶어하는 편이라 그런 면에서는 좀 희망적이긴 하다. 문제는 배움의 축적 방식이 그 놈의 스택이라는 게 아쉽기는 하지만...

지금 내가 공부한다는 것의 의미, 내가 중고딩 시절 했던 그 공부와는 다르다. 생각해보니까 그때는 공부를 한 것이 아니라 뇌 속에다가 스택이라는 단순 선형 자료구조를 만든 작업을 했던 것 같다. 단순 암기 및 주입식 교육에 입시를 위한 공부의 한계일거다.

그 때 만약 다른 방식, 가령 트리를 만드는 작업을 했더라면 나는 지금 나의 뇌를 좀더 효율적으로 사용하고 있을지도 모른다. 그래서 지금 또는 앞으로 하려는 공부는 늦었지만 스택이라는 자료구조를 허물고 그 자리에 새롭게 트리 구조를 구성하는 작업으로 삼고 싶다. 가능할지는 모르겠으나. 나름 블로그가 어떤 큰 도움을 줄 수 있으려나 기대를 한다.

휴... 어쨌건 아마 앞으로 한동안 내 삶은 '공부 모드' 일 것 같다. 이 블로그도 함께.


2008년 9월 30일 작성


Posted by bopboy
TAG

댓글을 달아 주세요