PKU 2418 Hardwood Species
问题:
http://poj.org/problem?id=2418
思路:
题意清晰明了,不难,用三种方法分别实现:
快速排序
动态生成节点的二叉查找树
静态分配节点的二叉查找树
结果发现,原来对于快速排序与静态分配节点都不是很熟悉,二维数组的快速排序分析见 http://www.cppblog.com/Joe/archive/2010/10/29/131746.html,而动态生成节点则需要注意如果函数需要修改指针,那么必须传递指向指针的指针,因为C是值传递的
另外,我以为静态分配节点应该比动态分配节点节约很多时间的,结果居然差不多...而快速排序在这题明显是最耗时的
代码(快排)
代码(动态分配节点的BST,原本想实现下destroy函数的,结果怕麻烦就留给系统回收吧(*^__^*) 嘻嘻……)
代码(静态分配节点的BST)
http://poj.org/problem?id=2418
思路:
题意清晰明了,不难,用三种方法分别实现:
快速排序
动态生成节点的二叉查找树
静态分配节点的二叉查找树
结果发现,原来对于快速排序与静态分配节点都不是很熟悉,二维数组的快速排序分析见 http://www.cppblog.com/Joe/archive/2010/10/29/131746.html,而动态生成节点则需要注意如果函数需要修改指针,那么必须传递指向指针的指针,因为C是值传递的
另外,我以为静态分配节点应该比动态分配节点节约很多时间的,结果居然差不多...而快速排序在这题明显是最耗时的
代码(快排)
1
/*
35640K 1844MS
*/
2 #include < stdio.h >
3 #include < stdlib.h >
4 #include < string .h >
5 #define MAX_LEN 36
6 #define MAX_NUM 1000001
7 char species[MAX_NUM][MAX_LEN];
8
9 int
10 cmp( const void * arg1, const void * arg2)
11 {
12 return strcmp(( char * )arg1, ( char * )arg2);
13 }
14
15 int
16 main( int argc, char ** argv)
17 {
18 int i, count, total = 0 ;
19 while (gets(species[total]) != NULL)
20 ++ total;
21 qsort(species, total, sizeof (species[ 0 ]), cmp);
22 count = 1 ;
23 for (i = 1 ; i < total; i ++ ) {
24 if (strcmp(species[i], species[i - 1 ]) == 0 )
25 ++ count;
26 else {
27 printf( " %s %.4f\n " , species[i - 1 ], (count * 100.0 ) / total);
28 count = 1 ;
29 }
30 }
31 printf( " %s %.4f\n " , species[total - 1 ], (count * 100.0 ) / total);
32 }
2 #include < stdio.h >
3 #include < stdlib.h >
4 #include < string .h >
5 #define MAX_LEN 36
6 #define MAX_NUM 1000001
7 char species[MAX_NUM][MAX_LEN];
8
9 int
10 cmp( const void * arg1, const void * arg2)
11 {
12 return strcmp(( char * )arg1, ( char * )arg2);
13 }
14
15 int
16 main( int argc, char ** argv)
17 {
18 int i, count, total = 0 ;
19 while (gets(species[total]) != NULL)
20 ++ total;
21 qsort(species, total, sizeof (species[ 0 ]), cmp);
22 count = 1 ;
23 for (i = 1 ; i < total; i ++ ) {
24 if (strcmp(species[i], species[i - 1 ]) == 0 )
25 ++ count;
26 else {
27 printf( " %s %.4f\n " , species[i - 1 ], (count * 100.0 ) / total);
28 count = 1 ;
29 }
30 }
31 printf( " %s %.4f\n " , species[total - 1 ], (count * 100.0 ) / total);
32 }
代码(动态分配节点的BST,原本想实现下destroy函数的,结果怕麻烦就留给系统回收吧(*^__^*) 嘻嘻……)
1
/*
binary search tree(dynamic allocation)
*/
2 /* 544K 1188MS */
3 #include < stdio.h >
4 #include < stdlib.h >
5 #include < string .h >
6 #include < assert.h >
7 #define MAX_LEN 36
8 struct Node {
9 char spec[MAX_LEN];
10 int count;
11 struct Node * left, * right;
12 };
13 int total;
14
15 struct Node *
16 create_node( char * str)
17 {
18 struct Node * node = ( struct Node * )malloc( sizeof ( struct Node));
19 assert(node != NULL);
20 strcpy(node -> spec, str);
21 node -> left = node -> right = NULL;
22 node -> count = 1 ;
23 return node;
24 }
25
26 void
27 insert( struct Node ** root, char * str)
28 {
29 int ret;
30 struct Node * node;
31 if ( * root == NULL) {
32 * root = create_node(str);
33 return ;
34 }
35 ret = strcmp(( * root) -> spec, str);
36 if (ret == 0 )
37 ++ (( * root) -> count);
38 else if (ret < 0 )
39 insert( & (( * root) -> right), str);
40 else
41 insert( & (( * root) -> left), str);
42 }
43
44 void
45 inorder( struct Node * root)
46 {
47 if (root == NULL)
48 return ;
49 inorder(root -> left);
50 printf( " %s %.4f\n " , root -> spec, (root -> count) * 100.0 / total);
51 inorder(root -> right);
52 }
53
54 void
55 destroy( struct Node ** root)
56 {
57 }
58
59 int
60 main( int argc, char ** argv)
61 {
62 char str[MAX_LEN];
63 struct Node * bst = NULL;
64 total = 0 ;
65 while (gets(str) != NULL) {
66 ++ total;
67 insert( & bst, str);
68 }
69 inorder(bst);
70 }
2 /* 544K 1188MS */
3 #include < stdio.h >
4 #include < stdlib.h >
5 #include < string .h >
6 #include < assert.h >
7 #define MAX_LEN 36
8 struct Node {
9 char spec[MAX_LEN];
10 int count;
11 struct Node * left, * right;
12 };
13 int total;
14
15 struct Node *
16 create_node( char * str)
17 {
18 struct Node * node = ( struct Node * )malloc( sizeof ( struct Node));
19 assert(node != NULL);
20 strcpy(node -> spec, str);
21 node -> left = node -> right = NULL;
22 node -> count = 1 ;
23 return node;
24 }
25
26 void
27 insert( struct Node ** root, char * str)
28 {
29 int ret;
30 struct Node * node;
31 if ( * root == NULL) {
32 * root = create_node(str);
33 return ;
34 }
35 ret = strcmp(( * root) -> spec, str);
36 if (ret == 0 )
37 ++ (( * root) -> count);
38 else if (ret < 0 )
39 insert( & (( * root) -> right), str);
40 else
41 insert( & (( * root) -> left), str);
42 }
43
44 void
45 inorder( struct Node * root)
46 {
47 if (root == NULL)
48 return ;
49 inorder(root -> left);
50 printf( " %s %.4f\n " , root -> spec, (root -> count) * 100.0 / total);
51 inorder(root -> right);
52 }
53
54 void
55 destroy( struct Node ** root)
56 {
57 }
58
59 int
60 main( int argc, char ** argv)
61 {
62 char str[MAX_LEN];
63 struct Node * bst = NULL;
64 total = 0 ;
65 while (gets(str) != NULL) {
66 ++ total;
67 insert( & bst, str);
68 }
69 inorder(bst);
70 }
代码(静态分配节点的BST)
1
/*
binary search tree(static allocation)
*/
2 /* 492K 1188MS */
3 #include < stdio.h >
4 #include < stdlib.h >
5 #include < string .h >
6 #include < assert.h >
7 #define MAX_LEN 36
8 #define MAX_NUM 10007
9 #define ROOT 1
10 struct Node {
11 char spec[MAX_LEN];
12 int count;
13 int left, right;
14 }bst[MAX_NUM];
15 int cur_index, total;
16
17 int
18 find( int root, char * str)
19 {
20 int ret, parent, cur = root;
21 while (cur != 0 ) {
22 parent = cur;
23 ret = strcmp(bst[cur].spec, str);
24 if (ret == 0 ) {
25 ++ bst[cur].count;
26 return 0 ;
27 } else if (ret < 0 ) {
28 cur = bst[cur].right;
29 } else {
30 cur = bst[cur].left;
31 }
32 }
33 return parent;
34 }
35
36 #define ADD(index, str) { \
37 strcpy(bst[index].spec, str); \
38 bst[index].left = bst[index].right = 0 ; \
39 bst[index].count = 1 ; \
40 ++ index; }
41
42 void
43 insert( int parent, char * str)
44 {
45 int ret = strcmp(bst[parent].spec, str);
46 assert(ret != 0 );
47 if (ret < 0 )
48 bst[parent].right = cur_index;
49 else
50 bst[parent].left = cur_index;
51 ADD(cur_index, str);
52 }
53
54 void
55 inorder( int index)
56 {
57 if (index == 0 )
58 return ;
59 inorder(bst[index].left);
60 printf( " %s %.4f\n " , bst[index].spec, (bst[index].count * 100.0 ) / total);
61 inorder(bst[index].right);
62 }
63
64 int
65 main( int argc, char ** argv)
66 {
67 int parent;
68 char str[MAX_LEN];
69 total = 1 ;
70 cur_index = ROOT;
71 gets(str);
72 ADD(cur_index, str); /* create the root node first */
73 while (gets(str) != NULL) {
74 ++ total;
75 if ((parent = find(ROOT, str)) > 0 )
76 insert(parent, str);
77 }
78 inorder(ROOT);
79 }
2 /* 492K 1188MS */
3 #include < stdio.h >
4 #include < stdlib.h >
5 #include < string .h >
6 #include < assert.h >
7 #define MAX_LEN 36
8 #define MAX_NUM 10007
9 #define ROOT 1
10 struct Node {
11 char spec[MAX_LEN];
12 int count;
13 int left, right;
14 }bst[MAX_NUM];
15 int cur_index, total;
16
17 int
18 find( int root, char * str)
19 {
20 int ret, parent, cur = root;
21 while (cur != 0 ) {
22 parent = cur;
23 ret = strcmp(bst[cur].spec, str);
24 if (ret == 0 ) {
25 ++ bst[cur].count;
26 return 0 ;
27 } else if (ret < 0 ) {
28 cur = bst[cur].right;
29 } else {
30 cur = bst[cur].left;
31 }
32 }
33 return parent;
34 }
35
36 #define ADD(index, str) { \
37 strcpy(bst[index].spec, str); \
38 bst[index].left = bst[index].right = 0 ; \
39 bst[index].count = 1 ; \
40 ++ index; }
41
42 void
43 insert( int parent, char * str)
44 {
45 int ret = strcmp(bst[parent].spec, str);
46 assert(ret != 0 );
47 if (ret < 0 )
48 bst[parent].right = cur_index;
49 else
50 bst[parent].left = cur_index;
51 ADD(cur_index, str);
52 }
53
54 void
55 inorder( int index)
56 {
57 if (index == 0 )
58 return ;
59 inorder(bst[index].left);
60 printf( " %s %.4f\n " , bst[index].spec, (bst[index].count * 100.0 ) / total);
61 inorder(bst[index].right);
62 }
63
64 int
65 main( int argc, char ** argv)
66 {
67 int parent;
68 char str[MAX_LEN];
69 total = 1 ;
70 cur_index = ROOT;
71 gets(str);
72 ADD(cur_index, str); /* create the root node first */
73 while (gets(str) != NULL) {
74 ++ total;
75 if ((parent = find(ROOT, str)) > 0 )
76 insert(parent, str);
77 }
78 inorder(ROOT);
79 }