【问题标题】:find endpoints for range given a value within the range给定范围内的值查找范围的端点
【发布时间】:2015-06-24 09:10:37
【问题描述】:

我正在尝试解决一个简单的问题,但目前我想不出更好的解决方案。我正在测试一个没有记录的 API。

有一个用于获取对象的 ID,它有一个最小值和最大值,中间缺少随机值。我正在尝试测试我收到的随机对象的响应,但要找到对象,我需要有有效的 ID。

测试随机数并希望我得到一个对象会非常低效。我能做的最好的就是找到一个范围,在该范围之间获取一个随机数,并在进行测试之前检查它是否存在。

数据库中所有 ID 的示例列表可能如下所示:

[1005, 25984, 25986, 29587, 30000, ...]

假设从一个值到另一个值的偏差永远不会超过C,例如从第一个值到下一个值,差异永远不会大于预定义的常数,如果仅给定范围内的一个值,您将如何计算范围的最小值/最大值?

从给定值开始循环直到找到最后一个值是可怕的,但这就是以前的开发人员实现的方式。以下是或多或少涵盖了它们的工作的伪代码。

// this can be any valid object ID from the database
// assuming the ID's in the database are [1005, 25984, 25986, 29587, 30000]
// "i" could be any one of these values
var i = givenPredefinedObjectId;
var deviation = 100;

// objectWithIdExists() is going to lookup an object with the ID "i" in the database
// if there is no object with the ID "i" , it will return false
// otherwise the object will get tested and return true
while(objectWithIdExists(i)){
    i++;
}

for(i; i < i+deviation; i++){
    if(objectWithIdExists(i)){
        goto while loop;
    }
}

endPoint = i - deviation;

假设除了您可以检查它们是否存在并且给您一个有效值(没有包含所有可能 ID 的数组,这只是一个示例)之外,您不知道可能的值,您将如何找到 min/最大值?

【问题讨论】:

  • 你能在你的问题中添加一些例子吗?例如,可能的givenPredefinedObjectId 和可能的结果是什么?
  • 好的,例如如果i被初始化为25986或任何其他存在的ID,你需要找到100530000吗?所以您正在寻找最小和最大的 ID?
  • 是的,先生!但是在您手动调用objectWithIdExists(1005) 之前,您并不知道这些值是否存在。除了给您的唯一 ID,您没有来自数据库的任何 ID。我的目标是找到端点并在最小值和最大值之间生成一个随机数,然后在数据库中检查以供以后测试。为此,我必须在最少的数据库调用中找到最小值和最大值。
  • ID 本质上是随机数,但它们包含在一个范围内。我能做的最好的就是在最小和最大可能值之间生成一个随机数,并检查它是否是数据库中的一个对象。
  • 哼。我懂了。如果您尝试检索 ID 大于数据库中存储的最大 ID 的不存在的对象,是否有特殊的错误消息,或者没有办法区分它?例如。如果您尝试查找 40000,它会告诉您它超出范围还是给您与尝试查找 25985 相同的错误?

标签: algorithm sorting


【解决方案1】:

Unbounded binary search 是可行的,有一个因素C 减速。给定一个无限二分搜索算法,给定对某个自然数n 的oracle less_equal(n) 的访问,及时返回n O(log n),通过查询所有ID @ 在输入k 上实现oracle 987654328@ 并报告 k 小于或等于 n 当且仅当找到一个 ID。运行时间为O(C*log((max-min)/C))

【讨论】:

  • 我无权访问数据库本身,只有使用数据库的 API :(
  • @JosueEspinosa 您不需要使用此方法访问。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多