• 数据结构HW1


     1.(10分) 编程实现矩阵乘法(源文件命名matrix.c)。函数定义如下:

    int matmult (int a[][], int b[][]) {

        // 注意判断ab维度可能不匹配,且可能是空矩阵

    }

    1. #include
    2. // 定义矩阵的最大维度
    3. #define MAX_ROWS 100
    4. #define MAX_COLS 100
    5. // 矩阵乘法函数
    6. int matmult(int a[][MAX_COLS], int b[][MAX_COLS], int c[][MAX_COLS], int rows_a, int cols_a,int rows_b, int cols_b) {
    7. if (cols_a != rows_b) {
    8. printf("矩阵维度不匹配,无法相乘。\n");
    9. return 0;
    10. }
    11. for (int i = 0; i < rows_a; i++) {
    12. for (int j = 0; j < cols_b; j++) {
    13. c[i][j] = 0;
    14. for (int k = 0; k < cols_a; k++) {
    15. c[i][j] += a[i][k] * b[k][j];
    16. }
    17. }
    18. }
    19. return 1; // 成功执行矩阵乘法
    20. }
    21. int main(){
    22. int rows_a, cols_a, rows_b, cols_b;
    23. printf("输入矩阵A的行数和列数:");
    24. scanf("%d %d",&rows_a, &cols_a);
    25. printf("输入矩阵B的行数和列数:");
    26. scanf("%d %d",&rows_b, &cols_b);
    27. // 检查是否为空矩阵
    28. if (cols_a == rows_a == 0 || cols_b == rows_b == 0){
    29. printf("输入为空矩阵。\n");
    30. return 1;
    31. }
    32. // 检查维度是否匹配
    33. if (cols_a != rows_b) {
    34. printf("矩阵维度不匹配,无法相乘。\n");
    35. return 1;
    36. }
    37. // 定义矩阵A,B和结果矩阵C
    38. int matrixA[MAX_ROWS][MAX_COLS];
    39. int matrixB[MAX_ROWS][MAX_COLS];
    40. int matrixC[MAX_ROWS][MAX_COLS];
    41. printf("输入矩阵A的元素:\n");
    42. for (int i = 0; i < rows_a; i++) {
    43. for (int j = 0; j < cols_a; j++) {
    44. scanf("%d", &matrixA[i][j]);
    45. }
    46. }
    47. printf("输入矩阵B的元素:\n");
    48. for (int i = 0; i < rows_b; i++) {
    49. for (int j = 0; j < cols_b; j++) {
    50. scanf("%d", &matrixB[i][j]);
    51. }
    52. }
    53. if (matmult(matrixA, matrixB, matrixC, rows_a, cols_a,rows_b, cols_b)) {
    54. printf("矩阵乘法的结果矩阵C为:\n");
    55. for (int i = 0; i < rows_a; i++) {
    56. for (int j = 0; j < cols_b; j++) {
    57. printf("%d ", matrixC[i][j]);
    58. }
    59. printf("\n");
    60. }
    61. }
    62. return 0;
    63. }

    2. (10分) 编程实现二分查找(源文件命名binary_search.c)。函数定义如下:

    int b_search (int a[], int x) {

        // 注意判断a可能是空数组

    }

    1. #include
    2. int b_search(int a[], int x, int left, int right) {
    3. // 如果左边界大于右边界,说明目标元素不在数组中
    4. if (left > right) {
    5. return -1;
    6. }
    7. // 计算中间索引
    8. int mid = left + (right - left) / 2;
    9. // 如果中间元素等于目标元素,返回中间索引
    10. if (a[mid] == x) {
    11. return mid;
    12. }
    13. // 如果中间元素大于目标元素,在左半边继续搜索
    14. if (a[mid] > x) {
    15. return b_search(a, x, left, mid - 1);
    16. }
    17. // 否则,在右半边继续搜索
    18. return b_search(a, x, mid + 1, right);
    19. }
    20. int main() {
    21. int n , i = 0;
    22. printf("请输入数组中元素的个数:");
    23. scanf("%d",&n);
    24. if(n==0){//判断空数组
    25. printf("判断为空数组!");
    26. return 0;
    27. }
    28. int a[n];
    29. printf("请输入数组的元素:");
    30. for(i=0;i
    31. scanf("%d",&a[i]);
    32. }
    33. int x;
    34. printf("请输入你想要查找的数:");
    35. scanf("%d",&x);
    36. int result = b_search(a, x, 0, n - 1);
    37. if (result != -1) {
    38. printf("目标元素 %d 在数组中的索引位置是 %d\n", x, result);
    39. } else {
    40. printf("目标元素 %d 未在数组中找到\n", x);
    41. }
    42. return 0;
    43. }

    3. (20分) 编程实现课件《绪论》中的“引例3”,需实现三种方法且进行比较(源文件命名search.c)。问题的输入是两个数组int a[], int x[],长度分别是n, m;输出int ans[]是一个取值+1或-1的数组,ans[i]=1代表x[i]在a[]中出现过,否则为-1。a[]和x[]数组中的元素自行随机生成(需调用C语言中的随机数生成库)。试生成不同量级的数组长度,比较三种方法的实际运行时间(需调用C语言中的计时库),完成下表:

    n=100, m=100

    n=103, m=103

    n=105, m=105

    n=108, m=108

    方法一

    (填程序的实际运行时间,如:0.2s)

    (若太长可不记录)

    方法二

    方法三

    1. #include
    2. #include
    3. #include
    4. // 暴力寻找方法
    5. void brute_force_search(int a[], int x[], int ans[], int n, int m) {
    6. for (int i = 0; i < m; i++) {
    7. ans[i] = -1; // 初始化ans数组为-1
    8. for (int j = 0; j < n; j++) {
    9. if (x[i] == a[j]) {
    10. ans[i] = 1; // 如果找到x[i],将ans[i]设置为1
    11. break;
    12. }
    13. }
    14. }
    15. }
    16. // 二分查找方法
    17. int binary_search(int a[], int x, int left, int right) {
    18. if (left > right) {
    19. return -1;
    20. }
    21. int mid = left + (right - left) / 2;
    22. if (a[mid] == x) {
    23. return mid;
    24. } else if (a[mid] > x) {
    25. return binary_search(a, x, left, mid - 1);
    26. } else {
    27. return binary_search(a, x, mid + 1, right);
    28. }
    29. }
    30. // 使用哈希集方法
    31. void hash_set_search(int a[], int x[], int ans[], int n, int m) {
    32. // 创建哈希集合
    33. int max_element = 0; // 计算a数组中的最大元素
    34. for (int i = 0; i < n; i++) {
    35. if (a[i] > max_element) {
    36. max_element = a[i];
    37. }
    38. }
    39. int *hash_set = (int *)malloc((max_element + 1) * sizeof(int));
    40. if (hash_set == NULL) {
    41. fprintf(stderr, "内存分配失败\n");
    42. exit(1);
    43. }
    44. for (int i = 0; i < n; i++) {
    45. hash_set[a[i]] = 1;
    46. }
    47. for (int i = 0; i < m; i++) {
    48. ans[i] = hash_set[x[i]];
    49. }
    50. free(hash_set); // 释放哈希集合内存
    51. }
    52. int main() {
    53. // 随机数种子,用于初始化伪随机数生成器
    54. srand(time(NULL));
    55. int n = 100; // 数组a的长度
    56. int m = 100; // 数组x的长度
    57. // 创建数组a和x,并初始化为随机数
    58. int *a = (int *)malloc(n * sizeof(int));
    59. int *x = (int *)malloc(m * sizeof(int));
    60. if (a == NULL || x == NULL) {
    61. fprintf(stderr, "内存分配失败\n");
    62. return 1;
    63. }
    64. for (int i = 0; i < n; i++) {
    65. a[i] = rand() % 10000; // 随机生成0到9999之间的整数
    66. }
    67. for (int i = 0; i < m; i++) {
    68. x[i] = rand() % 10000; // 随机生成0到9999之间的整数
    69. }
    70. // 创建用于存储结果的数组ans
    71. int *ans = (int *)malloc(m * sizeof(int));
    72. if (ans == NULL) {
    73. fprintf(stderr, "内存分配失败\n");
    74. return 1;
    75. }
    76. // 测量暴力寻找方法的运行时间
    77. clock_t start_time = clock();
    78. brute_force_search(a, x, ans, n, m);
    79. clock_t end_time = clock();
    80. double elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
    81. printf("暴力寻找方法运行时间: %lf 秒\n", elapsed_time);
    82. // 清空ans数组
    83. for (int i = 0; i < m; i++) {
    84. ans[i] = -1;
    85. }
    86. // 测量二分查找方法的运行时间
    87. start_time = clock();
    88. for (int i = 0; i < m; i++) {
    89. int result = binary_search(a, x[i], 0, n - 1);
    90. if (result != -1) {
    91. ans[i] = 1;
    92. }
    93. }
    94. end_time = clock();
    95. elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
    96. printf("二分查找方法运行时间: %lf 秒\n", elapsed_time);
    97. // 清空ans数组
    98. for (int i = 0; i < m; i++) {
    99. ans[i] = -1;
    100. }
    101. // 测量使用哈希集方法的运行时间
    102. start_time = clock();
    103. hash_set_search(a, x, ans, n, m);
    104. end_time = clock();
    105. elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;
    106. printf("使用哈希集方法运行时间: %lf 秒\n", elapsed_time);
    107. // 释放动态分配的内存
    108. free(a);
    109. free(x);
    110. free(ans);
    111. return 0;
    112. }

  • 相关阅读:
    给Python漫画分集标题目录下载工具添加从列表文件下载功能
    JVM(二十二)—— 垃圾回收器(二)CMS垃圾回收器
    VPP数据预取指令
    目标检测 Faster RCNN全面解读复现
    【前端性能优化】 --- 一次总结明白
    【数据可视化】—大屏数据可视化展示
    面向对象设计模式
    Vim基础使用
    每日一练Day04:寻找单身狗
    一款新型的Linux服务器管理工具
  • 原文地址:https://blog.csdn.net/Allencc5658/article/details/134228084