오래 못 할 짓 하지 않기

데구 총 정리 본문

2학년 1학기/데이터 구조 ( Data structure )

데구 총 정리

쫑알bot 2023. 4. 12. 21:45
728x90

Big - O Natition

 

-> Statements 보고 O( ? ) 구할 줄 알아야 함

--> ' 최고차항만 고려한다 '  기억하기


스택 (Stack)

 

First in , last out

Push Pop <-- 탑에서 이루어진다.

대충 코딩 알고리즘은 알고있기

      

      -- > Stack 응용 (할 줄 알아야함 시험에 나온다고 함) 연습하기!!

      Expression (수식) 표현법 

            1 ) infix      → a+b      부호가 숫자 2개 안(in)에  

            2 ) prefix   → +ab      부호가 숫자 2개 앞(pre)에  

            3 ) post      ab+      부호가 숫자 2개 뒤(post)에  

 

            ## infix   prefix 하는 법   [ *문자가 나오는 순서는 식과 같음 ]

            1) 식의 순서에 맞게 괄호를 친다.

            2) 해당 괄호가 *열리는* = "("가 오는 곳에 괄호 안에 있는 부호를 넣는다.

 

               ex) a+b*c = (a+(b*c)) = +a*bc   / 데구4 종이 뒤에 있음

 

 

            ## infix  → postfix 하는 법   [ *문자가 나오는 순서는 식과 같음 ]

               1) 식의 순서에 맞게 괄호를 친다.

               2) 해당 괄호가 *닫히는*   = " ( "가 오는 곳에 괄호 안에 있는 부호를 넣는다.

 

                ex) a+b*c = (a+(b*c)) =abc*+

 


큐(Queue)

 

First in, first out

         

        - 구현법 : - front와 rear 값 증가 시, 끝 원소 후 첫 원소로 이어지도록 구현해야 한다.

               → rear=(rear+1)%SIZE

               → front=(front+1)%SIZE

 

     - Empty , full 연산자 파악하기!

            Empty   →    If(front==rear)    /    full       →   (front==rear)

 

         문제점 : front==rear인 상황에서 더하려고 하면 꽉 찼다고 안 되고, 빼려고 하면 비었다고 안 됨

 

         해결법 :  1칸을 안 쓰는 칸으로 만들어버린다.

 

         

         empty는 그대로 front==rear일 때로 하고

         full 연산자는(((rear+1)%SIZE) ==front) 일 때, 즉 rear에서 한 칸 더 갔을 때 front 일 때 (rear가 뒤에 있어야 함)

 


ADT ( Abstract Data Type )

 

안에 어떻게 돌아가는지 몰라도, 사용법만 알면 됨.

 

Class 구현 가능하거나 보고 뭔지 알 수 있어야한다고 하심.

 

 

+## Short Cirucit evaluation

:Evaluation 과정에서 결과값이 확정되면 나머지 뒤에 값들을 그냥 버리고 감

ex)

a=3;

b=4;

If((a++ == b ) or , and ~~~ ) 한 뒤에 끝나고 a와 b의 값 구하기 이런 거 있을 듯

 

 


  • Recursion  --> Binary tree에서 쓰임.

        - 자기 자신(Function body)을 Call 하는 것

        - 반복이긴 하지만 for나 while이 아닌 call and return방식으로 반복

        - 구성 요소 : Base case ( n==0 or n==1 일 때, ~~) + General Case          

        - 접근법 : 어느 단계의 값(n) 한 단계 이전의 결과값(n-1)에서 어떤 차이가 있는지 분석하여 만든다.

         : Base case -

         : General case -  

 

피보나치
팩토리얼
N이하의 짝수의 합

 

array원소 앞쪽 n개들의 합

 

순열

 

최대 공약수

 


Pointer

 

ex) *p=나: /   print(p) = 내 집 주소   / print(*p) = 나 (집에 사는 사람 = p라는 주소에 사는 사람) 

 

 

   → 주소 값 을 다루는 data type

   → NULL을 가리키면, 아무것도 가리키지 않는다 라는 뜻

   → Scope 외에서 다루고 싶을 땐,   주소를 넘겨주고 pointer로 받으면 가능하다.

   →  C에서는 malloc,free   

        C++ 에서는 a=new int[n]; / delete [a];

 

 

  • Reference Parameter

      1.  sub(x) →   void sub (int y)

      2.  포인터 :                        sub(&x) →   void sub (int *y)    > 주소로 콜하고 포인터로 받음

      3.  Reference Parameter : sub(x) →   void sub (int &y)     > 변수로 콜하고 주소로 받음

      

2번 결과 = 3번 결과 

→ 포인터의 주소에 가서 작업하는 기능을 사용하는 것

 

주소를 parameter로 받는 함수는 함수 콜이 끝난 뒤에도 변경된 값이 유지됨

 


Linked List

 

 장점 : 크기, 메모리를 효율적으로 사용할 수 있다.

   단점 : 다 Linked 가 되어있어서 Indexing이 불편하다.  << a[80] 이게 안 됨

 

          head = 새로 들어온 노드를 가리키는 포인터

          tail = 가장 안 쪽에 박혀있는 노드 가리키는 포인터

 

          -  Add to head 알고리즘   

          1) 노드 생성 및 메모리 할당

          2) 입력받은 내용 넣기

          3) head 가 가리키는 노드를 같이 가리킨다 ( 내가 오기 전까지 처음이었던 놈)

          4) head가 나를 가리키게 한다.

 

      

 

          -  Add to tail 알고리즘   

          1) 노드 생성 및 메모리 할당

          2) 입력받은 내용 넣기

          3) 노드가 NULL을 가리키게 한다 (tail에 넣으면 뒤에 가리키는 건 없으므로)

          4)

          4-1) tail이 NULL말고 가리키는 게 있다면 tail이 가리키고 있는 애가 방금 들어온 애를 가리킨다.

           4-2) tail이 NULL이면, head도 NULL이라는 뜻이므로, head 가 p를 가리키게 한다.

           5) 다 끝나고 나서 tail이 p(새로 생긴놈) 을 가리키게한다.

 

           

 

          -  Delete from head 알고리즘   <-- 정확히 delete보단 pop 개념에 가까움

           1) 포인터 노드 , 그냥 노드 하나씩 생성

           2) 포인터 노드로 삭제할 head에 있는 노드 잡아놓고 / 그냥 노드로 내용 복사해놓기

           3) head 는 head가 가리키는 놈의 다음 놈으로  head= head->link

           4) 포인터 노드로 delete

           5) 삭제한 뒤에 head ==NULL 이면, tail ==NULL

           6) 그냥 노드에 내용이 남아있는데 이걸 리턴.

 

 

 

for(p=NULL ; p!=NULL ; p->link)  <<이거 모든 노드를 돌아볼 때 많이 쓰임

 

 

Linked list를 stack이나 Queue로 구현. 

- Stack  은 top만 있음

= add_to_tail / delete_from_head

 

- Queue 는 front , rear가 있는데

  노드 추가는 항상 rear ( tail = 가장 안 쪽) , 노드 delete(리턴) 은 front에서 한다.

= add_to_tail  / delete_from_head임

 

 

 

invert

List_equal 보고 이해하기


 

Binary Tree 

노드 수 - Lemma

 

     

- Traversal : 누락없이 모든 노드를 거치는 것

 

       Inorder : 왼쪽  > 나 > 오른쪽     / [ 노드의 아래 ] 을 지날 때 인식함 

       Preorder : 나 > 왼쪽 > 오른쪽    / [ 노드의 왼쪽 ] 을 지날 때 인식함 

       Postorder : 왼쪽  > 오른쪽 > 나  / [ 노드의 오o른쪽 ] 을 지날 때 인식함 

 

       내려가다가 밑을 지난다고 하기 애매한 것들은 왼쪽이 있는지 확인하기.       

       왼쪽 없으면 본인 차례인 경우가 많음

       

       Level order : 큐로 구현함

root가 Null이면 return

아니면 root를 queue에 넣음

- >다음을 반복

   조건 : Queue가 empty가 아니면, (empty면 종료)

   내용 : 1) queue에서 원소 하나(a) 가져옴 

             2) 그 원소 읽음

             3) 읽은 원소의 왼쪽이 NULL이 아니면 queue에 넣음 

             4) 읽은 원소의 오른쪽이 NULL이 아니면 queue에 넣음

 

==> 요약하면 뺀 거 읽고, 그거의 (밑으로) 왼쪽 오른쪽 가져오는 거       

 

 

 

- Expression