【问题标题】:Binary search - Can someone clear up this interview algorithm?二进制搜索 - 有人可以清理这个面试算法吗?
【发布时间】:2015-08-23 18:06:02
【问题描述】:

我最近接受了一次面试,面试官给了我以下场景,并问我将使用什么数据结构来实现它:

您有 100 颗弹珠,每颗弹珠都是红色、蓝色或绿色。弹珠被扔进袋子里,你需要有一些机制来取回随机颜色的弹珠(有替换)。

好的,很简单。在询问了一些关于约束的问题后,我告诉他我会使用一个简单的数组,其中每个桶代表一个弹珠。可以使用随机数函数对数组进行索引,从而生成随机颜色的大理石。

该解决方案很好,但随后他问“如果您有许多不同的颜色,每个颜色都有

找到每种颜色的总和(这将是 O(n),这对于设置来说很好)并设置一个数组,其中每个桶代表每种颜色的累积总和。例如,如果您的弹珠总数为 R:3、B:5、G:1,000,000,000,则数组将类似于 [3] [8] [1,000,000,008]。然后他说你现在可以使用带有随机索引的二进制搜索来获得随机颜色的弹珠,同时仍然保持正确的概率。谁能向我解释为什么会这样?这是否只是一个修改后的二分搜索,它返回高于随机索引的第一个值?

【问题讨论】:

    标签: arrays algorithm binary-search


    【解决方案1】:

    诀窍是您查看二进制搜索结束的索引,而不是该位置的值。我还不知道这个算法。谢谢你的描述。我在 python 中为你实现了它:)

    import random
    import bisect
    
    # 10 red, 20 blue, 70 green
    counts = [10, 20, 70]
    sums   = [10, 30, 100]
    
    # count how often some color occurs to verify later that the algorithm works correctly
    bins = [0, 0, 0]
    # randomly select 10000 colors
    for _ in range(100000):
        random_index = random.randint(0, sums[-1]) # sums[-1] is the last value in array (100)
        # do binary search in sums array
        result = bisect.bisect_left(sums, random_index)
        bins[result] += 1
    
    print(bins) # example output: [10875, 19732, 69393]
    

    【讨论】:

    • 不错!我有点理解应用程序,但不太了解实现。这解决了问题,谢谢!
    【解决方案2】:

    如果您有一个介于 1 和 N 之间的随机索引来选择大理石颜色,那么获得特定颜色的概率为 k / N,其中 k 是分配给该颜色的数字的数量。你的面试官只是简单地把颜色排序,这样每种颜色都有正确的数字 k 分配给它的索引(其中 k 是该颜色的原始弹珠的数量),然后注意到给定一个介于 1 和 N 之间的随机索引,你可以二进制搜索来找到随机索引所在的颜色范围。假设 1 和 N 之间的随机索引是均匀随机的,这将为您提供当有 k 个具有该颜色的弹珠时获得颜色的正确概率 k / N。

    【讨论】:

    • 好的,澄清一下,当您使用索引 i 执行二进制搜索时,您并没有明确地寻找 i,对吗?
    • 不是本身,不是。一种方法是创建一个大小为 2M 的数组,其中 M 是大理石颜色的数量,其中每种颜色的 2 个整数是该颜色的 1 和 N 之间的开始和结束数字。然后进行二分搜索以找出 i 位​​于哪两个索引之间(或 i 等于哪个索引)。也可以使用大小为 M 的数组来实现,但有点难以解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多