algorithm - 用于在 1,000,000,000 个元素中搜索键的算法,其中键位于前 n 个索引中,而不事先指定 n
问题描述
问题如下:
假设给定一个非常大的整数数组 A,其中包含 1,000,000,000 个元素,其中元素按降序排列。但是,只有前 n 个元素包含正整数数据,但 n 的值是未知的。其余的数组元素包含零。
给出方法 search(A,k) 在数组 A 中搜索键 k 的算法。它返回找到 k 的数组的索引,否则返回 -1。您的算法必须在最坏情况下运行 O(logn) 时间。
您可以使用 binarySearch(A, k, left, right) 在 A[left] 到 A[right] 中搜索 k(假设从左到右按降序排序)。
到目前为止我想到的方法:
使用 for 循环从索引 0 迭代直到包含第一个 0 的索引并与 k 进行比较。这需要 O(n) 时间,因此不符合时间限制。
对 A 本身进行二分搜索。这需要 O(log 1,000,000,000) 时间并超过时间限制。
我有点卡在这里,无法想到任何其他方法。
在最坏情况 O(logn) 下运行的方法是什么?
解决方案
您好,这种方法基于修改后的二进制搜索
如果匹配返回,则从第一个索引开始
将索引翻倍,直到找到值或您结束
a) 如果值大于 k 继续
b) else if value 小于 k BinarySearch(index/2, index, k)
所以基本上我们所做的就是通过向前跳跃来缩小搜索空间,就像 nice_dev 之前的回答一样;但是在跳跃时,我们还检查了我们的值是否在特定窗口中,如果是,我们停止跳跃并二进制搜索最后一个窗口
推荐阅读
- android - 我们如何将样式设置为 BiometricPrompt 对话框
- java - 使用 iText 将 SVG 转换为 PDF,SVG 未在 PDF 中完全显示
- azure - 无法从 Debian 9 登录 Azure 帐户
- javascript - Angular 中的 Javascript SDK 处理事件
- javascript - 嵌入 React 页面 Discord Js
- javascript - 在 AdonisJS 中使用 .save() 函数时超出最大调用堆栈大小错误
- r - 计算每月和每年有特定日期的日期
- swift - Xcode 12 中的 Alamofire.request() 错误
- javascript - 渲染数组中的反应元素时CSS转换无法正常工作
- spring - 弹簧石英 | 玛丽亚数据库