算法篇-杨氏矩阵

简介: 算法篇-杨氏矩阵

算法篇-杨氏矩阵


问题

现有一个数字矩阵,矩阵的每行从左到右是递增,矩阵每列从上到下是递增,请编写程序在这样的矩阵中查找某个数字是否存在。复杂度小于O(n)


百度百科

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

杨氏矩阵是剑桥大学大学数学家阿尔弗雷德·扬在1900年提出。然后在1903年,它被用于格奥尔格·弗罗贝纽斯的对称群研究中。它的理论得益于许多数学家的贡献得到进一步发展,包括珀西·麦克马洪,W.V.D.霍奇,G.deB.罗宾逊,吉安·卡咯罗塔,阿兰拉斯克斯,马塞尔·保罗斯库森博格和理查德·P·史丹利。


算法

方法一 暴力法

不考虑时间复杂度的情况下,直接双层循环暴力破解。在此不做过多解释。

代码:

#include<stdio.h>
int FindNum(int arr[3][3], int test, int* r, int* c);//查找函数声明
int main()
{
  int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
  int test = 0;//保存用户想要查找的值
  int row = sizeof(arr) / sizeof(arr[0]);//行长度
  int col = sizeof(arr[0]) / sizeof(arr[0][0]);//列长度
  scanf("%d", &test);
  int ret = FindNum(arr, test, &row, &col);
  if (ret == 1)
  {
    printf("找到了!在数组第%d行,第%d列的位置!\n", row, col);
  }
  else
  {
    printf("找不到!");
  }
  return 0;
}
//查找函数
int FindNum(int arr[3][3], int test, int* r, int* c)
{//返回0 - 未找到   返回1 - 找到
  for (int i = 0; i < *r; i++)
  {
    for (int j = 0; j < *c; j++)
    {
      if (arr[i][j] == test)
      {
        *r = i;
        *c = j;
        return 1;
      }
    }
  }
  return 0;
}


方法二

思路:

首先构造一个杨氏矩阵

在上表中可以找到俩个特殊点,一个是右上角,另一个是左下角。让测试值与特殊点左比较

令测试变量为test,数组名为arr


右上角:如果test比3大,那么对应的那一行都比test小,因为那一行中3是最大的,即可以排除一整行。同理如果test比3小,那么对于的那一列都比test大,因为3是那一列中最小的。以此进行直到遍历完数组或者找到test的值为止。


同理,

左下角规律是:如果test比3大,那么对应的一列都比test小,排除对应一列,如果test比3小,那么对应的一行都比test大,排除对应一行。其他同上循环进行即可。


例如:test=5 c从右上角开始

第一次 比较 arr[2][0] < test ,排除第一行


第二次 比较arr[2][1] > test, 排除第三列

第三次 比较 arr[1][1] < test, 排除第二行

第四次比较 arr[1][2] == test 找到了!

然后我们保存或者返回该元素所在的位置。

代码:

#include<stdio.h>
int FindNum(int arr[3][3], int test, int* r, int* c);//查找函数声明
int main()
{
  int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
  int test = 0;//保存用户想要查找的值
  int row = sizeof(arr) / sizeof(arr[0]);//行长度
  int col = sizeof(arr[0]) / sizeof(arr[0][0]);//列长度
  printf("请输入需要查找的值:");
  scanf("%d", &test);
  int ret = FindNum(arr, test, &row, &col);
  if (ret == 1)
  {
    printf("找到了!在数组第%d行,第%d列的位置!\n", row, col);
  }
  else
  {
    printf("找不到!");
  }
  return 0;
}
//查找函数
int FindNum(const int arr[3][3], int test, int* r, int* c)//从右上角开始
{
  int x = 0;
  int y = *c - 1;
  while (x < *r && y >= 0)
  {
    if (arr[x][y] > test)
    {//排除一列
      y--;
    }
    else if (arr[x][y] < test)
    {//排除一行
      x++;
    }
    else
    {
      //此处修改主函数的长和宽,用于保存找到该元素的地址
      *r = x;
      *c = y;//
      return 1;
    }
  }
  return 0;
}


同理我们可以写出左下角的查找函数

//查找函数
int FindNum(const int arr[3][3], int test, int* p, int* q)//从左下角开始
{
  int x = *p - 1;
  int y = 0;
  while (x >= 0 && y < *q)
  {
    if (arr[x][y] > test)
    {//排除一列
      x--;
    }
    else if (arr[x][y] < test)
    {//排除一行
      y++;
    }
    else
    {
      *p = x;
      *q = y;
      return 1;
    }
  }
  return 1;
}

运行结果

查找到的情况


未找到的情况

杨氏矩阵 - 完

目录
打赏
0
0
0
0
8
分享
相关文章
【算法题目解析】杨氏矩阵数字查找
一道面试时可能遇到的算法问题,杨氏矩阵。可以重点关注思考方式,而不是死记硬背。
72 0
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
基于模糊神经网络的金融序列预测算法matlab仿真
本程序为基于模糊神经网络的金融序列预测算法MATLAB仿真,适用于非线性、不确定性金融数据预测。通过MAD、RSI、KD等指标实现序列预测与收益分析,运行环境为MATLAB2022A,完整程序无水印。算法结合模糊逻辑与神经网络技术,包含输入层、模糊化层、规则层等结构,可有效处理金融市场中的复杂关系,助力投资者制定交易策略。
基于BBO生物地理优化的三维路径规划算法MATLAB仿真
本程序基于BBO生物地理优化算法,实现三维空间路径规划的MATLAB仿真(测试版本:MATLAB2022A)。通过起点与终点坐标输入,算法可生成避障最优路径,并输出优化收敛曲线。BBO算法将路径视为栖息地,利用迁移和变异操作迭代寻优。适应度函数综合路径长度与障碍物距离,确保路径最短且安全。程序运行结果完整、无水印,适用于科研与教学场景。
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。
基于二次规划优化的OFDM系统PAPR抑制算法的matlab仿真
本程序基于二次规划优化的OFDM系统PAPR抑制算法,旨在降低OFDM信号的高峰均功率比(PAPR),以减少射频放大器的非线性失真并提高电源效率。通过MATLAB2022A仿真验证,核心算法通过对原始OFDM信号进行预编码,最小化最大瞬时功率,同时约束信号重构误差,确保数据完整性。完整程序运行后无水印,展示优化后的PAPR性能提升效果。