승자 트리
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부분이 가장 헷갈릴 것이라 친절하게 그림을 그려놨다.
블로그의 정보
OMIN
오민