Algorithm 使用分治法在大小为n的两个数据库中的第n个最小数
我们有两个大小为n的数据库,其中包含没有重复的数字。我们总共有2n个元素。可以通过查询一次访问一个数据库来访问它们。该查询是这样的,您给它一个k,它返回该数据库中第k个最小的条目。我们需要在O(logn)查询中的所有2n个元素中找到第n个最小的条目Algorithm 使用分治法在大小为n的两个数据库中的第n个最小数,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我们有两个大小为n的数据库,其中包含没有重复的数字。我们总共有2n个元素。可以通过查询一次访问一个数据库来访问它们。该查询是这样的,您给它一个k,它返回该数据库中第k个最小的条目。我们需要在O(logn)查询中的所有2n个元素中找到第n个最小的条目 这个想法是使用分而治之,但我需要一些帮助来思考这个问题。谢谢 不久前我在资格考试中看到了这个问题,闻起来像是家庭作业问题。因此,我只提出两项建议: 学习二进制搜索,仔细注意循环不变量的精确性质。乔恩·本特利的书《编程珍珠》有一个很好的解释 尝试推广
这个想法是使用分而治之,但我需要一些帮助来思考这个问题。谢谢 不久前我在资格考试中看到了这个问题,闻起来像是家庭作业问题。因此,我只提出两项建议:
- 学习二进制搜索,仔细注意循环不变量的精确性质。乔恩·本特利的书《编程珍珠》有一个很好的解释
- 尝试推广二进制搜索的不变量
- 用各种特殊情况画一幅画:
- DB1中的每个数字都小于DB2中的每个数字
- 反之亦然
- DB1等于DB2
- DB2中的每个数字都是DB1中相应数字的两倍
- 请注意,您的“数据库”实际上是两个排序的数组
- 从数组的“中间”提取元素并比较它们。比较的结果可能允许您“排除”某些部分
- 或者我们先计算最小的元素,然后计算第二小的、第四小的、第八小的,等等,直到我们达到我们想要的大小,每一步都是在恒定的时间内完成的。对我来说,这听起来不太可能
- 或者我们从一个大小为n的问题开始,然后我们执行一些恒定时间操作,这允许我们通过解决大小为n/2的问题来解决原始问题。显然,我们可以在恒定时间内解决n=1的问题,从而完成该算法。这听起来更有道理
- 我是这样想的。既然这是一个教育问题,我建议你停止阅读,如果其中任何一点让你想,“啊哈,我没有想到这一点,我可以自己进一步思考。”
1) 与sdcwc的观察结果相同:对于它是从0开始还是从1开始,可能会有轻微的争论,因此可以将数据库视为一个排序数组。我要元素0,我得到最小的。我要12个,我得到最小的13个。等等我发现这更容易想象
2) 我们知道我们在寻找一个O(logn)算法。这意味着粗略地说,我们在寻找两件事中的一件:
除非我犯了错误,否则其余的都是编码。当k是奇数时,用一个额外的小参数来解释off-by-1,这个解实际上是O(logk),这是O(logn),因为k@Tom:这种事情对于教授来说相当典型。当一位教授写下两条建议时,他想到了第三条。我想我要离开了:-)@Tom:两个建议:恐惧和惊讶,还有无情的效率。@Steve,@Tom:还有对教皇近乎狂热的忠诚!!!