자료구조와 알고리즘

나좀보소의 이미지

자료구조는 대충 들은 적 있지만 알고리즘은 처음 듣습니다.
지금 C만 배운 초보로서 나중에 펄,자바같은 걸 배울때도 필요하나요?
그리고 알고리즘은 무엇인가요?

그리고 이건 좀 다른 문제인데
펄을 배우고 파이선을 배울 필요가 있나요?

고수님, 초보 개발자를 도와주세요.

cleansugar의 이미지

저도 안 배워서 잘 모르지만 전산과에서는 자료구조를 배우고 다음 학기 때 알고리듬을 배우더군요.

자료구조는 말 그대로 정적인 면이 있는 것 같습니다.

두 분야 책을 사보시면 내용을 알 수 있습니다.

겹치는 부분도 있고요.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com

meelong0의 이미지

자료구조란 데이터를 처리함에 있어서 상황에 맞게끔 여러가지 구조를 사용하는 방법에 대한 학습인것 같습니다.
선형구조의 데이터 공간을 활용할 것인지 원형구조를 이용할 것인지,
데이터를 들어온 순서대로 처리(queue)를 할 것인지 최근에 들어온 데이터부터 처리할 것인지에 대하여(Stack)
어떤 상황에 어떠한 구조를 쓸 것인지에 대하여 미리 학습하는 것이 아닐런지요.

알고리즘은 문제를 풀어가는 최적의 방법에 대한 기술입니다.
주어진 문제가 있을 때 풀어가는 방법은 여러가지가 있을 수 있겠으나,
가장 정확하고도 빠른 방법으로 문제를 풀어가는 방법을 논리적으로 잘 풀어 놓은 것이지요.

실제 업무 또는 학교의 경우 숙제 같은 문제가 주어졌을 때,
이를 해결 하는 방법은 많겠지만, 그 중에서도 가장 정확하고 빠른 해결 방법이 알고리즘입니다.
그래서 알고리즘을 배우다 보면 항상 접하는게 정말 가장 빠르게 푸는 방법이 맞느냐를 증명하는 것으로
보통 빅오를 많이 찾으라고 합니다.

또한 이런 최적의 문제 풀이 방법을 찾아 나아가는 방법 또한 이미 많이 나와 있으며,
그 상황에 맞추어 어떤 방법을 찾아서 써 먹어야할지에 대하여 여러가지 방법론을 학습하게 됩니다.

문제가 있으면 전체를 보고 문제를 해결하기 보다는 문제를 작은 단위로 나누고 나누어서
그 작은 문제들을 다 해결해 나가다 보면 문제가 해결되는 방법이 있을 수 있고(분할 정복),
문제를 풀어가는 과정에서 최적이라 생각되는 방법을 순차적으로 지속적으로 적용해 나가면서
해결해 나가는 방법도 있을 수 있습니다.

특히 알고리즘은 학교 수업 때에는 그 중요성을 잘 못 느낄 수 있으나,
수학적인 접근과 논리적인 사고와 추상적이지만 경험에 근거하여 문제를 좀 더 쉽고 빠르게
해결해 나갈 수 있는 방법을 학습할 수 있기 때문에 추후 업무에서 매우 유용할 수 있습니다.

그리고 C나 Java, Perl 이런건 언어적인 문제이며,
문제를 풀어나가는 과정에서 그 환경에 가장 적합한 녀석을 찾아서 사용하면 그 뿐입니다.
어떤걸 해야할지 보다는 우선 학부때에는 하나를 확실히 잘 다루는게 좋습니다.

언젠가 시간이 흐르면 언어가 다른 것은 큰 문제가 아님을 알 수 있고,
알고리즘이나 자료구조 같은 기본이 더욱 중요하다는 것을 알게 될테니,
지금은 와닿지 않는다 할지라도 열심히 익혀 두시면 좋을 것입니다.

www.studydev.com

- 누구든 개발을 쉽게 배울 수 있는... Open 2012. 9.

snowall의 이미지

좀 심하게 말하자면, 자료구조와 알고리즘을 알아야 "Hello, world!"보다 어려운 프로그램을 만들 수 있고, "복사&붙여넣기" 이외의 방법론을 써서 개발할 수 있죠.

피할 수 있을때 즐겨라! http://melotopia.net/b

free21k의 이미지

==================================
당신은 당신의 꿈을 위해 무엇을 희생하였나요?

yielding의 이미지

자료구조는 문제를 컴퓨터에 어떻게 표현하는가(How to represent)에 관에 초점이 있는 반면 알고리즘은 어떻게 컴퓨터로 문제를 풀것인가(How to solve)에 관심이 있습니다. 따라서, 컴퓨터로 문제를 풀고자 한다면 어떤 프로그래밍 언어를 사용한다고 하더라도 자료구조와 알고리즘에 대한 학습은 반드시 필요하겠죠.

문제를 컴퓨터로 풀려면 먼저 문제를 표현해야하므로 학부 2학년 정도에 자료구조를 먼저 가르칩니다. array, (singly/doubly) linked list를 기본으로 해서 stack, queue, tree, hash table, graph 등등을 공부할 것이고 이 자료구조와 연관된 operation의 구현을 함께 공부합니다.

알고리즘 시간에는 컴퓨터에 문제가 표현되었다고 가정하고 오직 문제를 어떻게 풀것인가에 대해서 공부합니다. 이미 알려진 문제를 가지고 성능을 평가하기 위한 알고리즘의 성능에 대한 수학적 표현, 증명 기법부터 시작하여 알고리즘의 분류 (greedy, dynamic programming or divde-and-conquer) 문제의 범주 (P/NP)등을 공부합니다. 아주 이론적입니다. 사람에 따라서 다르겠지만 머리를 쥐어 뜯어가면서 공부해야하는 어려운 과목입니다.

알고리즘을 공부해야 하는 이유는 내가 풀고자하는 문제가 컴퓨터로 풀 수 있는 문제인지 아닌지를 판별하고(즉 polynomial time안에 풀 수 있는 문제인지 아닌지) 답이 있다면 이미 알려진 알고리즘을 적절하게 응용하여 문제를 푸는 능력을 키우는 것 정도가 되겠습니다.

예를 들어 정렬 문제의 경우, quick sort가 대부분의 경우 무난하겠지만

. 데이타가 거의 정렬된 경우,
. 메모리는 수 기가인데 비해 데이타는 수 테라인 경우
. 가용 메모리가 아주 적은 경우
. 범위가 한정된 정수의 경우

적용하는 알고리즘이 다 다르겠죠.

여담으로, 대부분의 경우 문제의 뼈대를 이루는 프로그램의 구조 및 올바른 자료구조를 설계하는 것이 어렵습니다. 알고리즘은 이미 고안된 것을 잘 골라 사용하는 것으로 충분한 경우가 많습니다.

Life rushes on, we are distracted

rgbi3307의 이미지

좋은 말씀입니다.
자료구조와 알고리즘은 이미 많은 것들이 개발되어 있습니다.
이것을 주어진 문제에 맞도록 최적화하여 맞춤형으로 적용하는 것이 중요합니다.
자료구조와 알고리즘에서 Linked List는 가장 근본이 되는 원리에 해당합니다.
이것을 주어진 문제에 맞춤형으로 적용하다 보면,
hlist, plist, klist, scatterlist, quicklist, stack, queue, tree, graph... 등이 됩니다.
앞으로 컴퓨팅환경은 계속 진화하고 풀어야 하는 새로운 문제들은 지속적으로 나타나므로,
이들을 최적화하여 해결하고자하는 자료구조와 알고리즘 또한 계속 진화되리라 생각합니다.
현재 진행행인듯...

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

senseyw의 이미지

자료구조는 기본 소양입니다.
map에도 여러 종류가 있죠
그러나 사실상 사람들 절반 이상이 hashmap 정도만 쓰지요
뭐든지 기본이 중요하다라는 말처럼 공부하실 때
java util lib를 reading해보세요.
많은 도움이 됩니다.

그리고 알고리즘은 자기가 직접 고민해보면서
돌탑을 하나씩 쌓는 기분으로 노력해야 합니다.
공든 탑이 무너지지 않지요 ^^.


=====================
즐길 수 없으면 피하라.

zaemin2의 이미지

알고리즘은 문제를 푸는 방법을 배우는겁니다. 최적의 해를 최적의 방법으로 풀어낼수 있느냐 를 공부하는거죠.
예를들어, 어려운 탐색문제(탐색 공간이 매우클때) 에 대해서 최적의 방법을 생각해보는 몇가지 방법이 있는것 같습니다.
1. 최적의 해 포기하자. 근사로 만족하자.
2. 뭔가 기발한 지식을 이용해서 최적의 해에 빨리 접근할수 있는 방법이 있지않나?
3. 최적의 해를 탐색할때마다 어느정도 비슷 비슷한 계산이 필요하다면, 이거 좀 효율적으로 어떻게 안되나?

jyunet의 이미지

밥을 먹을때.. 어떤 숟가락으로 먹을것이냐?
그 숟가락으로 어떻게 밥을 맛있게 먹을것이냐 ?

하는게 자료구조와 알고리즘입니다..

숟가락 없이 손으로 밥을 먹는 사람하고 숟가락으로 밥먹는 사람하고 그 지저분한 차이가 분명 나겟지요?

이해 되셧는지??