二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵

本文主要是介绍二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查找某元素

假设矩阵为

                   1     2   8   9

                   2    4    9   12

                   4    7   10  13

                   6    8    11  15

    在里面查找7,如果我们从1开始,则1的右半部分,也就是剩下矩阵的全体,都可能会存在7,这是显然不行的,我们要确定一个确切的查找规则,它沿着特定路线走,最后找到

    我们看其规律,如果说要查找的元素比当前元素大,则在其右半部与下半部   如果比当前元素小,则在其左半部与上半部。

    而如果我们从右上角开始,9开始,查找7,首先7小于9,所以要在其左半部分与上半部分查找,9的上半部分是没有的,左半部分就是第1 2 3 列,第4列排除掉(注意这个排除掉的意思,意思是说7不可能在这里了)

   我们往左走到8,7比8小,同样我们还得往左走,那就是2,

  7比2大,所以我们就找右下两部分,右半部分,第3 4 列,我们其实前面已经排除了,只剩下下边的,于是我们从2开始往下走,走到了4

  ······以此类推

   杨氏矩阵难点在于如何选择起始点,以及为什么要选择这个起始点。这一点一定要搞清楚。

  我们这里找到大于要寻找的元素,不再为向下还是向右犹豫不决了,我们只需要向下,碰到小于要寻找的元素也是如此。

  

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4. int a[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};  
  5. int k=0;  
  6. bool findElem(int row,int col)  
  7. {  
  8.   while((row>=0&&row<4)&&(col>0&&col<4))  
  9.   {  
  10.     if(a[row][col]=k)  
  11.         return true;  
  12.     if(a[row][col]<k)  
  13.     {  
  14.       row++;  
  15.     }  
  16.     else  
  17.         col--;  
  18.   }  
  19.   return false;  
  20. }  
  21. int main()  
  22. {  
  23.   
  24.   if(findElem(0,3))  
  25.       cout<<"find it"<<endl;  
  26.   else  
  27.       cout<<"could not find it"<<endl;  
  28.   return 0;  
  29. }  

这篇关于二维矩阵(杨氏矩阵)查找 、定义: 从左到右,从上到下,依次增大的矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245951

相关文章

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

通俗范畴论4 范畴的定义

注:由于CSDN无法显示本文章源文件的公式,因此部分下标、字母花体、箭头表示可能会不正常,请读者谅解 范畴的正式定义 上一节我们在没有引入范畴这个数学概念的情况下,直接体验了一个“苹果1”范畴,建立了一个对范畴的直观。本节我们正式学习范畴的定义和基本性质。 一个范畴(Category) C𝐶,由以下部分组成: 数据: 对象(Objects):包含若干个对象(Objects),这些

利用结构体作为函数参数时结构体指针的定义

在利用结构体作为函数的参数进行传递时,容易犯的一个错误是将一个野指针传给函数导致错误。 #include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10typedef struct {int r[MAXSIZE]; //用于存储要排序的数组,r[0]作为哨兵或者临时变量int length;

redis增大查询速度(项目中实际应用举例)

1、关于保存User表的方案       1.1  使用Redis的Hash类型去保存关系型数据库的User表        1.2 redis的Hash的key为"SYS_USER_TABLE_SEX_MAN",field:userid   value:json 数据 2、利用Redis的Set来保存满足一类条件的User用户的id信息。例如,性别为女,年龄大于25岁等条件。 3

linux cron /etc/crontab 及 /var/spool/cron/$USER 中定义定时任务

简介 定时任务在linux上主要体现在两个地方,一个是/etc/crontab ,另一个就是定义了任务计划的用户/var/spool/cron/$USER 1、crontab -e 或者直接编辑/etc/crontab文件,这种方式用的人比较多,/etc/crontab是系统调度的配置文件,只有root用户可以使用,使用时需root权限,而且必须指定运行用户,才会执行 * * * * * *

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

vue+elementui搭建后台管理界面(5递归生成侧栏路由) vue定义定义多级路由菜单

有一个菜单树,顶层菜单下面有多个子菜单,子菜单下还有子菜单。。。 这时候就要用递归处理 1 定义多级菜单 修改 src/router/index.js 的 / 路由 {path: '/',redirect: '/dashboard',name: 'Container',component: Container,children: [{path: 'dashboard', name: '首

基础C语言知识串串香11☞宏定义与预处理、函数和函数库

​ 六、C语言宏定义与预处理、函数和函数库 6.1 编译工具链 源码.c ——> (预处理)——>预处理过的.i文件——>(编译)——>汇编文件.S——>(汇编)——>目标文件.o->(链接)——>elf可执行程序 预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链(gcc就是一个编译工具链)。 gcc中各选项

推荐算法之矩阵分解实例

矩阵分解的数据利用的上篇文章的数据,协同过滤 用到的知识 python的surprise k折交叉验证 SVD SVDpp NMF 算法与结果可视化 # 可以使用上面提到的各种推荐系统算法from surprise import SVD,SVDpp,NMFfrom surprise import Datasetfrom surprise import print_perf