#004 DS&A - 구조와 재귀

소개



안녕하세요 👋 밖에 할 말이 없습니다.
배너에 있는 이 사람이 누구인지 궁금하다면 알고리즘 개념의 발명가인 Khwarizmi입니다.
앞으로 더 발전된 시리즈를 시작할 예정이니 꼭 팔로우 해주세요.

구조


구조 소개



동일한 유형의 요소가 있을 때 배열을 사용합니다. 우리는 이름과 나이와 같은 다른 유형의 요소가 있을 때 구조를 사용합니다. 하나는 정수이고 다른 하나는 문자열입니다.

우리는 다음과 같은 구조를 정의합니다

struct
{
    int i;
    char c;
} x, y , z;

x.i = 10;
x.c = 'a';


이제 x , y and z는 각각 ic를 갖게 됩니다.

우리는 구조 안에 구조를 가질 수 있습니다

struct {
    struct {
        ...
    }
}

struct와 함께 태그를 사용할 수 있습니다.

//this called blueprint and no memory allocated
struct ex 
{
    int i;
    char c;
};
struct ex1
{
    struct ex a;
    struct ex b;
};

// here space will be allocated
struct ex x = {5,'a'};
struct ex1 t;
t.a.i = 10;
t.a.c = 'a';




예 1

struct node
{
    int i;
    int j;
}

struct node a,*p; 
// a is struct of type node
// p is a pointer which point to struct node
p = &a;
// *p.i this is wrong because compiler will treat it like *(p.i) 
(*p).i = 10;
p->i = 10;


포인터를 사용하여 액세스하는 것은 일반적으로 사용됩니다. malloc를 사용하여 만든 경우 이름이 없으므로 프로그래머가 새 연산자를 도입했습니다->.

예 2

struct node
{
    int i;
    int *c;
};
struct node a[2] , *p;
int b[2] = {30 , 40};
p = &a[0];
a[0].i = 10;
a[1].i = 20;
a[0].c = b;




지금까지 주황색 화살표는 다음을 가리키는 것을 의미합니다.

// assume we are resetting every thing after each line
// x = i++ , will take x = i , then after it assign it i will be i+1
++p -> i; // (++(p->i)) , a[0].i will be 11
x=(++p)->i; // p will point to a[1] then x = 20
x=(p++)->i; // x = 10 , then p will point to a[1]
x=*p->c; // *(p->c) , x = 30
x=*p->c++; //  (*((p->c)++)) , x = 30 then c will change it's pointing
x=(*p->c)++; // (*(p->c))++ , x = 30 after that b[0] = 31 
x=*p++->c; // (*( (p++) -> c)) , x = 30


자기 참조 구조




struct ex
{
    int i;
    struct ex *link;
}
struct ex abc;


그것들은 트리와 연결 목록에서 사용됩니다.

you need to make sure before using an pointer that you are already created it or you will get segmentation error



말록



전역 변수는 프로그램이 실행되기 전에 스택에 할당됩니다.

동적으로 할당되어 메모리에 생성됩니다.



스택이 커지고 대부분의 공간이 할당되거나 힙이 할당되거나 둘 다 같은 크기를 차지합니다. 힙에 공간을 요청하고 사용할 수 있습니다.

운영 체제는 프로세스의 크기를 결정합니다.

Unixsblk(n)에서는 힙 내부의 운영 체제에서 n바이트의 포인터를 제공하고 사용합니다.

C에서 우리는 malloc() 운영 체제에서 해당 시스템 호출로 시스템이 무엇인지 묻습니다.

효율성을 위해 시스템을 직접 호출할 수 있습니다.

void* malloc(int);


이것은 빈 메모리를 생성하고 그 포인터를 반환합니다.

int* p = (int*) malloc(2); // 2 bytes
*p = 100;


이와 같이 하드 코딩하면 우리 시스템에서 작동할 수 있지만 다른 시스템에서는 정수에 4바이트가 있으므로 실패합니다.

int *p = (int*)malloc(sizeof(int)); // it will replace with system size of int
free(p);


힙에서 찾을 수 있는 첫 번째 사용 가능한 공간까지 4바이트가 소요되며, 그렇지 않은 경우 운영 체제로 이동하여 공간을 생성합니다.

struct node
{
    int i;
    struct node *l;
};
struct node *p = (struct node*) malloc(sizeof(struct node));
// this how we create a structure
// we can access it using p->i


재귀




A(n)
{
    if(n>0)//1
    {//2
        printf("%d" , n-1);//3
        A(n-1);//4
    }//5
}

main() {
 A(3)
 ...// line i
}
//output : 2 1 0




그런 다음 반환되면 스택을 삭제하기 시작합니다.



필요한 스택은 A(n) = n+1 = O(n)입니다.

시간 복잡도T(n)=c+T(n-1)


프로그램이 스택을 나타내기에 작을 경우 이것은 또 다른 방법입니다.

A(n)
{
    if(n>0)
    {
        pf(n);
        A(n-1);
        pf(n);
    }
}
// output : 3 2 1 1 2 3

T(n) = c+T(n-1)


A(n)
{
    if(n>0)
    {
        A(n-1);
        pf(n);
        A(n-1);
    }
}
// output : 1 2 1




이미 계산된 경우 A(n)을 반복하지 않기 때문에 여기에는 3개의 스택만 필요합니다.

좋은 웹페이지 즐겨찾기