C语言王国——杨氏矩阵

目录

1. 引言

 2. 了解杨氏矩阵

3. 思路分析

4. 代码

 5. 总结


1. 引言

最近在做二维数组的训练的时候发现了一个很有意思的题:

一看这不是杨氏矩阵嘛,接下来就由姜糖我带大家了解一下这个著名的矩阵。

 2. 了解杨氏矩阵

通过查阅百度得知:

杨氏矩阵:

是对组合表示理论和舒伯特演算很有用的工具。它提供了一种方便的方式来描述对称和一般线性群的群表示,并研究它们的性质。有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N)。

平常我们在数组里查找数字时,是否我们用的都是暴力遍历查找,一个数一个数的去比对时间复杂度为O(n),效率很低,这时候就该我们杨氏矩阵出场了。 


3. 思路分析

资料中我们知道了杨氏矩阵是一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在,所以我们举一个例子:

在arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}查找数字n。

数组如图:

此数组符合杨氏矩阵。

那接下来我们该怎么查找数字更快捷呢。接下来我们要找此数组里的特殊的数,我们会发现最右上角的那个数是一行之中最大的一列之中最小的所以我们拿n去跟他比较,然后我们就会发现:

红色为查找范围,黄色为除去范围。

根据图中我们发现当n>3时,第一行就被排除了,查找范围只有第二、三行;

当n<3时,第一列就被排除了 ,查找范围只有第二、三列。

然后在接下来的图像中继续取右上角的数字进行比较,排除行和列直达剩下查找的数,若都找不到则数字n不在数组中。


我们将n赋值进行具体分析,为了特殊性,我们就取右上角的对角左下角7吧。

当n=7,如图分析:

 

 

 

这样我们就能找到我们的数字n了。最后我们也发现:在一个杨氏矩阵中查找最特殊的数字7,我们总共进行了5次比较,找到了元素,这样的查找方式明显比遍历二维数组的效率高 。


4. 代码

接下来我就来分享一下我写的代码:

#include<stdio.h>

int young(int (*arr)[3], int n)
{
	int i,j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 2; j >= 0; j--)
		{
			if (n == arr[i][j])
			{
				return 1;
			}
			else if(n > arr[i][j])
			{
				break;
			}
		}
	}

	return 0;

}


int main()
{

	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	printf("输入你要查找的数字:");
	int n = 0;
	scanf("%d", &n);
	int ret = young(arr, n);
	if (n)
	{
		printf("找到了");
	}
	else
		printf("找不到");

	return 0;

但是我们发现这样子的代码只能判断是否找到数字,不能判断数字的位置,所以我给代码进行了优化:

#include<stdio.h>

int young(int(*arr)[3], int* px, int* py, int n)
{
	int y = *py;
	int x = *px-1;
	for (*py = 0; *py < y; (*py)++)
	{
		for (*px = x; (*px) >= 0; (*px)--)
		{
			if (n == arr[(*py)][(*px)])
			{
				return 1;
			}
			else if (n > arr[*py][*px])
			{
				break;
			}
		}
	}

	return 0;
}


int main()
{

	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	printf("输入你要查找的数字:");
	int n = 0;
	scanf("%d", &n);
	int i = 3;
	int j = 3;
	int ret = young(arr, &i , &j , n);
	if (n)
	{
		printf("找到了为arr[%d][%d]",j,i);
	}
	else
		printf("找不到");

	return 0;
}

像这样子我们把数组行和列用指针的形式传到函数里去,随着函数的变化去变化最后就能得到数组中我们要查找的n的位置。 

最后我们发现用while循环思路会更清晰准确:

#include<stdio.h>
int find_num(int arr[3][3], int* px, int* py, int k)
{
	int x = 0;
	int y = *py - 1;
	while (x < *px && y >= 0)
	{
		//向下查找
		if (k > arr[x][y])
		{
			x++;
		}
		//向左查找
		else if (k < arr[x][y])
		{
			y--;
		}
		//找到了
		else
		{
			*px = x;
			*py = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf("%d", &k);
	int x = 3;
	int y = 3;
	int ret = find_num(arr, &x, &y, k);
	if (ret == 1)
	{
		printf("找到了,下标是%d %d\n", x, y);
	}
	else
	{
		printf("找不到\n");
	}

	return 0;
}

 5. 总结

如果大家有不同见解也可以私信姜糖哦,姜糖也在不停的学习进步,与大家一起步入大牛之列。期待大家三连!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑如何开启硬件虚拟化?这 2 种方法都可以使用

开启硬件虚拟化的方法 我们应该如何开启硬件虚拟化呢&#xff1f;下面就为大家总结了 2 种开启电脑硬件虚拟化的方法。 WinRE 启用 我们可以通过 Windows 恢复环境也就是 WinRE 在UEFI 或者 BIOS 上开启硬件虚拟化&#xff0c;大家可以按照下面的步骤进行操作。 首先打开设…

【Python】解决Python报错:AttributeError: ‘int‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

SpringBoot 单元测试 指定 环境

如上图所示&#xff0c;在配置窗口中添加--spring.profiles.activedev&#xff0c;就可以了。

【算法实战】每日一题:在后面的位置找到比当前元素第一个大的元素(非暴力,单调栈)

1. 数据结构-单调栈 单调栈是一种特殊的栈结构&#xff0c;它只允许栈内的元素保持单调性&#xff08;单调递增或单调递减&#xff09;。在实际应用中&#xff0c;单调栈常用于解决与单调性相关的算法问题&#xff0c;如找到下一个比当前元素大&#xff08;或小&#xff09;的…

与牢霍沟通——Linux操作系统原理

硬件层 计算机由何组成&#xff1f; 我们现在手中的计算机&#xff0c;无论配置如何&#xff0c;是笔记本还是台式&#xff0c;都由三部分构成&#xff1a; 输入设备&#xff1a;键盘&#xff0c;鼠标...中央处理器&#xff1a;cpu&#xff0c;显卡&#xff0c;磁盘...输出设…

在鲲鹏服务器上安装nginx

华为鲲鹏服务器采用华为自研cpu ARMv8架构,提供 Windows 和多个Linux 系统 常使用 CentOS 7.6 64bit with ARM Nginx 和 Apache 一样都是一种 Web 服务器。是基于 REST 架构风格&#xff0c;以统一资源描述符URI 或者统一资源定位符URL 作为沟通依据&#xff0c;通过 HTTP 协议…

Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)

在上面篇文章中已经对flink进行了简单的介绍以及了解了Flink API 层级划分&#xff0c;这一章内容我们主要介绍DataStream API 流程图解&#xff1a; 一、DataStream API Source Flink 在流处理和批处理上的 source 大概有 4 类&#xff1a; &#xff08;1&#xff09;基于本…

【深度学习】安全帽检测,目标检测,yolov10算法,yolov10训练

文章目录 一、数据集二、yolov10介绍三、数据voc转换为yolo四、训练五、验证六、数据、模型、训练后的所有文件 寻求帮助请看这里&#xff1a; https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2一、数据集 安全帽佩戴检测 数据集&#xff1a;https://github.com/njvi…

匿名函数(lambda)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 匿名函数是指没有名字的函数&#xff0c;应用在需要一个函数&#xff0c;但是又不想费神去命名这个函数的场合。通常情况下&#xff0c;这样的函数只…

VRTK4.0学习——(二)

手柄绑定以及显示 1.导入CameraRigs.UnityXRPluginFramework 和 CameraRigs.TrackedAlias 预设&#xff0c;将CameraRigs.UnityXRPluginFramework拖入CameraRigs.TrackedAlias的Elements中即可&#xff0c;运行软件后即可看到手柄了 注&#xff1a;如果无法看到手柄&#xff…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

fmql之CAN调试

刚刚把zynq的CAN调成功。那么现在就要把程序移植到fmql了。 老规矩&#xff0c;Procise导入vivado的.bd和.xci文件。 Procise下create block也可以&#xff0c;但是不能自动约束引脚&#xff0c;只能手动写代码。 PeripheralTest CanExample中用到了CAN0和CAN1&#xff1a;…

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;11、日志的进阶使用&#xff09; 3.2.4 文件输出3.2.5 日志文档的归档与切割 3.2.4 文件输出 配置 application.properties # 日志文件名 如果不写路径默认就是在项目根路径建立 demo.log 文件 推荐写法 D:\\demo.log 路径 文…

虚拟机Ubuntu 22.04上搭建GitLab操作步骤

GitLab是仓库管理系统&#xff0c;使用Git作为代码管理工具。GitLab提供了多个版本&#xff0c;包括社区版(Community Edition)和企业版(Enterprise Edition)。实际应用场景中要求CPU最小4核、内存最小8GB&#xff0c;非虚拟环境。 以下是在虚拟机中安装社区版步骤&#xff1a;…

R语言ggplot2包绘制高端堆积柱状图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 关键词“高端堆积柱状图” 大家好&#xff0c;今天我将介绍如何使用ggplot2包绘制高端堆积柱状图。 本次绘图灵感来源于下面这篇文章&#xff0c;之所以复现这张图&#xff0c;有这么几个原…

查看docker中各个容器所占的资源

要查看Docker中的每个容器占用的资源&#xff0c;可以使用docker stats命令。这个命令提供了容器的实时资源使用统计&#xff0c;包括内存使用情况。以下是如何使用docker stats命令的示例&#xff1a; docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsa…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好&#xff0c;我是赵兴晨&#xff0c;97年文科程序员。 你有没有听说过Nginx的账户认证功能&#xff1f;这可不只是一个技术问题&#xff0c;它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样&#xff0c;Nginx的账户认证功能就是确保有只有授权的人才能…

Linux-在centos7中为普通用户配置sudo认证

目录 前言一、sudo是什么&#xff1f;二、配置sudo三、测试 前言 本篇文章介绍如何在centos7中为普通用户配置sudo认证 一、sudo是什么&#xff1f; sudo是一个命令&#xff0c;其作用是为普通用户以临时管理员&#xff08;root&#xff09;的身份去执行一条命令。 例如&…

ConvNeXt(CVPR 2022)论文解读

paper&#xff1a;A ConvNet for the 2020s official implementation&#xff1a;https://github.com/facebookresearch/ConvNeXt third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/convnext.py 背景 在…