Skip to content

Commit 6ae7de0

Browse files
committed
完成矩阵链乘测试
1 parent 491fa9a commit 6ae7de0

10 files changed

+114
-37
lines changed

chap07/quick_sort.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
int partition(int nums[], int begin, int end) {
1111
int small_top = begin;
1212
int key = nums[end-1];
13+
// 分组过程可以看作是把比key小的数压栈
1314
for (int i = begin; i < end; i++) {
1415
if (nums[i] < key) {
1516
swap(nums, small_top, i);

chap09/test_order_statistic.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ static void test_order_statistic() {
1313
shuffle(nums, len);
1414
CU_ASSERT(maximum(nums, len) == len-1);
1515
CU_ASSERT(minimum(nums, len) == 0);
16-
printf("\n");
1716
for (int i = 0; i < 10; i++) {
1817
// CU_ASSERT(randomized_select(nums, 0, len, i) == i);
1918
int rst = linear_select(nums, 0, len, i);

chap15/cut_rod.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,15 @@ int bottom_up_cut_rod(int price_table[], int n) {
7575
for (int i = 1; i <= n; i++) {
7676
int max = INT_MIN;
7777
for (int j = 1; j <= i; j++) {
78-
int cur = max_table[j] + max_table[i-j];
78+
int cur = price_table[j] + max_table[i-j];
7979
if (cur > max) {
8080
max = cur;
8181
}
8282
}
8383
max_table[i] = max;
8484
}
8585
int result = max_table[n];
86+
print_array(max_table, n);
8687
free(max_table);
8788
return result;
8889
}

chap15/matrix_chain_multiplication.c

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@
99
#include <stdlib.h>
1010
#include <limits.h>
1111

12-
struct mcm_slt_s {
13-
int **s;
14-
int **m;
15-
int len;
16-
};
17-
18-
typedef struct mcm_slt_s mcm_slt_t;
1912

2013
void free_mcm_slt(mcm_slt_t slt) {
2114
for (int i = 0; i < slt.len; i++) {
@@ -27,29 +20,54 @@ void free_mcm_slt(mcm_slt_t slt) {
2720
}
2821

2922
mcm_slt_t matrix_chain_order(int p[], int n) {
30-
int len = n+1;
23+
// int len = n+1;
24+
// mcm_slt_t slt;
25+
// slt.s = malloc(len*sizeof(int*));
26+
// slt.m = malloc(len*sizeof(int*));
27+
// for (int i = 0; i < len; i++) {
28+
// slt.s[i] = malloc(len*sizeof(int));
29+
// slt.m[i] = malloc(len*sizeof(int));
30+
// }
31+
// slt.len = n+1;
32+
// for (int i = 1; i < len; i++) {
33+
// slt.m[i][i] = 0;
34+
// }
35+
// for (int l = 1; l < len; l++) {
36+
// for (int i = 1; i < len-l+1; i++) {
37+
// int j = i+l-1;
38+
// slt.m[i][j] = INT_MAX;
39+
// for (int k =i; k < j; k++) {
40+
// int cur = slt.m[i][k] + slt.m[k+1][j] + p[i-1]*p[k]*p[j];
41+
// if (cur < slt.m[i][j]) {
42+
// slt.m[i][j] = cur;
43+
// slt.s[i][j] = k;
44+
// }
45+
// }
46+
// }
47+
// }
48+
// return slt;
49+
// 注意matrix_count = n-1;
3150
mcm_slt_t slt;
32-
slt.s = malloc(len*sizeof(int*));
33-
slt.m = malloc(len*sizeof(int*));
34-
for (int i = 0; i < len; i++) {
35-
slt.s[i] = malloc(len*sizeof(int));
36-
slt.m[i] = malloc(len*sizeof(int));
51+
slt.s = malloc(n*sizeof(int*));
52+
slt.m = malloc(n*sizeof(int*));
53+
for (int i = 0; i < n; i++) {
54+
slt.s[i] = malloc(n*sizeof(int));
55+
slt.m[i] = malloc(n*sizeof(int));
3756
}
38-
slt.len = n+1;
39-
for (int i = 1; i < len; i++) {
57+
slt.len = n;
58+
for (int i = 1; i < n; i++) {
4059
slt.m[i][i] = 0;
4160
}
42-
for (int l = 1; l < len; l++) {
43-
for (int i = 1; i < len-l+1; i++) {
44-
int j = i+l-1;
45-
slt.m[i][j] = INT_MAX;
46-
for (int k =i; k < j; k++) {
47-
int cur = slt.m[i][k] + slt.m[k+1][j] + p[i-1]*p[k]*p[j];
48-
if (cur < slt.m[i][j]) {
49-
slt.m[i][j] = cur;
50-
slt.s[i][j] = k;
61+
for (int j = 2; j < n; j++) {
62+
for (int i = j-1; i > 0; i--) {
63+
int min = INT_MAX;
64+
for (int k = i; k < j; k++) {
65+
int tmp = slt.m[i][k] + slt.m[k+1][j] + p[i-1]*p[k]*p[j];
66+
if (tmp < min) {
67+
min = tmp;
5168
}
5269
}
70+
slt.m[i][j] = min;
5371
}
5472
}
5573
return slt;

chap15/matrix_chain_multiplication.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
#ifndef MATRIX_CHAIN_MULTIPLICATION
22
#define MATRIX_CHAIN_MULTIPLICATION
33

4+
struct mcm_slt_s {
5+
int **s;
6+
int **m;
7+
int len;
8+
};
9+
10+
typedef struct mcm_slt_s mcm_slt_t;
11+
12+
void free_mcm_slt(mcm_slt_t slt);
413
void print_optimal_parens(int p[], int n, int i, int j);
14+
mcm_slt_t matrix_chain_order(int p[], int n);
515

616
#endif

chap15/test_cut_rod.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,9 @@ static int EndSuite() {
1414
}
1515

1616
static void test_cut_rod() {
17-
int p[] = {1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
18-
CU_ASSERT(cut_rod(p, 1) == 1);
19-
CU_ASSERT(cut_rod(p, 2) == 5);
20-
CU_ASSERT(cut_rod(p, 3) == 8);
21-
CU_ASSERT(cut_rod(p, 4) == 10);
22-
CU_ASSERT(cut_rod(p, 5) == 13);
23-
CU_ASSERT(cut_rod(p, 6) == 17);
24-
CU_ASSERT(cut_rod(p, 7) == 18);
25-
CU_ASSERT(cut_rod(p, 8) == 22);
26-
CU_ASSERT(cut_rod(p, 9) == 25);
27-
CU_ASSERT(cut_rod(p, 10) == 30);
17+
int p[] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};
18+
CU_ASSERT(bottom_up_cut_rod(p, 10) == 30);
19+
CU_ASSERT(memoized_cut_rod(p, 10) == 30);
2820
}
2921

3022
CU_ErrorCode add_test_cut_rod() {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "matrix_chain_multiplication.h"
2+
#include "test_matrix_chain_multiplication.h"
3+
#include "../utils.h"
4+
#include <CUnit/CUnit.h>
5+
#include <CUnit/Console.h>
6+
#include <stdio.h>
7+
8+
static int InitSuite() {
9+
return 0;
10+
}
11+
12+
static int EndSuite() {
13+
return 0;
14+
}
15+
16+
static void test_matrix_chain_multi() {
17+
int p[] = {30, 35, 15, 5, 10, 20, 25};
18+
mcm_slt_t slt = matrix_chain_order(p, 7);
19+
CU_ASSERT_EQUAL(slt.m[1][6] , 15125);
20+
free_mcm_slt(slt);
21+
}
22+
23+
CU_ErrorCode add_test_matrix_chain_multi() {
24+
CU_pSuite pSuite = NULL;
25+
26+
/***************
27+
* 1. CU_add_suite 增加一个Suite
28+
* 2. Suite名字 : testSuite
29+
* 3. InitSuite EndSuite:分别是测试单元初始和释放函数,如不需要则NULL传递
30+
****************/
31+
pSuite = CU_add_suite("matrix_chain_multi", InitSuite, EndSuite);
32+
CHECK_CU_GLOBAL();
33+
34+
/***************
35+
* 1. 注册当前Suite下的测试用例 
36+
* 2. pSuite:用例指针
37+
* 3. "Test1": 测试单元名称
38+
* 4. Test1:测试函数
39+
***************/
40+
CU_ADD_TEST(pSuite, test_matrix_chain_multi);
41+
CHECK_CU_GLOBAL();
42+
43+
return CUE_SUCCESS;
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#ifndef TEST_MATRIX_CHAIN_MULTI
2+
#define TEST_MATRIX_CHAIN_MULTI
3+
4+
#include <CUnit/CUnit.h>
5+
6+
CU_ErrorCode add_test_matrix_chain_multi();
7+
8+
#endif

test_main

2.19 KB
Binary file not shown.

test_main.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
#include "chap08/test_counting_sort.h"
77
#include "chap08/test_radix_sort.h"
88
#include "chap09/test_order_statistic.h"
9+
#include "chap15/test_cut_rod.h"
910
#include "chap15/test_optimal_binary_search_tree.h"
1011
#include "chap15/test_longest_common_subsequence.h"
12+
#include "chap15/test_matrix_chain_multiplication.h"
1113
#include "utils.h"
1214
#include <stdio.h>
1315
#include <stdlib.h>
@@ -36,8 +38,10 @@ int main() {
3638
CHECK_CU_RETURN(add_test_counting_sort());
3739
CHECK_CU_RETURN(add_test_radix_sort());
3840
CHECK_CU_RETURN(add_test_order_statistic());
41+
CHECK_CU_RETURN(add_test_cut_rod());
3942
CHECK_CU_RETURN(add_test_obst());
4043
CHECK_CU_RETURN(add_test_lcs());
44+
CHECK_CU_RETURN(add_test_matrix_chain_multi());
4145

4246
//使用console控制交互界面的函数入口
4347
CU_console_run_tests();

0 commit comments

Comments
 (0)