검색결과 리스트
Data Structure에 해당되는 글 4건
- 2019.02.13 Linked List 5
- 2019.02.10 Merge Sort
- 2019.01.22 Hash 3
- 2019.01.11 Heap 6
글
Linked List
Data Structure
2019. 2. 13. 23:00
#include <stdio.h>
#include <algorithm>
#include <list>
#include "Windows.h"
using namespace std;
struct NODE {
int prev;
int next;
int val;
};
const int NODE_SIZE = 30000;
//TEST CMD
const int PUSH_BACK = 0;
const int PUSH_FRONT = 1;
const int INSERT = 2;
const int POP_BACK = 3;
const int POP_FRONT = 4;
const int ERASE = 5;
int test_cmd[NODE_SIZE][3];
struct MY_LIST {
int HEAD = NODE_SIZE;
int TAIL = NODE_SIZE + 1;
int pos;
NODE node[NODE_SIZE + 2];
MY_LIST() {
pos = 0;
node[HEAD].next = TAIL;
node[TAIL].prev = HEAD;
}
void push_back(int data) {
int prev = node[TAIL].prev;
int next = node[prev].next; // TAIL;
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
++pos;
}
void push_front(int data) {
int next = node[HEAD].next;
int prev = node[next].prev; // HEAD
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
++pos;
}
void insert(int p, int data) {
int next = node[HEAD].next;
for(int i = 0; i < p; ++i) {
next = node[next].next;
}
int prev = node[next].prev;
node[pos].val = data;
node[pos].prev = prev;
node[prev].next = pos;
node[pos].next = next;
node[next].prev = pos;
++pos;
}
void pop_back() {
int target = node[TAIL].prev;
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
}
void pop_front() {
int target = node[HEAD].next;
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
}
void erase(int p) {
int target = node[HEAD].next;
for (int i = 0; i < p; ++i) {
target = node[target].next;
}
int prev = node[target].prev;
int next = node[target].next;
node[prev].next = next;
node[next].prev = prev;
}
};
MY_LIST my_list;
list<int> stl_list;
int main()
{
// make test case..
int cur_size = 0;
for (int i = 0; i < NODE_SIZE; ++i) {
if (i < NODE_SIZE / 3) {
test_cmd[i][0] = rand() % 2;
}
else {
test_cmd[i][0] = rand() % 6;
}
switch (test_cmd[i][0]) {
case PUSH_BACK:
case PUSH_FRONT: {
test_cmd[i][1] = rand();
++cur_size;
break;
}
case INSERT: {
test_cmd[i][1] = rand() % cur_size;
test_cmd[i][2] = rand();
++cur_size;
break;
}
case POP_BACK:
case POP_FRONT: {
--cur_size;
break;
}
case ERASE: {
test_cmd[i][1] = rand() % cur_size;
--cur_size;
break;
}
}
}
// test my list
int my_list_begin = GetTickCount();
for (int i = 0; i < NODE_SIZE; ++i) {
switch (test_cmd[i][0]) {
case PUSH_BACK: {
my_list.push_back(test_cmd[i][1]);
break;
}
case PUSH_FRONT: {
my_list.push_front(test_cmd[i][1]);
break;
}
case INSERT: {
my_list.insert(test_cmd[i][1], test_cmd[i][2]);
break;
}
case POP_BACK: {
my_list.pop_back();
break;
}
case POP_FRONT: {
my_list.pop_front();
break;
}
case ERASE: {
my_list.erase(test_cmd[i][1]);
break;
}
}
}
int my_list_end = GetTickCount();
// test stl list
int stl_list_begin = GetTickCount();
for (int i = 0; i < NODE_SIZE; ++i) {
switch (test_cmd[i][0]) {
case PUSH_BACK: {
stl_list.push_back(test_cmd[i][1]);
break;
}
case PUSH_FRONT: {
stl_list.push_front(test_cmd[i][1]);
break;
}
case INSERT: {
list<int>::iterator it = stl_list.begin();
for (int k = 0; k < test_cmd[i][1]; ++k) {
++it;
}
stl_list.insert(it, test_cmd[i][2]);
break;
}
case POP_BACK: {
stl_list.pop_back();
break;
}
case POP_FRONT: {
stl_list.pop_front();
break;
}
case ERASE: {
list<int>::iterator it = stl_list.begin();
for (int k = 0; k < test_cmd[i][1]; ++k) {
++it;
}
stl_list.erase(it);
break;
}
}
}
int stl_list_end = GetTickCount();
//time compare
printf("my list : %d\n", (my_list_end - my_list_begin));
printf("stl list : %d\n", (stl_list_end - stl_list_begin));
//result test
list<int>::iterator it = stl_list.begin();
int cur = my_list.node[my_list.HEAD].next;
while (it != stl_list.end()) {
if (*it != my_list.node[cur].val) {
printf("Error\n");
}
++it;
cur = my_list.node[cur].next;
}
return 0;
}글
Merge Sort
Data Structure
2019. 2. 10. 23:43
#include <stdio.h>
#include "Windows.h"
#include <algorithm>
using namespace std;
const int MAX_SIZE = 500000;
int arr_size;
int ms[MAX_SIZE], qs[MAX_SIZE], stls[MAX_SIZE], buf[MAX_SIZE];
void merge_sort(int* p, int len) {
if (len < 2) return;
int i, j, k, mid;
mid = (len / 2);
i = 0, j = mid, k = 0;
merge_sort(p, mid);
merge_sort((p + mid), (len - mid));
while (i < mid && j < len) {
if (p[i] < p[j]) {
buf[k++] = p[i++];
}
else {
buf[k++] = p[j++];
}
}
while (i < mid) {
buf[k++] = p[i++];
}
while (j < len) {
buf[k++] = p[j++];
}
for (int i = 0; i < len; ++i) {
p[i] = buf[i];
}
}
void qsort(int* p, int left, int right) {
if (left >= right) return;
int l = left - 1;
int r = right + 1;
int mid = p[(l + r) / 2];
while (1) {
while (p[++l] < mid);
while (p[--r] > mid);
if (l >= r) break;
int temp = p[l];
p[l] = p[r];
p[r] = temp;
}
qsort(p, left, l - 1);
qsort(p, r + 1, right);
}
int main()
{
arr_size = MAX_SIZE;
for (int i = 0; i < arr_size; ++i) {
ms[i] = rand();
qs[i] = stls[i] = ms[i];
}
int quick_sort_begin = GetTickCount();
qsort(qs, 0, arr_size - 1);
int quick_sort_end = GetTickCount();
int merge_sort_begin = GetTickCount();
merge_sort(ms, arr_size);
int merge_sort_end = GetTickCount();
int stl_sort_begin = GetTickCount();
sort(stls, stls + arr_size);
int stl_sort_end = GetTickCount();
printf("my quick sort : %d\n", (quick_sort_end - quick_sort_begin));
printf("my merge sort : %d\n", (merge_sort_end - merge_sort_begin));
printf("stl sort : %d\n", (stl_sort_end - stl_sort_begin));
printf("=====================================\n");
quick_sort_begin = GetTickCount();
qsort(qs, 0, arr_size - 1);
quick_sort_end = GetTickCount();
merge_sort_begin = GetTickCount();
merge_sort(ms, arr_size);
merge_sort_end = GetTickCount();
stl_sort_begin = GetTickCount();
sort(stls, stls + arr_size);
stl_sort_end = GetTickCount();
printf("my quick sort : %d\n", (quick_sort_end - quick_sort_begin));
printf("my merge sort : %d\n", (merge_sort_end - merge_sort_begin));
printf("stl sort : %d\n", (stl_sort_end - stl_sort_begin));
printf("=====================================\n");
for (int i = 0; i < arr_size; ++i) {
if (qs[i] != stls[i] || ms[i] != stls[i]) {
printf("Error\n");
}
}
return 0;
}
글
Hash
Data Structure
2019. 1. 22. 22:59
#include <stdio.h>
#include <map>
#include <algorithm>
#include "Windows.h"
using namespace std;
const int PN = 23;
const int HASH_SIZE = 10000;
int table[HASH_SIZE][50];
int hash_size = 0;
char hash_raw[30000][100];
char input[30000][100];
map<char*, int> test;
unsigned int get_key(char str[]) {
unsigned int key = 0, p = 1;
for (int i = 0; str[i] != 0; ++i) {
key += (str[i] * p);
p *= PN;
}
return (key % HASH_SIZE);
}
int my_strcamp(char a[], char b[]) {
int i = 0, j = 0;
while (a[i]) {
if (a[i++] != b[j++]) {
--i, --j;
break;
}
}
return (a[i] - b[j]);
}
int contain(char str[]) {
unsigned int key = get_key(str);
int size = table[key][0];
for (int i = 1; i <= size; ++i) {
int pos = table[key][i];
if (my_strcamp(hash_raw[pos], str) == 0) {
return pos;
}
}
return -1;
}
void add(char str[]) {
int len = 0;
for (len = 0; str[len] != 0; ++len) {
hash_raw[hash_size][len] = str[len];
}
hash_raw[hash_size][len] = 0;
unsigned int key = get_key(str);
int& size = table[key][0];
table[key][++size] = hash_size;
++hash_size;
}
bool remove(char str[]) {
unsigned int key = get_key(str);
int& size = table[key][0];
for (int i = 1; i <= size; ++i) {
int pos = table[key][i];
if (my_strcamp(hash_raw[pos], str) == 0) {
for (int j = i + 1; j <= size; ++j) {
table[key][j - 1] = table[key][j];
}
--size;
return true;
}
}
return false;
}
int make_int(int min, int max) {
return (rand() % (max - min)) + min;
}
char make_char() {
int val = rand() % 52;
if (val < 26) {
return static_cast<char>('a' + val);
}
return static_cast<char>('A' + val - 26);
}
int main()
{
for (int i = 0; i < 30000; ++i) {
int len = make_int(10, 100);
for (int j = 0; j < len; ++j) {
input[i][j] = make_char();
}
input[i][len] = 0;
if (contain(input[i]) == -1) {
add(input[i]);
}
test[input[i]] = i;
if (i > 20000) {
int cmd = make_int(0, 5);
int index = make_int(0, i);
if (cmd == 0) {
if (contain(input[index]) != -1) {
remove(input[index]);
}
test.erase(input[index]);
}
if (cmd == 1) {
int my_pos = contain(input[index]);
map<char*, int>::iterator iter = test.find(input[index]);
int stl_pos = -1;
if (iter != test.end()) {
stl_pos = iter->second;
}
if (my_pos != stl_pos) {
printf("find error!!!\n");
}
}
}
}
int my_hash_size = 0;
for (int i = 0; i < HASH_SIZE; ++i) {
my_hash_size += table[i][0];
}
if (my_hash_size != test.size()) {
printf("remove error!!!\n");
}
return 0;
}
글
Heap
Data Structure
2019. 1. 11. 22:36
#include <stdio.h>
#include <algorithm>
#include "Windows.h"
using namespace std;
int heap_size;
int heap[10000];
void push(int data) {
int target = heap_size + 1;
while (target != 1 && heap[target / 2] < data) {
heap[target] = heap[target / 2];
target /= 2;
}
heap[target] = data;
++heap_size;
}
void pop() {
int parent = 1, child = 2;
int temp = heap[heap_size];
while (child < heap_size) {
if (child + 1 < heap_size && heap[child] < heap[child + 1]) {
++child;
}
if (temp >= heap[child]) {
break;
}
heap[parent] = heap[child];
parent = child;
child *= 2;
}
heap[parent] = temp;
--heap_size;
}
bool comp(int a, int b) {
return (a > b);
}
int main()
{
int a[10000], b[10000];
for (int i = 0; i < 9999; ++i) {
a[i] = rand() % 10000;
b[i] = a[i];
}
sort(a, a + 9999, comp);
for (int i = 0; i < 9999; ++i) {
push(b[i]);
}
for (int i = 0; i < 9999; ++i) {
if (a[i] != heap[1]) {
printf("not heap!!!\n");
}
pop();
}
return 0;
}