搜索排序矩阵的最有效方法?

2023-11-21

我有一项任务是编写一个算法(不是用任何特定语言,只是伪代码),该算法接收一个矩阵 [大小:M x N],该矩阵的排序方式是所有行都已排序,所有列都已排序单独排序,并在该矩阵中找到某个值。我需要编写我能想到的最省时的算法。

矩阵看起来像:

1  3  5
4  6  8
7  9 10

我的想法是从第一行和最后一列开始,简单地检查该值,如果它更大,则向下移动,如果小于,则向左移动,并继续这样做,直到找到该值或直到索引超出范围(以防万一)该值不存在)。该算法的工作线性复杂度为 O(m+n)。有人告诉我可以用对数复杂度来做到这一点。是否可以?如果是这样,怎么办?


你的矩阵看起来像这样:

a ..... b ..... c
. .     . .     .
.   1   .   2   . 
.     . .     . .
d ..... e ..... f
. .     . .     .
.   3   .   4   .
.     . .     . .
g ..... h ..... i

并具有以下属性:

a,c,g < i  
a,b,d < e
b,c,e < f
d,e,g < h
e,f,h < i

所以值在最右下角(例如。i) 始终是整个矩阵中最大的 如果将矩阵分成 4 个相等的部分,则此属性是递归的。

所以我们可以尝试使用二分查找:

  1. 探索价值,
  2. 分成几块,
  3. 选择正确的作品(以某种方式),
  4. 转到 1 并添加新的部分。

因此算法可能如下所示:

input: X - value to be searched
until found
 divide matrix into 4 equal pieces
 get e,f,h,i as shown on picture
 if (e or f or h or i) equals X then 
   return found
 if X < e then quarter := 1
 if X < f then quarter := 2
 if X < h then quarter := 3
 if X < i then quarter := 4
 if no quarter assigned then 
    return not_found
 make smaller matrix from chosen quarter 

这对我来说就像 O(log n),其中 n 是矩阵中的元素数量。这是一种二分搜索,但是是二维的。我无法正式证明它,但类似于典型的二分搜索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索排序矩阵的最有效方法? 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Laravel 搜索关系

    我有两个相关的模型 我正在尝试在产品中进行搜索 并且仅显示实际搜索结果 而不是找到该产品的类别的所有产品 我不想搜索任何类别 因为无论搜索什么或找到什么 类别都会始终显示 Example I have the following categ
  • 如何在MATLAB中显示由三个矩阵表示的图像?

    我有 3 个相同大小的 2D 矩阵 假设 200 行和 300 列 每个矩阵代表三种 基本 颜色 红色 绿色和蓝色 之一的值 矩阵的值可以在 0 到 255 之间 现在我想组合这些矩阵以将它们显示为彩色图像 200 x 300 像素 我怎样
  • 获取N个随机数,其总和为M

    我想得到N个随机数 其总和是一个值 例如 假设我想要 5 个总和为 1 的随机数 那么 一个有效的可能性是 0 2 0 2 0 2 0 2 0 2 另一种可能性是 0 8 0 1 0 03 0 03 0 04 等等 我需要这个来创建模糊 C
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 大 ר 符号到底代表什么?

    我真的很困惑大 O 大 Omega 和大 Theta 表示法之间的区别 我知道大 O 是上限 大 Omega 是下限 但是大 theta 到底代表什么 我读过这意味着紧束缚 但是 这是什么意思 首先我们来了解一下什么是大O 大Theta和大
  • Java 中查看 ArrayList 是否包含对象的最有效方法

    我有一个 Java 对象的 ArrayList 这些对象有四个字段 我用其中两个字段来将对象视为与另一个对象相等 我正在寻找最有效的方法 给定这两个字段 以查看数组是否包含该对象 问题在于这些类是基于 XSD 对象生成的 因此我无法修改类本
  • 领域驱动设计与模型驱动架构

    我很好奇 领域驱动设计和模型驱动架构有什么区别 我的印象是他们有某些相似之处 你能启发我吗 Thanks 不要不同意上面的大部分内容 尽管它可能值得稍微扩展一下 DDD 中最重要的一个概念是关注问题域 将对技术的痴迷放在一边 主要集中于对您
  • 如何找到最大。和分钟。在数组中使用最小比较?

    这是一道面试题 给定一个整数数组 找出其中的最大值 和分钟 使用最小比较 显然 我可以循环数组两次并使用 2n在最坏的情况下进行比较 但我想做得更好 1 Pick 2 elements a b compare them say a gt b
  • 在 Solr 中搜索确切的短语时,有没有办法包含停用词?

    我希望排除停用词 除非搜索词位于双引号内 例如 就像那样 也应该搜索 那个 这可能吗 这取决于您正在查询的字段的配置 如果索引分析器的配置包含 StopFilterFactory 则停用词根本不会被索引 因此您以后无法查询它们 但由于 So
  • R中将矩阵拆分为子矩阵的函数

    我有一个 16 行 12 列的矩阵 M 我想将其拆分为 16 个矩阵的数组 每个矩阵有 4 行 3 列 我可以通过以下方式手动完成 M matrix sample 0 127 16 12 replace TRUE c 16 12 ma1 M
  • 小矩阵乘以大矩阵

    我试图将小矩阵 假设为 2x2 中的每个元素与大矩阵 假设为 4x4 中的每个位置逐个元素相乘 所以我想要 1 2 3 4 1 0 3 0 1 0 1 2 3 4 0 0 0 0 0 0 x 1 2 3 4 1 0 3 0 1 2 3 4
  • 用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

    我有以下结构 MyClass guid ID guid ParentID string Name 我想创建一个数组 其中包含按层次结构中应显示的顺序排列的元素 例如 根据它们的 左 值 以及将 guid 映射到缩进级别的散列 例如 ID N
  • 复合模式/实体系统与传统OOP

    我正在开发一个用 Java 编写的小游戏 但问题与语言无关 由于我想探索各种设计模式 所以我迷上了复合图案 http en wikipedia org wiki Composite pattern 实体系统 我最初读到的here http
  • 在 C++ 中返回浮点数组

    我目前有一个 C 中的 4x4 矩阵类 并将每个值存储为浮点数 Matrix4d Matrix4d const float m00 const float m01 const float m02 const float m03 const
  • 维基百科 API 搜索标题生成器

    尝试使用生成器通过 api 搜索图块 我注意到有两种可能的生成器 但我都遇到了问题 前缀搜索 如果我有多个单词并且查询中的顺序相反 例如 brian adams 将返回答案 但 adams brian 则不会 则效果不佳 搜索 似乎不允许按
  • 您编写 DSL 是为了解决什么样的问题?

    我只是对特定领域语言感到好奇 我在文章中多次看到它们 似乎它们可以用于外部保证或银行数据定义问题 所以我来SO 寻求一些具体的意见 您使用过 DSL 吗 写一个 如果是 那是什么感觉 您认为您的项目之一使用 DSL 后是否会变得更好 更高效
  • OOP:什么时候它是一个对象?

    我正在尝试理解面向对象 我当然明白一点 但有时我并不是百分百清楚 你如何决定什么应该变成一个对象 另一个大的整个对象的小对象部分 或者什么不值得成为一个对象 或者也许它应该只是那个大的整个对象的属性 对于一扇门来说 我猜门把手应该是一个独立
  • 适合 Android Imageview 矩阵屏幕中心

    你好 我在这个主题上使用适合屏幕的功能Android图像视图矩阵缩放 平移 https stackoverflow com questions 6075363 android image view matrix scale translat
  • 高效找到圆和网格的交点

    找到由圆心和半径定义的圆与任意网格的交点的好方法是什么 An illustration of the points I am trying to find 到目前为止我想到的可能的解决方案 找到位于中心 半径之间的所有线 对于每条线计算交点

随机推荐

  • 如何获取充当 stdin/stdout 的文件的名称?

    我遇到以下问题 我想用 Fortran90 编写一个程序 我希望能够像这样调用 program x lt main in gt main out 除了 main out 我可以在调用程序时设置其名称 之外 还必须编写辅助输出 我希望它们具有
  • java rmi中的通信安全吗?

    java rmi 中客户端和服务器之间的通信是否安全 即默认加密 编码 是的 加密的 没有 JERI for JINI 提供基于 SSL IIRC 的 JRMP RMI 协议 JSR 76 本来可以提供 RMI 安全性 但它是有争议的被否决
  • 在不知道急救人员的情况下隐藏 iPhone 上的输入键盘?

    我见过这个问题 但问题是如何知道哪个textView是第一响应者 这个问题看起来很有希望找出第一响应者 但事实证明它调用了私有 API 有没有办法隐藏键盘或找出第一响应者作为拥有键盘的人 这很容易 UIApplication sharedA
  • 向 VB.Net 应用程序添加命令行参数

    我有一个由另一位程序员制作的基于 Windows 窗体的应用程序 我需要向其添加一些命令行开关primary output exe这样我就可以传递如下参数 program exe reinitialise or program exe sy
  • Django ImageField 验证(是否足够)?

    我有很多用户上传的内容 我想验证上传的图像文件实际上不是恶意脚本 在 Django 文档中 它指出 ImageField 继承 FileField 的所有属性和方法 但也验证上传的对象是有效的图像 这完全准确吗 我读到压缩或以其他方式操作图
  • Verilog 显示中不必要的空间

    我正在尝试以十进制显示一些 32 位值 除了 b 和前一个字符之间有奇怪数量的不必要的空格外 这工作正常 例如 如果我有一个 32 位 reg a 其十进制值为 33 我将使用类似的东西 initial begin display a d
  • GetMaxAmplitude 的值范围

    我有一个有趣的想法 可以在 Android 手机上开箱即用地使用麦克风端口 我正在集思广益如何使用 Android 手机记录咖啡烘焙机内的烘焙温度 这个想法突然出现在我的脑海中 麦克风是低压的 我的热电偶也是低压的 所以我开始研究 andr
  • 如何将图像视图从一个活动发送到另一个活动

    我在第一个活动的列表视图中有一个图像视图 我想通过单击列表视图项目将我的图像视图发送到第二个活动 我尝试过以下代码 将可绘制图像转换为字节数组 Bitmap bmp BitmapFactory decodeResource getResou
  • 在 VSTS 构建和发布中排除/跳过文件

    我们正在为 VSTS CI CD 创建架构 以将我们的 Web 应用程序部署到 Azure 应用服务 我们希望在将 web config 部署到 Azure 服务器时排除它 因为我们直接修改不同环境中的 web config CI 任务如下
  • Seaborn 混淆矩阵(热图)2 种配色方案(正确的对角线与错误的其余部分)

    背景 在混淆矩阵中 对角线表示预测标签与正确标签匹配的情况 所以对角线是好的 而所有其他单元格都是坏的 为了向非专家阐明 CM 的优点和缺点 我想为对角线赋予与其他部分不同的颜色 我想通过以下方式实现这一目标Python 和 Seaborn
  • Android 版 OpenCV - 访问 Mat 的元素

    在 OpenCV4Android 中访问和修改 Mat 的各个元素的标准方法是什么 另外 BGR 我认为这是默认值 和灰度的数据格式是什么 编辑 让我们更具体一些 mat get row col 返回一个双精度数组 这个数组里有什么 如果您
  • 构建设置中缺少 Xcode 12 beta 有效架构

    Hi I m using Xcode Version 12 0 beta 3 12A8169g Valid architectures in build settings is missing Does anybody know how t
  • 在 Guice 中管理同一依赖树的多个版本的最佳模式是什么?

    我想实例化同一类型依赖树 链的多个版本 它们对该树 链中的某些接口使用不同的实现 在这种情况下使用的最佳 Guice 实践 模式是什么 这是我的问题的具体示例 我有一个Writer接口可能是文件编写器或标准输出编写器 它将位于我的依赖关系层
  • 在清理之前修改传入django表单的数据

    我需要修改传入的数据Form清洁前 我成功了 但看起来很糟糕 def init self args kwargs if len args gt 0 data args 0 elif data in kwargs data kwargs da
  • 如何在gcc中编译带有头文件的C程序?

    我想在 gcc 中编译一个 C 程序 它有我的 2 个头文件 我正在使用命令 gcc UDP Receive c o UDP Receive lm 编译它 但出现错误 指出 UDP Data h 没有这样的文件或目录 我如何告诉编译器包含这
  • Angular 4 Selected 在模型中给出时无法正常工作?

    当我试图提供下拉菜单时 默认情况下 我需要选择一个需要显示的值 当我不使用 ngModel 时 我可以显示默认值 没有 ngModel
  • 如何在机器人之父中为电报机器人创建菜单?

    I m new in telegram bot and see this bot that but when type start show menu to me and with out type slash to command jus
  • apache httpclient 4.3 没有超时

    我在使用以下代码使 Apache HttpClient 4 3 post 请求超时时遇到问题 RequestConfig requestConfig RequestConfig custom setConnectionRequestTime
  • Doctrine 查询语言获取每组的最大/最新行

    我正在尝试将相对简单的 SQL 语句转换为可在 Doctrine 中运行的语句 但失败了 这是 SQL 语句 它在针对我的数据库运行时按要求工作 SELECT a FROM score a INNER JOIN SELECT name MA
  • 搜索排序矩阵的最有效方法?

    我有一项任务是编写一个算法 不是用任何特定语言 只是伪代码 该算法接收一个矩阵 大小 M x N 该矩阵的排序方式是所有行都已排序 所有列都已排序单独排序 并在该矩阵中找到某个值 我需要编写我能想到的最省时的算法 矩阵看起来像 1 3 5