Algorithm 使用分治法在大小为n的两个数据库中的第n个最小数

Algorithm 使用分治法在大小为n的两个数据库中的第n个最小数,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我们有两个大小为n的数据库,其中包含没有重复的数字。我们总共有2n个元素。可以通过查询一次访问一个数据库来访问它们。该查询是这样的,您给它一个k,它返回该数据库中第k个最小的条目。我们需要在O(logn)查询中的所有2n个元素中找到第n个最小的条目 这个想法是使用分而治之,但我需要一些帮助来思考这个问题。谢谢 不久前我在资格考试中看到了这个问题,闻起来像是家庭作业问题。因此,我只提出两项建议: 学习二进制搜索,仔细注意循环不变量的精确性质。乔恩·本特利的书《编程珍珠》有一个很好的解释 尝试推广

我们有两个大小为n的数据库,其中包含没有重复的数字。我们总共有2n个元素。可以通过查询一次访问一个数据库来访问它们。该查询是这样的,您给它一个k,它返回该数据库中第k个最小的条目。我们需要在O(logn)查询中的所有2n个元素中找到第n个最小的条目


这个想法是使用分而治之,但我需要一些帮助来思考这个问题。谢谢

不久前我在资格考试中看到了这个问题,闻起来像是家庭作业问题。因此,我只提出两项建议:

  • 学习二进制搜索,仔细注意循环不变量的精确性质。乔恩·本特利的书《编程珍珠》有一个很好的解释

  • 尝试推广二进制搜索的不变量

  • 用各种特殊情况画一幅画:

    • DB1中的每个数字都小于DB2中的每个数字
    • 反之亦然
    • DB1等于DB2
    • DB2中的每个数字都是DB1中相应数字的两倍
这是一个相当困难的问题;如果你直接去做正确性的证明,你会过得更轻松。

提示:

  • 请注意,您的“数据库”实际上是两个排序的数组
  • 从数组的“中间”提取元素并比较它们。比较的结果可能允许您“排除”某些部分

    • 我是这样想的。既然这是一个教育问题,我建议你停止阅读,如果其中任何一点让你想,“啊哈,我没有想到这一点,我可以自己进一步思考。”

      1) 与sdcwc的观察结果相同:对于它是从0开始还是从1开始,可能会有轻微的争论,因此可以将数据库视为一个排序数组。我要元素0,我得到最小的。我要12个,我得到最小的13个。等等我发现这更容易想象

      2) 我们知道我们在寻找一个O(logn)算法。这意味着粗略地说,我们在寻找两件事中的一件:

      • 或者我们先计算最小的元素,然后计算第二小的、第四小的、第八小的,等等,直到我们达到我们想要的大小,每一步都是在恒定的时间内完成的。对我来说,这听起来不太可能

      • 或者我们从一个大小为n的问题开始,然后我们执行一些恒定时间操作,这允许我们通过解决大小为n/2的问题来解决原始问题。显然,我们可以在恒定时间内解决n=1的问题,从而完成该算法。这听起来更有道理

      实际上,它不一定每次都是n/2。它可以是n/3或999*n/1000,结果仍然是O(logn)。但首先寻找n/2并没有坏处

      3) 我们将如何减少这样的问题?如果我们可以从一个数组或另一个数组的开头减去m个元素,使其小于第k个最小元素,那么我们可以找到结果数组对的第(k-m)个最小元素,它将是原始数组的第k个最小元素

      4) 最后,突破性的观察结果是,如果阵列A的第m个最小元素小于阵列B的第m个最小元素,则A的第m个元素不可能是两个阵列组合的第(2m)个最小元素。它比这个值小(或者值相等:我不确定“no repeats”是指“每个数据库中都没有repeats”,还是“组合的数据库之间没有repeats”),因为两个数组中最多有2*(m-1)个元素严格小于它


      除非我犯了错误,否则其余的都是编码。当k是奇数时,用一个额外的小参数来解释off-by-1,这个解实际上是O(logk),这是O(logn),因为k@Tom:这种事情对于教授来说相当典型。当一位教授写下两条建议时,他想到了第三条。我想我要离开了:-)@Tom:两个建议:恐惧和惊讶,还有无情的效率。@Steve,@Tom:还有对教皇近乎狂热的忠诚!!!