在给定范围内的值的情况下查找范围的端点

时间:2015-06-23 20:22:59

标签: algorithm sorting

我正在尝试解决一个简单的问题,但目前我想不出更好的解决方案。我正在测试未记录的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 /最大值?

1 个答案:

答案 0 :(得分:2)

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