이라고 말할 수도 있겠습니다. Core java 책에서도 이런 언급이 나오죠.
컴퓨터를 단순하게 봐서 어떤 입력을 하면 출력을 내주는 기계라고 봅시다.
입력된 자료를 가공할 때 잠시 저장해둘 필요가 있을텐데요, 어떻게 저장할 것인가가 자료구조가 되는 것이고요, 그렇게 저장한 자료를 어떻게 처리할 것인가가 알고리즘이라고 보면 되겠습니다.
책을 abc 순서대로 꽃을 것인지 연도순으로 꽂을 것인지 혹은
책을 세로로 주욱 꽂아둘 것인지 아니면 책상 위에 쌓아둘 것인지
이런 데이타가 저장된 형태를 결정하는게 자료구조 입니다.
알고리즘은 내가 책을 찾는데 왼쪽부터 찾을 것인지 오른쪽 부터 찾을 것인지,
큰책부터 찾을 것인지 작은 책부터 찾을 것인지, 혹은
무작위로 아무거나 잡히는데로 찾을 것인지~ 결정하는 것이 알고리즘이죠.
(방금은 탐색 알고리즘을 말씀드렸네요)
즉, 데이타를 어떤형태로 어떻게 저장할 것인지가 자료구조이구요.
배열, 링크드리스트, 큐, 힙, 이진트리, 좌향트리, 2-3트리, 그래프 이런 것 자체는
자료구조라고 하지 알고리즘이라고 하진 않습니다.
하지만 혼동되는 이유는 이러한 자료구조를 만들 때, 그리고 탐색할 때
특정한 알고리즘이 개입되어야 하기 때문입니다.
저장된 데이타를 저장하거나 찾거나 변형하거나 수정할 때 필요한 방법은 알고리즘이라고 하죠.
버블소트, 퀵소트, 혹은 최단거리찾기, 압축 알고리즘, 이진 탐색(이진 트리 자료구조가 필요함) 등이 있겠죠.
중요하게 생각하는 사람중에 한명입니다.
예를 들어서 아주 쉽게 잘 설명해 주신듯합니다.
다시 간단히 정리해 보면,
자료구조 == 데이터 표현 및 저장 방식
알고리즘 == 명령 처리 및 제어 방법
이라고 생각하는데,
많은 책들이 이론적이라 난해하고 수학식으로 표현하는 경우가 많습니다.
(많은 자연과학 책들이 수학적으로 증명하는 것이라 어쩔 수 없지만요)
그런데, 프로그래밍으로 실제 코딩해 가면서 공부하는 것도 중요하다고 생각합니다.
자료구조는 포인터(pointer)로, 알고리즘은 재귀호출(recursion) 형태로 나타나는 경우가 많은데,
이것을 선행적으로 이해하는 것도 필요합니다.
개인적으로 좋아하는 책을 하나 소개해 드리면,
DATA STRUCTURES
by Richard F. Gilberg, Behrouz A. Forouzan
입니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
자료구조와 연결지어 생각할 필요는 없습니다. algorithm 자체는 '어떤 일을 하기 위한 방법' 을 통칭하는 말입니다. 보통 그 방법이 효율적이면 좋지만 효율적이지 않다고 algorithm 이 아닌 건 아닙니다. 사실 "어떤 문제를 푸는 데 있어서는 "효율적"인 algorithm 이 존재하지 않는다" 와 같은 걸 (좀 많이 단순화 했습니다만..) 증명하는 게 컴퓨터 과학 이론의 중요 토픽 중 하나입니다.
그런데 많은 다른 문제에 대해서는 그걸 효율적으로 푸는 방법이 존재하는 경우가 많습니다. 아니면 최소한 시간을 희생해서 저장공간을 절약하든지, 저장공간을 희생해서 시간을 절약하는 방법이 존재하는 경우가 있습니다. 이러한 경우 중간 계산 결과라던지 데이터를 좀 똑똑하게 기록해 놓으면 나중에 원하는 곳에서 득을 볼 수 있는 경우가 많이 있습니다. 이 (효율적인) 기록 구조를 자료 구조 data structure 라고 통칭합니다. 이렇게 만들어 놓은 자료 구조에 접근하는 것 (읽고, 쓰고, 고치는 것)도 "자료 구조에 접근하기 위한 방법" 이므로 algorithm 이라고 볼 수 있습니다.
이러한 자료 구조에 대한 algorithm 들은, 물론 목적한 바를 달성하는 것도 중요하지만, 해당 구조를 보존하는 것이 중요한 경우가 많습니다. 즉 자료 구조를 만들어 놓고 데이터를 하나 더하니까 그 자료 구조가 깨져버리면 자료 구조로써의 의미가 없죠. 그래서 해당 operation 이 자료 구조를 보존하는지에 대한 분석이 필요합니다. 그리고 해당 operation 이 시간이 얼마나 걸리는지, 아니면 특정 자료 구조가 공간을 얼마나 먹는지도 중요하겠죠.
그래서 학부 자료 구조 / algorithm 교재를 보면 거의 대부분의 내용이 1. 자주 쓰이는 (그리고 잘 연구되어 있는) 자료 구조 2. 해당 자료 구조에 대한 입출력/수정 방법 3. 읽고/쓰고/고치는데 얼마나 시간이 드는지 4. 해당 자료 구조가 얼마나 공간을 먹는지 5. 입출력/수정이 해당 자료 구조를 보존하는지의 내용으로 구성되어 있습니다. 즉 자료 구조를 다루기 위한 algorithm 을 주로 설명하죠. 하지만 algorithm 이 꼭 자료 구조를 다루기 위한 방법인 것은 아닙니다. 오히려 실제적으로 연구되는 algorithm 들은 "어떤 문제를 풀기 위한 방법" 이지 자료 구조 자체를 다루는 것에 국한되는 것은 아닙니다.
보통의 알고리즘
보통의 알고리즘 책들은 알고리즘을 설명하기전에 자료구조에 대해서 설명하고 알고리즘 들어가는데
아마도 추천한 책도 그런식인가보죠.
대신 자료구조를 아주 잘 설명한 알고리즘 책일지도 모르는 일이지요. :)
아주
아주 단순화시키면,
프로그램 = 자료구조 + 알고리즘
이라고 말할 수도 있겠습니다. Core java 책에서도 이런 언급이 나오죠.
컴퓨터를 단순하게 봐서 어떤 입력을 하면 출력을 내주는 기계라고 봅시다.
입력된 자료를 가공할 때 잠시 저장해둘 필요가 있을텐데요, 어떻게 저장할 것인가가 자료구조가 되는 것이고요, 그렇게 저장한 자료를 어떻게 처리할 것인가가 알고리즘이라고 보면 되겠습니다.
책장에 책꽂기
책장에 책 꽃기로 비유한다고 해봅시다.
책을 abc 순서대로 꽃을 것인지 연도순으로 꽂을 것인지 혹은
책을 세로로 주욱 꽂아둘 것인지 아니면 책상 위에 쌓아둘 것인지
이런 데이타가 저장된 형태를 결정하는게 자료구조 입니다.
알고리즘은 내가 책을 찾는데 왼쪽부터 찾을 것인지 오른쪽 부터 찾을 것인지,
큰책부터 찾을 것인지 작은 책부터 찾을 것인지, 혹은
무작위로 아무거나 잡히는데로 찾을 것인지~ 결정하는 것이 알고리즘이죠.
(방금은 탐색 알고리즘을 말씀드렸네요)
즉, 데이타를 어떤형태로 어떻게 저장할 것인지가 자료구조이구요.
배열, 링크드리스트, 큐, 힙, 이진트리, 좌향트리, 2-3트리, 그래프 이런 것 자체는
자료구조라고 하지 알고리즘이라고 하진 않습니다.
하지만 혼동되는 이유는 이러한 자료구조를 만들 때, 그리고 탐색할 때
특정한 알고리즘이 개입되어야 하기 때문입니다.
저장된 데이타를 저장하거나 찾거나 변형하거나 수정할 때 필요한 방법은 알고리즘이라고 하죠.
버블소트, 퀵소트, 혹은 최단거리찾기, 압축 알고리즘, 이진 탐색(이진 트리 자료구조가 필요함) 등이 있겠죠.
저도 자료구조와 알고리즘을
중요하게 생각하는 사람중에 한명입니다.
예를 들어서 아주 쉽게 잘 설명해 주신듯합니다.
다시 간단히 정리해 보면,
자료구조 == 데이터 표현 및 저장 방식
알고리즘 == 명령 처리 및 제어 방법
이라고 생각하는데,
많은 책들이 이론적이라 난해하고 수학식으로 표현하는 경우가 많습니다.
(많은 자연과학 책들이 수학적으로 증명하는 것이라 어쩔 수 없지만요)
그런데, 프로그래밍으로 실제 코딩해 가면서 공부하는 것도 중요하다고 생각합니다.
자료구조는 포인터(pointer)로, 알고리즘은 재귀호출(recursion) 형태로 나타나는 경우가 많은데,
이것을 선행적으로 이해하는 것도 필요합니다.
개인적으로 좋아하는 책을 하나 소개해 드리면,
DATA STRUCTURES
by Richard F. Gilberg, Behrouz A. Forouzan
입니다.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
....
자료구조 - 자료를 보관하는 곳의 설계
알고리즘 - 자료구조에 입력 출력 탐색등의 방법
지금 당장 생각나는건
알고리즘= input 을 받아 유한 시간안에 output을 돌려주어야 합니다.
자료구조= 윗분 말대로 데이터 표현 및 저장 방식.
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
근데 두가지를
근데 두가지를 완전히 때 놓고 보기도 에매하지 않나요?
전 자료구조는 알고리즘의 subset으로 바라보고 있습니다만..
Algorithm 의 정의를
자료구조와 연결지어 생각할 필요는 없습니다. algorithm 자체는 '어떤 일을 하기 위한 방법' 을 통칭하는 말입니다. 보통 그 방법이 효율적이면 좋지만 효율적이지 않다고 algorithm 이 아닌 건 아닙니다. 사실 "어떤 문제를 푸는 데 있어서는 "효율적"인 algorithm 이 존재하지 않는다" 와 같은 걸 (좀 많이 단순화 했습니다만..) 증명하는 게 컴퓨터 과학 이론의 중요 토픽 중 하나입니다.
그런데 많은 다른 문제에 대해서는 그걸 효율적으로 푸는 방법이 존재하는 경우가 많습니다. 아니면 최소한 시간을 희생해서 저장공간을 절약하든지, 저장공간을 희생해서 시간을 절약하는 방법이 존재하는 경우가 있습니다. 이러한 경우 중간 계산 결과라던지 데이터를 좀 똑똑하게 기록해 놓으면 나중에 원하는 곳에서 득을 볼 수 있는 경우가 많이 있습니다. 이 (효율적인) 기록 구조를 자료 구조 data structure 라고 통칭합니다. 이렇게 만들어 놓은 자료 구조에 접근하는 것 (읽고, 쓰고, 고치는 것)도 "자료 구조에 접근하기 위한 방법" 이므로 algorithm 이라고 볼 수 있습니다.
이러한 자료 구조에 대한 algorithm 들은, 물론 목적한 바를 달성하는 것도 중요하지만, 해당 구조를 보존하는 것이 중요한 경우가 많습니다. 즉 자료 구조를 만들어 놓고 데이터를 하나 더하니까 그 자료 구조가 깨져버리면 자료 구조로써의 의미가 없죠. 그래서 해당 operation 이 자료 구조를 보존하는지에 대한 분석이 필요합니다. 그리고 해당 operation 이 시간이 얼마나 걸리는지, 아니면 특정 자료 구조가 공간을 얼마나 먹는지도 중요하겠죠.
그래서 학부 자료 구조 / algorithm 교재를 보면 거의 대부분의 내용이 1. 자주 쓰이는 (그리고 잘 연구되어 있는) 자료 구조 2. 해당 자료 구조에 대한 입출력/수정 방법 3. 읽고/쓰고/고치는데 얼마나 시간이 드는지 4. 해당 자료 구조가 얼마나 공간을 먹는지 5. 입출력/수정이 해당 자료 구조를 보존하는지의 내용으로 구성되어 있습니다. 즉 자료 구조를 다루기 위한 algorithm 을 주로 설명하죠. 하지만 algorithm 이 꼭 자료 구조를 다루기 위한 방법인 것은 아닙니다. 오히려 실제적으로 연구되는 algorithm 들은 "어떤 문제를 풀기 위한 방법" 이지 자료 구조 자체를 다루는 것에 국한되는 것은 아닙니다.