본문 바로가기

알고리즘

(자료구조 기본개념)전위순회, 중위순회, 후위순회 간략하게 내 식으로 기억하기 1. 코드 중심으로 이해하기 // 노드의 내용을 출력하는 printf("%d", w->key) 위치가 , 자식에 방문하는 명령문들 앞에오면 전위, 자식 방문하는 중간에 있으면 중위, 자식 다 방문한 후에 있으면 후위 의사코드 preOrder(NODE* w){if(w = NULL)return printf("%d", w->key)preOrder(w->left)preOrder(w->right)} inOrder(NODE* w){if(w = NULL)returninOrder(w->left)printf("%d", w->key)inOrder(w->right)} postOrder(NODE* w){if(w = NULL)return postOrder(w->left)postOrder(w->rig.. 더보기
이진 탐색트리_ 탐색, 삽입, 삭제, 전위순회 외부노드라는 개념을 이용해서 만들었음. 노드에 값이 들어있는 것들을 내부노드, 노드에 key값도 없고 자식도 없는 것들을 외부노드. 단말 내부노드에는 자식이 없는 경우에 외부노드를 붙여 놓았음. 논리 짠 부분은 A4용지에 적어놔서 스캔해서 올리기 //이진탐색트리 탐색,삽입,제거,순회 #include #include typedef struct Node{ struct Node* P; struct Node* L; struct Node* R; int key; }NODE; typedef struct Tree{ NODE* Root; }TREE; NODE* makeNode(NODE* parent ,int k) { NODE* node = (NODE*)malloc(sizeof(NODE)); node->P = parent.. 더보기
최소신장트리 간선의 가중치 출력 - Kruskal으로 간선이 선택됨 후기 1. 디버깅에서 조사식을 이용해서 배열에 들어있는 내용들을 전체를 확인할 때, 이름에 g->E , 9 이런식으로 쓰면 E가 가리키는 배열에 원소 9개를 한번에 볼 수 있음2. minLoc 을 초기화 안해도 될 것 같아서 , 그냥 썼는데 문제 발생. 초기화는 항상 신경쓰는게 맞는 것 같다. 구상 에서의 문제 :bag을 어떻게 표현하는게 문제였는데, 아래 노트를 보면 초반에 생각들대로 구현하는 것 가능할 것으로 예상되지만, 확실히 다른 코드를 보고 배우거나, 누군가에게 조언을 들어가면서 피드백을 받아가며 코딩하는 것이 좋다. 물론, 도움을 받을 상황이 아니면 스스로 생각한대로 어떻게든 구현해내는게 맞다. 간단한 방법을 찾는 방법?내게 필요했던 것은 두 정점이 같은 bag에 담겼는지 아닌지를 단순히 확인.. 더보기
무방향 간선 그래프 만들고 그래프 너비우선탐색(BFS)으로 순회 고안 할 때 아이디어 1. label을 이용해 해당 Vertex가 방문 되었는지(=1) 안되었는지(=0) 2. 큐를 이용해서 깊이레벨이 낮은 부분부터 접근할 수 있게 //BFS(너비우선 탐색) #include #include typedef struct Vertex{ int k; int label; }VERTEX; typedef struct Edge{ int endV1; int endV2; int label; //설계할 때 괜히 만들음. 없어도 됨. }EDGE; // 이거 구조에 대해서 생각할 필요가 있음. 일단은 포인터 형식을 이용하지 않았음 typedef struct Graph{ EDGE* E; VERTEX* V; int** Mat; }GRAPH; void makeEdge(GRAPH* g, int v1.. 더보기
인접행렬을 이용한 그래프 구현하기(알고리즘_교보문고_국형준 참고) 후기 오류 지점 : E를 초기화 시키지 않아서 밑에 표시된 오류지점 바로 전 for구문이 다돌아서 E[21]인덱스에 접근 해버렸음 그것이 V에 있는 정보를 바꿔버렸음. 구조체상으로 보면 E[0]~E[20]존재하고 E[21]은 없는데 이게 그 다음에 있는 V 메모리에 접근한 것 (근데 항상 이렇게 두 메모리가 인접해서 할당되진 않을 수 있다고 함.) #디버깅 할 때 팁 얻음 F5 디버깅 모드 시작 및 중단점까지 실행 디버깅 모드 시작 된다음에 디버그 탭에서 창을 보면 조사식이 있음(조사식으로 변수값 점검) F9 중단점 설정 F10 한줄씩(?) 실행 설계 노트 -작성된 코드 #include #include typedef struct Edge{ int endV1; int endV2; int w; }EDGE; .. 더보기
배열로 구현한 개방조사법 해시테이블(선형조사법으로 충돌 방지) 후기 -해시테이블 중에 가장 쉬운 방법이지만 충돌 방지를 2차 조사법이나 , 이중해시를 사용하는 방법은 여기서 조금만 변형을 가해주면 된다.-분리연쇄법은 다르지만 오히려 생각하기는 더 쉬울 듯. 사전 설계(나만 알아볼 듯. 대충 정리한 거라.. 그리고 안쓰인 정보들도 있음) 부등호때문인지 뭔지 계속 깨져서 텍스트 파일로 올림 더보기
최대힙을 이용해서 제자리 정렬하기 힙정렬 수행시간이 O(n logn) // 합병 퀵보다 빠름 O(n^2) 후기 1. 전역변수를 정확히 통제한다면 쓰는 건 나쁜 것 같지 않음. 아직 코드가 단순해서 그런 걸 수 있지만.. 2. 간단한 것도 논리 정리하고 들어가는게 나음. 논리 간단한 것들은 어짜피 정리하는데에 시간도 얼마 안걸림. 쉽다고해서 그냥 코딩하다가 시간 꼬인 감이 있음. 3. 다시 할 것 같진 않지만... 시간되면 전역 변수 없이 코드를 구성하기.(예상하건데 사실상 함수 인자들이 더러워지고, 노가다작업 일 거 같음. 못해서 안하는게 아님.. 아마도..) #include int A[101] ={-1, 0}; int N = 0; int size = 0; // 다운힙에 last 안넣으려고. void insertItem(int key);.. 더보기
배열로 구현한 최대힙과 우선순위 큐를 결합한 형태 후기 1. 역시 간단히 정리하고 코딩시작하는게 훨씬 낫다. //지금은 ㅈ밥이니까 이런거 정리하고 시작하지만 나중엔 이정도 코드는 그냥 바로 코딩 가능하겠지 //최대힙 #include int A[101] ={-1, 0}; int N = 0; void insertItem(int key); void upHeap(int a); int deleteItem(); void downHeap(int i); void main() { char sta = 'a'; /*for(int i =0 ; i=A[r]) //두 자식이 모두 부모보다 작음 return; else // 둘중에 하나라도 크면 둘 중 큰 자식과 부모의 위치 바꾸기 { if(A[l]< A[r]) { temp = A[r]; A[r] = A[i]; A[i] = tem.. 더보기
합병 정렬 리스트로 구현해보기 단일리스트 형태로 만들어서 합병정렬을 구현해 봄. 코딩 후기 및 추가적으로 더 확인 할 것 1.코딩 초보라서 만드는데도 오래걸리고 오류를 찾는 방식도 어리숙해서 오래걸렸다. 2. 메모리 해제와 관련된 부분들은 정확히 처리하지 않고 일단 돌아가게만 했다. 3. 메인함수에서 free(list); 하면 코드가 중단되는데 왜 그럴지. (2018.06.28 추가)병슨인게 result나 list나 같은 리스트네.. 그에 따라서 mergeSort();는 void형으로 바꾸고 메인함수에 mergeSort의 반환형을 result로 받는 부분은 삭제하면 될 것 같다. (추가 의문,아 그리고, 해제할 때는 노드 하나하나 해제해야하는 건지. ) 조교님한테 물어봤는데 노드 하나하나 제거해주는게 맞음. 그 다음에 리스트를 제거해.. 더보기