我最近接受了一次采访,采访者给了我以下场景,并问我将使用什么数据结构来实现它:
你有100个大理石,每个大理石是红色、蓝色或绿色。这些大理石被扔进一个袋子里,你需要有一些机制来取回一个随机的彩色大理石(带有替换品)。
好吧,很简单。在问了一些关于约束的问题后,我告诉他我会使用一个简单的数组,其中每个桶代表一个大理石。随机数函数可以用来索引数组,从而产生一个随机的彩色大理石。
这个解决方案很好,但他问:“如果你有很多不同的颜色,每种颜色都有不同的颜色,那会怎么样?”
找到每种颜色的总数(这将是O(n),这对于设置来说很好),并设置一个数组,其中每个桶代表每种颜色的累积总数。例如,如果您的大理石总数为R:3、B:5、G:100000000,那么该数组将看起来像[3][8][1000000008]。然后他说,你现在可以使用带有随机索引的二进制搜索来获得随机颜色的大理石,同时保持正确的概率。有人能解释一下为什么会这样吗?这只是一个修改过的二进制搜索,返回第一个高于随机索引的值吗?
如果你有一个介于1和N之间的随机指数来选择大理石颜色,那么获得特定颜色的概率是k/N,其中k是分配给该颜色的数字数量。你的面试官只是把颜色按顺序排列,这样每种颜色都有正确的数字k分配给它的索引(其中k是该颜色的原始大理石的数量),然后注意到给定1到N之间的随机索引,你可以二进制搜索找到随机索引所在的颜色范围。假设1到N之间的随机指数是均匀随机的,当有k个具有该颜色的弹珠时,这将给出获得该颜色的正确概率k/N。
诀窍在于,你看的是二进制搜索结束的索引,而不是那个位置的值。我还不知道这个算法。谢谢你的描述。我用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]
我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:
我使用这个二进制搜索函数得到一个较大数据集的索引错误。当我输入一个较小的数据集时,即[1,2,3,4,5]搜索5。算法按预期运行。但是,当我获取下面的文本时,使用空参数列表(delimeter char为“”)调用string对象的split方法,并将字符串拆分为列表值,其中每个元素都是字符串,然后搜索单词“culpa”,我最终会出现以下错误: 索引错误:列表索引超出范围 非常感谢你的帮助。非常感
我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码
我有一个二进制搜索树,它的每个节点都有两个值。 所以它的节点是这样的。 我已经根据节点的“name”变量的升序在BST中插入了值。所以树的顺序遍历将按“name”的升序返回节点。 现在我想根据“值”变量的升序显示树节点。无需更改原始树。哪种算法/方法对此最有效?
主要内容:解决问题的代理,搜索算法术语,搜索算法的属性,搜索算法的类型搜索算法是人工智能最重要的领域之一。本主题将解释有关AI中搜索算法的所有信息。 解决问题的代理 在人工智能中,搜索技术是普遍的问题解决方法。AI中的合理代理或问题解决代理主要使用这些搜索策略或算法来解决特定问题并提供最佳结果。解决问题的代理是基于目标的代理并使用原子表示。在本主题中,我们将学习各种解决问题的搜索算法。 搜索算法术语 搜索:搜索是一个一步一步的过程,用于解决给定搜索空间中的搜索问题。
我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。 运行代码时得到的输出是: 移除90后的树。70 80 85 98 100 120 移除70. 80 85 98 100 120后的树 移除85后的树。80 98 100 120 移除98后的树。80 100 120 移除80后的树。100 120 移除120后的树。100 移除100后的树。100