寻找一种算法(二维二分查找的版本)

2024-03-31

简单的问题和已知的算法:

我有一个有 100 名成员的大数组。前 X 个成员为 0,其余为 1。找到 X。

我通过二分查找来解决这个问题:检查成员 50,如果它是 0 - 检查成员 75,等等,直到找到相邻的 0 和 1。

我正在寻找针对二维相同问题的优化算法:

我有一个 100*100 的二维数组。第 0-X 行和 0-Y 列上的成员为 0,其余为 1。如何找到 Y 和 X?


编辑:最佳解决方案包括两个简单的二分搜索。

对于我在下面发表的又长又复杂的帖子,我感到非常抱歉。问题的本质是在包含 100*100 个元素的空间中找到一个点。你能做的最好的事情就是在每一步将这个空间一分为二。你可以用一种复杂的方式来做(我在这篇文章的其余部分中所做的)但是如果你意识到 X 轴上的二分搜索仍然在每一步将研究空间一分为二(Y 轴也是如此)轴)然后你就会明白它是最佳的。

我还是让我做的事,很抱歉我在里面做出了一些强制性的肯定。


如果您正在寻找一个简单的算法(尽管不是最佳的),只需按照建议运行二分搜索两次即可。

但是,如果您想要最佳算法,您可以同时在 X 和 Y 上寻找边界。 (需要注意的是,两种算法具有相同的渐近复杂度,但最优算法仍然会更快)

在下面的所有图形中,点 (0, 0) 都位于左下角。

基本上,当您选择一个点并获得结果时,您将空间分成两部分。当你仔细想想,这实际上是你可以从中提取的最大信息量。

如果您选择该点(黑色十字)并且结果为 1(红线),这意味着您要查找的点可以not位于灰色空间中(因此必须位于剩余的白色区域中)

另一方面,如果值为 0(蓝线),则意味着您要查找的点可以not位于灰色区域(因此必须位于剩余的白色区域)

因此,如果您得到一个 0 结果和一个 1 结果,您将得到以下结果:

您要查找的点位于矩形 1、2 或 3 中。您只需检查矩形 3 的两个角即可知道这 3 个矩形中哪一个是好的矩形。

所以算法如下:

  • 请注意您正在使用的矩形的左下角和右上角在哪里。

  • 进行二分查找沿着矩形的对角线直到您至少偶然发现一次 1 结果和一次 0 结果。

  • 检查矩形 3 的另外 2 个角(您必须已经知道对角线上两个角的值) 可以仅检查一个角来知道正确的矩形(但您必须检查两个角)如果右边的矩形是矩形3)

  • 确定您要查找的点是否在矩形 1、2 或 3 中

  • 重复将问题减少到好的矩形,直到最终的矩形减少到一个点:这就是您要寻找的值


编辑:如果你想要最高最优性,那么当你选择点 (50, 50) 时,你不会将空间等分。一个比另一个大三倍。理想情况下,您将选择一个将空间切割成两个相等区域(按面积)的点

您应该在开始时计算一次值factor = (1.0 - 1.0/sqrt(2.0))。然后当你想在值之间切换时a and b,选择切割点为a + factor*(b-a)。当您在点 (100*factor, 100*factor) 处切割初始 100x100 矩形时,两个区域的面积将为 (100*100)/2,因此收敛速度会更快。

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

寻找一种算法(二维二分查找的版本) 的相关文章

  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • 颜色渐变算法

    给定两种 RGB 颜色和一个矩形 我可以创建一个基本的线性渐变 这博客文章 https bsou io posts color gradients with python关于如何创建它给出了很好的解释 但我想在这个算法中添加一个变量 角度
  • 如何找到给定顶点的所有多边形?

    我有一个顶点列表 并且我知道它们之间的连接 我试图找到顶点的所有多边形形状 这些多边形形状不应重叠 我做了一些研究 我认为如果我可以顺时针 或逆时针 没有区别 遍历顶点 我可以检测多边形形状 因此 我寻找顺时针遍历顶点的解决方案 我发现了一
  • 在小于 O(N) 的时间内找出点是否位于 N 个(可能重叠)矩形之一内

    我有一个图像 我想在鼠标移动到某些矩形区域时显示工具提示 矩形区域最多可达 1000 个 但是 仅检查每个矩形中是否有点 时间复杂度为 O N 导致移动鼠标时界面无响应 有没有办法在小于 O N 的时间内完成它 我可以预先对矩形进行排序 我
  • 图中使用 K 个反向边的所有最短路径

    假设我有一个有向图 G V E 其边的权重为正整数 我需要做的是使用最多 K 整数 个反向边找到所有顶点之间的最短路径 我的意思是 如果我们在边 u 处 并且只有一条从 v 到 u 的有向边 只要我们没有在这条路径上使用 K 个反向边 我们
  • 绘图:仅保留最相关的数据

    为了节省带宽并且不用自己生成图片 图表 我计划使用 Google 的图表 API http code google com apis chart http code google com apis chart 它的工作原理是简单地发出一个
  • 在 Perl 中确定范围重叠的最快方法

    我有两组范围 每个范围都是一对整数 开始和结束 表示单个较大范围的某些子范围 两组范围的结构与此类似 当然 将替换为实际数字 a ranges a 1 gt start gt end gt a 2 gt start gt end gt a
  • 计算某个数的某次幂的模(该次幂的数字相当大)

    我想自己计算RSA算法 我需要计算某个数的某个幂的模数 问题是 在一定的功率下 这个数字可能会变得相当大 这就是我想要的 x pow n p q 如何有效地确定 x 如果您使用 NET 4 我建议您查看BigInteger http msd
  • 在哪里可以找到产生无标头输出的无损压缩算法?

    你们中有人知道产生无标头输出的无损压缩算法吗 例如不存储用于压缩的哈夫曼树吗 我不是谈论硬编码的霍夫曼树 但我想知道是否有任何算法可以压缩和解压缩输入而不在其输出中存储一些元数据 或者这在理论上是不可能的吗 当然是可能的 其中 LZ 系列压
  • 平均值大于或等于 k ​​的最长连续子数组

    考虑一个包含 N 个整数的数组 找到最长的连续子数组 使其元素的平均值大于 或等于 给定数字 k 显而易见的答案具有 O n 2 复杂度 我们可以做得更好吗 我们可以通过在 O n 时间内从所有值中减去 k 将这个问题简化为 sum gt
  • 线性模式匹配算法?

    我有一个由 0 和 1 组成的线性列表 我需要匹配多个简单模式并找到第一个出现的情况 例如 我可能需要找到0001101101 01010100100 OR 10100100010长度为 800 万的列表内 我只需要找到第一次出现的情况 然
  • 全部配对图表上的所有路径

    这可能是一个没有最佳解决方案的问题 假设我有一个有向图 不知道它是否有循环 循环检测将是这个问题的方面之一 给定一组顶点 可能是数百万个顶点 我需要计算给定图的所有唯一对之间的所有不同路径 没有重复顶点的路径 我该如何应对这种情况 让我们看
  • 是否有任何算法可以计算给定定义形状的坐标的形状面积?

    所以我有一些接收 N 个随机数的函数2D点 是否有任何算法可以计算输入点定义的形状面积 你想要计算多边形的面积 http local wasp uwa edu au pbourke geometry polyarea 取自链接 转换为 C
  • 有向无环图的拓扑排序为阶段

    是否有一种算法 给定一个未加权的有向无环图 将所有节点排序到节点集列表中 使得 拓扑顺序被保留 即 对于所有边u gt v v出现在列表中更靠下的集合中u and 列表的长度是最小的 这个问题有名字吗 Example 下图的一种可能的排序是
  • boost::graph 算法是否能够使用以前的解决方案更快地解决密切相关的新问题?

    我在下图中定义了最大流量问题 最初 所有四个边缘的容量均为 4 个单位 我求从 0 到 3 的最大流量值 答案是 8 沿路径 0 gt 1 gt 3 4 个单位 沿路径 0 gt 2 gt 3 4 个单位 以下代码创建图表并查找最大流量 i
  • 飞船推进AI:控制飞船在x=0、v=0时着陆的力

    我必须编写 AI 代码来控制游戏中宇宙飞船的许多推进喷气机 为简单起见 令空间为一维 宇宙飞船是一个点 只有 1 架喷气机 规则与问题 Let x v and a是飞船的位置 速度 加速度 Let F是施加在船上的喷射力 我知道质量m宇宙飞
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • 根据先前日期进行预测:值数据

    我有一些类似时期的数据集 这是当时人们的介绍 时间大约有一年 数据并不是定期收集的 而是相当随机的 每年 15 30 个条目 来自 5 个不同的年份 The graph drawn from the data for each year l
  • 时间复杂度:连续对一个数字的数字进行求和,直到结果为一位数

    给我一个数字 N 不断对数字求和 直到结果为一位数 例如 35252 gt 17 gt 8 我写了以下代码 int digitSum int n int sum 0 int digit while n digit n 10 n n 10 s
  • 在大文件中查找重复字符串

    一个文件包含大量 例如100亿 字符串 您需要查找重复的字符串 您有 N 个可用系统 您将如何找到重复项 埃里克森的答案可能是提出这个问题的人所期望的 您可以将 N 台机器中的每台机器用作哈希表中的一个存储桶 对于每个字符串 按顺序说出字符

随机推荐

  • 用于构建结构化二进制数据解析器的框架?

    我在实用程序员类型代码生成方面有一些经验 以与平台无关的格式指定数据结构 并为代码生成器编写模板 该代码生成器使用这些数据结构文件并生成将原始字节拉入特定于语言的数据结构的代码 对数字数据进行缩放 打印出数据等 好的实用 TM 想法是 a
  • 如果我将变量设为最终值,事情会运行得更快吗?

    我正在为 Android Java 编写 我将 int 和 float 声明为持续循环的一部分 其中一些在声明后不需要更改 如果我在声明时将它们全部设置为final 事情会运行得更快吗 Edit 感谢大家 我实际上并没有期望它能做出任何改进
  • ImportError:无法从“pip._vendor”导入名称“html5lib”(/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)[重复]

    这个问题在这里已经有答案了 I use virtualenv为我的 python 项目创建一个 python 虚拟环境 command pwd result home dhanusha Documents projects my proje
  • 在对象列表中的所有名称之间添加逗号

    我试图做一些非常简单的事情 但由于某种原因 我无法有效地完成它并且看起来像我期望的那样好 我有一个人员集合 我需要用逗号分隔具有相同电子邮件地址的人员的姓名 我尝试使用Aggregate函数 但它为所有电子邮件返回一个字符串 我可以在 fo
  • 三星 Galaxy S II AVD(Android 虚拟设备)基本设置?

    我想创建 Samsung Galaxy S II 的 AVD 唯一的目的是使用默认的网络浏览器测试网站 看看它们在纵向和横向模式下的外观如何 由于它是现在最受欢迎的 Android 智能手机 我想通过我的网站对其进行测试 我只想知道最基本的
  • Android EditText下一个焦点

    我有几个 EditTexts 分布在 2 个片段中 其中一个片段具有以下 xml 布局
  • 在 Owin、Katana 和 Nancy 中成功进行 cookie 身份验证后重定向到 ReturnUrl

    我正在使用 Owin Katana 和 Nancy 托管一个带有需要身份验证部分的简单站点 注意我也使用 nuget 包 Nancy MSOwinSecurity app UseCookieAuthentication new Cookie
  • 如何用R代码编织Rmd文件生成word文档

    我已经创建了一个 Rmd 文件 并且我知道如果我转到工具栏并选择 knit to word 它将为我生成一个 Word 文档 我的问题是如何使用 R 代码执行此操作 而无需实际单击顶部工具栏上的 knit to word 选项 我有这段代码
  • 如何使用带有空格的命令名称?

    当 python bot 中的命令之间有空格时 如何使 bot 工作 我知道我们可以使用子命令或on message但是是否还有其他选项可以仅对选定的命令而不是对所有命令执行此操作 下面的代码将不起作用 bot command pass c
  • Java - 按步骤切片任何数组

    在 python 中 我们可以执行以下操作 array 0 1 2 3 4 5 6 7 8 9 10 new array array 3 print new array gt gt gt 0 3 6 9 Java中有类似的东西吗 我一直在寻
  • 朱莉娅中的矢量化“in”函数?

    我经常想要循环遍历数据帧的长数组或列 并且对于每个项目 查看它是否是另一个数组的成员 而不是做 giant list a c j good letters a b isin falses size giant list 1 for i 1
  • 如何一次推送单个docker镜像层?

    我已经开始推送新的镜像 场景是这样的 b57ecdb750f2 Pushing gt 43 57MB 473 9MB 9b7e4da6c261 Pushing gt 18 94kB 21d523b40367 Pushed e18c77c6a
  • TCP/IP 消息帧

    我制作了一个 TCP IP 服务器 客户端 它是异步的 但它连接了消息 如何正确地在开头添加标头 然后在末尾使用字符串生成器来取消连接完整消息 服务器读取消息 Private Sub ReadCallback ByVal result As
  • 在 componentDidMount 中导航-react-router-dom v6

    这是我第一次使用react router dom v6 我对v4很熟悉 我有一个电影列表 每部电影都有一个 id 如果用户在 url 中输入了错误的电影 id 我需要导航到未找到的页面 我使用类组件的问题所以我坚持使用 componentD
  • R - 通过多个 URL 进行网页抓取?带着 rvest 和 purrr

    我正在尝试为我正在从事的项目抓取足球统计数据 并且我正在尝试利用 rvest 和 purrr 来循环遍历 url 末尾的数值 我不确定我错过了什么 但我有一段代码以及不断出现的错误消息 library xml2 library rvest
  • WPF c# .net 框架 4.8 x:绑定

    我读到x Bind 它比Binding 但是在我的应用程序 WPF C 和 NET Framework 4 8 中 当我把x Bind在任何部分 TextBox Text x Bind Visual Studio 对我说 Windows P
  • 随机数:0或1

    我是不是看得太远了 看不到像选择一个数字 0 或 1 这样简单的事情 Random rand new Random if rand NextDouble 0 lnkEvents CssClass selected else lnkNews
  • 创建动态匿名类型变量

    我可以创建一个匿名类型变量 然后添加更多属性吗 E g var x new Name Ahmed 并想添加Age到它 我怎样才能做到这一点 另一个问题 我在一些博客上看到一种类型AnonymousType这个类的名称空间是什么 这是例子ht
  • 自定义 CKEditor 工具栏

    我想自定义CKEditor的工具栏 不过 首先我想要一个工具栏可用选项的完整列表 我搜索了工具栏选项并发现了以下不完整列表 请帮我找到完整的列表 以便我可以根据我的要求进行选择 config toolbar MyToolbar name d
  • 寻找一种算法(二维二分查找的版本)

    简单的问题和已知的算法 我有一个有 100 名成员的大数组 前 X 个成员为 0 其余为 1 找到 X 我通过二分查找来解决这个问题 检查成员 50 如果它是 0 检查成员 75 等等 直到找到相邻的 0 和 1 我正在寻找针对二维相同问题