Take action every day.

승자 트리

by 오민
#include <stdio.h>
#include <stdlib.h>

int winner_tree[8];
typedef struct
{
    int data[100];
    int index;//run_array안에서의 위치지정자
    int noe;//run_array의 데이터 개수
} element;
element run_array[8];

int output_count = 0;//출력을 위한 변수
int output_array[800];//출력을 위한 배열

void initialize_data() // run_array의 데이터값들 생성
{
    int num = 0;
    for (int i = 0; i < 14; i++)
        for (int j = 0; j < 8; j++)
        {
            if (num <= 100)
            {
                if ((i % 2) == 0)
                    run_array[j].data[run_array[j].noe++] = num++;
                else
                    run_array[7 - j].data[run_array[7 - j].noe++] = num++;
            }
            else
                break;
        }
}//자세히 보면 데이터의 구성이 특이하다. 과제에서 이렇게 시킴.

int winner(int ri1, int ri2)//승자를 구분짓는 함수
{//매개변수로 각 값이 속한 ri를 받아온다.
    int idx1 = run_array[ri1].index;
    int idx2 = run_array[ri2].index;
    if (run_array[ri1].index == run_array[ri1].noe)//만약 ra1의 인덱스가 이미 ra1의 끝에 도달했다면(데이터가 없다면)
        return ri2;//ri2를 리턴.
    else if (run_array[ri2].index == run_array[ri2].noe)
        return ri1;
    else
    {
        if (run_array[ri1].data[idx1] <= run_array[ri2].data[idx2])//ra1과 ra2의 데이터를 비교
            return ri1;
        else
            return ri2;
    }
}
void print_data() //ra 내용 보여주기
{
    for (int i = 0; i < 8; i++)
    {
        printf("run %d:", i);
        for (int idx = run_array[i].index; idx < run_array[i].noe; idx++)
        {
            if (idx == run_array[i].noe)
                break;
            else
                printf("%4d", run_array[i].data[idx]);
        }
        printf("\n");
    }
}

void initialize_WT() //wt를 채우기
{
    int j;
    for (int i = 0; i < 8; i += 2)
    {
        winner_tree[4 + i / 2] = winner(i, i + 1);
        j = 4 + i / 2;
        winner_tree[j / 2] = winner(winner_tree[(j / 2) * 2], winner_tree[(j / 2) * 2 + 1]);
        winner_tree[j / 2 / 2] = winner(winner_tree[j / 2], winner_tree[j / 2 + 1]);
    }
}

void adjust_WT() //wt를 조정
{
    int runi = winner_tree[1]; //runi에 ri값을 넣어준다(winner_tree[1]에 ri값이 들어있다)
    int lvl3 = 4 + runi / 2;//winner_tree 3층 index.
    int lvl2 = lvl3 / 2;//winner_tree 2층 index.
    int lvl1 = lvl2 / 2;//winner_tree 1층 index.
    run_array[runi].index++;
    winner_tree[lvl3] = winner((runi / 2) * 2, (runi / 2) * 2 + 1);
    winner_tree[lvl2] = winner(winner_tree[lvl2 * 2], winner_tree[lvl2 * 2 + 1]);
    winner_tree[lvl1] = winner(winner_tree[lvl1 * 2], winner_tree[lvl1 * 2 + 1]);
}

void get_top_WT()
{
    //printf("%d ", run_array[winner_tree[1]].data[run_array[winner_tree[1]].index]);
    output_array[output_count++] = run_array[winner_tree[1]].data[run_array[winner_tree[1]].index];
}

void print_WT()
{
    int x;
    printf("The current winner tree: ");
    for (x = 1; x <= 7; x++)
        printf("%d(%d) ", x, winner_tree[x]);
    printf("\n");
}
void print_output_array()
{
    int x;
    for (x = 0; x < output_count; x++)
        printf("%d ", output_array[x]);
    printf("\n");
}

int main(void)
{
    initialize_data();
    print_data();
    initialize_WT();
    print_WT();
    while (1)
    {
        if (run_array[winner_tree[1]].index == run_array[winner_tree[1]].noe)
            break;
        get_top_WT();
        adjust_WT();
        //print_WT();
    }
    print_output_array();
    return 0;
}

adjust_WT부분이 가장 헷갈릴 것이라 친절하게 그림을 그려놨다.

'Language > C' 카테고리의 다른 글

자료구조를 공부하는 나에게  (0) 2021.04.02
Heap  (0) 2021.03.29
포인터  (0) 2021.03.29
BST  (0) 2021.03.28
kmp  (0) 2021.03.18

블로그의 정보

OMIN

오민

활동하기