数据结构HW1

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

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

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

}

#include<stdio.h>// 定义矩阵的最大维度
#define MAX_ROWS 100
#define MAX_COLS 100// 矩阵乘法函数
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) {if (cols_a != rows_b) {printf("矩阵维度不匹配,无法相乘。\n");return 0;}for (int i = 0; i < rows_a; i++) {for (int j = 0; j < cols_b; j++) {c[i][j] = 0;for (int k = 0; k < cols_a; k++) {c[i][j] += a[i][k] * b[k][j];}}}return 1; // 成功执行矩阵乘法
}
int main(){int rows_a, cols_a, rows_b, cols_b;printf("输入矩阵A的行数和列数:");scanf("%d %d",&rows_a, &cols_a);printf("输入矩阵B的行数和列数:");scanf("%d %d",&rows_b, &cols_b);// 检查是否为空矩阵if (cols_a == rows_a == 0 || cols_b == rows_b == 0){printf("输入为空矩阵。\n");return 1;}// 检查维度是否匹配if (cols_a != rows_b) {printf("矩阵维度不匹配,无法相乘。\n");return 1;}// 定义矩阵A,B和结果矩阵Cint matrixA[MAX_ROWS][MAX_COLS];int matrixB[MAX_ROWS][MAX_COLS];int matrixC[MAX_ROWS][MAX_COLS];printf("输入矩阵A的元素:\n");for (int i = 0; i < rows_a; i++) {for (int j = 0; j < cols_a; j++) {scanf("%d", &matrixA[i][j]);}}printf("输入矩阵B的元素:\n");for (int i = 0; i < rows_b; i++) {for (int j = 0; j < cols_b; j++) {scanf("%d", &matrixB[i][j]);}}if (matmult(matrixA, matrixB, matrixC, rows_a, cols_a,rows_b, cols_b)) {printf("矩阵乘法的结果矩阵C为:\n");for (int i = 0; i < rows_a; i++) {for (int j = 0; j < cols_b; j++) {printf("%d ", matrixC[i][j]);}printf("\n");}}return 0;
}

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

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

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

}

#include <stdio.h>int b_search(int a[], int x, int left, int right) {// 如果左边界大于右边界,说明目标元素不在数组中if (left > right) {return -1;}// 计算中间索引int mid = left + (right - left) / 2;// 如果中间元素等于目标元素,返回中间索引if (a[mid] == x) {return mid;}// 如果中间元素大于目标元素,在左半边继续搜索if (a[mid] > x) {return b_search(a, x, left, mid - 1);}// 否则,在右半边继续搜索return b_search(a, x, mid + 1, right);
}int main() {int n , i = 0;printf("请输入数组中元素的个数:");scanf("%d",&n);if(n==0){//判断空数组printf("判断为空数组!");return 0;}int a[n];printf("请输入数组的元素:");for(i=0;i<n;i++){scanf("%d",&a[i]);}int x;printf("请输入你想要查找的数:");scanf("%d",&x);int result = b_search(a, x, 0, n - 1);if (result != -1) {printf("目标元素 %d 在数组中的索引位置是 %d\n", x, result);} else {printf("目标元素 %d 未在数组中找到\n", x);}return 0;
}

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)

(若太长可不记录)

方法二

方法三

#include <stdio.h>
#include <stdlib.h>
#include <time.h>// 暴力寻找方法
void brute_force_search(int a[], int x[], int ans[], int n, int m) {for (int i = 0; i < m; i++) {ans[i] = -1;  // 初始化ans数组为-1for (int j = 0; j < n; j++) {if (x[i] == a[j]) {ans[i] = 1;  // 如果找到x[i],将ans[i]设置为1break;}}}
}// 二分查找方法
int binary_search(int a[], int x, int left, int right) {if (left > right) {return -1;}int mid = left + (right - left) / 2;if (a[mid] == x) {return mid;} else if (a[mid] > x) {return binary_search(a, x, left, mid - 1);} else {return binary_search(a, x, mid + 1, right);}
}// 使用哈希集方法
void hash_set_search(int a[], int x[], int ans[], int n, int m) {// 创建哈希集合int max_element = 0; // 计算a数组中的最大元素for (int i = 0; i < n; i++) {if (a[i] > max_element) {max_element = a[i];}}int *hash_set = (int *)malloc((max_element + 1) * sizeof(int));if (hash_set == NULL) {fprintf(stderr, "内存分配失败\n");exit(1);}for (int i = 0; i < n; i++) {hash_set[a[i]] = 1;}for (int i = 0; i < m; i++) {ans[i] = hash_set[x[i]];}free(hash_set); // 释放哈希集合内存
}int main() {// 随机数种子,用于初始化伪随机数生成器srand(time(NULL));int n = 100; // 数组a的长度int m = 100;  // 数组x的长度// 创建数组a和x,并初始化为随机数int *a = (int *)malloc(n * sizeof(int));int *x = (int *)malloc(m * sizeof(int));if (a == NULL || x == NULL) {fprintf(stderr, "内存分配失败\n");return 1;}for (int i = 0; i < n; i++) {a[i] = rand() % 10000;  // 随机生成0到9999之间的整数}for (int i = 0; i < m; i++) {x[i] = rand() % 10000;  // 随机生成0到9999之间的整数}// 创建用于存储结果的数组ansint *ans = (int *)malloc(m * sizeof(int));if (ans == NULL) {fprintf(stderr, "内存分配失败\n");return 1;}// 测量暴力寻找方法的运行时间clock_t start_time = clock();brute_force_search(a, x, ans, n, m);clock_t end_time = clock();double elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;printf("暴力寻找方法运行时间: %lf 秒\n", elapsed_time);// 清空ans数组for (int i = 0; i < m; i++) {ans[i] = -1;}// 测量二分查找方法的运行时间start_time = clock();for (int i = 0; i < m; i++) {int result = binary_search(a, x[i], 0, n - 1);if (result != -1) {ans[i] = 1;}}end_time = clock();elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;printf("二分查找方法运行时间: %lf 秒\n", elapsed_time);// 清空ans数组for (int i = 0; i < m; i++) {ans[i] = -1;}// 测量使用哈希集方法的运行时间start_time = clock();hash_set_search(a, x, ans, n, m);end_time = clock();elapsed_time = (double)(end_time - start_time) / CLOCKS_PER_SEC;printf("使用哈希集方法运行时间: %lf 秒\n", elapsed_time);// 释放动态分配的内存free(a);free(x);free(ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】hash数据类型-常用命令

文章目录 前置知识常用命令HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGET关于HMSETHLENHSETNXHINCRBYHINCRBYFLOAT 命令小结 前置知识 redis自身就是键值对结构了&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如key"key"&#xff0c;value{{field1…

windows10编译高版本openssl

参考文章 参考文章中的windows编译为低版本&#xff0c;在高版本的openssl编译中已经没有&#xff1a;“ms\do_ms.bat”这个脚本了&#xff0c;现记录下编译过程 1、准备工作 安装ActivePerl&#xff0c;安装后会自动写入环境变量&#xff0c;参照参考文章测试安装成功与否&a…

前端框架Vue学习 ——(七)Vue路由(Vue Router)

文章目录 Vue路由使用场景Vue Router 介绍Vue Router 使用 Vue路由使用场景 使用场景&#xff1a;如下图&#xff0c;点击部门管理的时候显示部门管理的组件&#xff0c;员工管理的时候显示员工管理的组件。 前端路由&#xff1a;指的是 URL 中的 hash(#号)与组件之间的对应关…

k8spod详解其二

一&#xff0c;资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小&#xff0c;以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时&#xff0c;调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为…

软件开发必备神器!一文读懂10款热门看板工具推荐!

看板&#xff08;Kanban&#xff09;是一种流行的框架&#xff0c;用于实施敏捷和DevOps软件开发。它要求实时沟通每个人的能力&#xff0c;并全面透明地展示正在进行的工作。工作项目在看板上以可视化方式表示&#xff0c;使项目经理和所有团队成员可以随时查看每个工作的状态…

比特币全节点同步加速记录(使用Bitcoin Core钱包)

1. 预先下载或从别的地方拷贝区块数据而不是直接在Bitcoin Core钱包中下载 这方面可以参考 截止到2022年8月的区块数据 2. 将区块头数据和区块实体数据分开存储 区块头数据放到SSD中&#xff0c;区块实体数据放到HDD中 这方面可以参考 BitcoinCore节点同步加速原理和方法实验…

“网站不安全”该如何解决

当我们的网站被客户访问的时候&#xff0c;经常会出现提示不安全的情况&#xff0c;导致客户的不信任&#xff0c;从而出现客户流失的现象&#xff0c;这种情况我们应该如何解决呢&#xff1f; 首先&#xff0c;我们要确定网站会出现不安全的原因&#xff0c;一般来说&#xff…

vue项目中订单完成提交按钮动画

1. 动画1 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Order</title><!-- <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/re…

P2910 [USACO08OPEN] Clear And Present Danger S

Portal. 最短路。 考虑到数据范围 N ≤ 100 N\leq 100 N≤100&#xff0c;可以用 Floyd 算法解决。 对于要求的行走序列&#xff0c;按顺序累加答案即可。 注意数组大小。 #include <bits/stdc.h> using namespace std; #define int long longint A[10005],f[105][…

【数据结构】单向链表的增删查改以及指定pos位置的插入删除

目录 单向链表的概念及结构 尾插 头插 尾删 ​编辑 头删 查找 在pos位置前插 在pos位置后插 删除pos位置 删除pos的后一个位置 总结 代码 单向链表的概念及结构 概念&#xff1a;链表是一种 物理存储结构上非连续 、非顺序的存储结构&#xff0c;数据元素的 逻辑顺序 是…

收藏丨20个医疗场景经典、热门数据集资源汇总

当今&#xff0c;人工智能技术在医疗领域的应用日益广泛&#xff0c;其中医疗数据集起到了至关重要的作用。本文将介绍 20 个经典的医疗开源数据集&#xff0c;涵盖了各个部位、CT\MRI\内窥镜等多种模态数据&#xff0c;以帮助研究者们更好地探索和研发医疗AI大模型。 同时&am…

uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法

uniapp小程序使用web-view组件页面分享后&#xff0c;点击没有home小房子解决办法 小程序 &#xff1a;IOS 测试正常&#xff0c; 安卓 不显示home 微信小程序使用的是全局自定义导航&#xff0c;通过首页 banner 跳转到一个 web-view 页面&#xff0c;展示官网。 web-view 页…

[vmware]vmware虚拟机压缩空间清理空间

vmware中的ubuntu使用如果拷贝文件进去在删除&#xff0c;vmare镜像文件并不会减少日积月累会不断是的真实物理磁盘空间大幅度减少&#xff0c;比如我以前windows操作系统本来只有30GB最后居然占道硬盘200GB&#xff0c;清理方法有2种。 第一种&#xff1a;vmware界面操作 第二…

德国爆发大规模勒索软件攻击,超70个城市市政服务瘫痪

根据11月3日消息称&#xff0c;德国西部本周发生大规模勒索软件攻击&#xff0c;多个城市和地区的地方政府服务陷入瘫痪。 上周一&#xff08;10月30日&#xff09;早上&#xff0c;德国地方市政服务提供商Sdwestfalen IT公司的服务器被未知的黑客团伙加密。为阻止恶意软件传播…

掌握视频封面提取与剪辑技巧,提升视频品质

在当今的数字媒体时代&#xff0c;视频已成为人们获取信息、娱乐、社交等多种需求的重要方式。一个高质量的视频封面和剪辑技巧可以大大提高视频的吸引力和品质&#xff0c;因此&#xff0c;掌握视频封面提取与剪辑技巧对于视频制作者来说至关重要。那么现在一起来看看云炫AI智…

【STL】:list的模拟实现

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关list的模拟实现&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据…

sql逻辑优化

1.分页 通常使用每页条数及第一页作为参数 开发接口 GetMapping("/querySystemList") public List<SystemAduit> querySystemList(RequestParam("keyword") String keyword,RequestParam(name "offset", defaultValue "0") i…

Activiti监听器

文章目录 学习链接任务监听器 TaskListener监听的事件TaskListener 接口监听器委托类DelegateTask 任务监听实现方式 — 类class绘制流程图自定义任务监听器SiteReportUserTaskListener 测试 监听实现方式 — 表达式expression绘制流程图自定义 TaskListenerExpression测试spri…

【入门Flink】- 02Flink经典案例-WordCount

WordCount 需求&#xff1a;统计一段文字中&#xff0c;每个单词出现的频次 添加依赖 <properties><flink.version>1.17.0</flink.version></properties><dependencies><dependency><groupId>org.apache.flink</groupId><…

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务&#xff0c;将Softm…