- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给你 N
和一个 int K[]
.
手头的任务是在0 to N-1
之间生成一个等概率随机数。这在 K 中不存在。
N
严格来说是一个整数 >= 0
.和 K.length
< N-1。和 0 <= K[i] <= N-1
.还假设 K 已排序并且 K 的每个元素都是唯一的。
给你一个函数 uniformRand(int M)
它生成 0 to M-1
范围内的均匀随机数并假设此函数的复杂度为 O(1)。
例子:
N = 7
K = {0, 1, 5}
the function should return any random number { 2, 3, 4, 6 } with equal probability.
我可以为此得到一个 O(N) 的解决方案:首先生成一个介于 0 到 N - K.length 之间的随机数。并将由此生成的随机数映射到不在 K 中的数字。第二步将复杂度提高到 O(N)。可以在 O(log N) 中做得更好吗?
最佳答案
您可以利用 K[] 中的所有数字都在 0 和 N-1 之间并且它们不同这一事实。
对于您的示例,您生成一个从 0 到 3 的随机数。假设您得到一个随机数 r
。现在对数组 K[] 进行二分查找。
初始化 i = K.length/2
。
找到 K[i] - i
。这将为您提供数组中 0 到 i 范围内缺失的数字数。
For example K[2] = 5. So 3 elements are missing from K[0] to K[2] (2,3,4)
因此您可以决定是否必须在数组 K 的第一部分或下一部分进行剩余搜索。这是因为您知道 r
。
此搜索将为您提供 log(K.length)
的复杂度
编辑:例如,
N = 7
K = {0, 1, 4} // modified the array to clarify the algorithm steps.
the function should return any random number { 2, 3, 5, 6 } with equal probability.
在 0
和 N-K.length
之间生成的随机数 = random{0-3}
。假设我们得到 3
。 因此我们需要数组 K 中第 4 个缺失的数字。
对数组 K[]
进行二分查找。
初始 i = K.length/2 = 1
。现在我们看到 K[1] - 1 = 0
。因此,在 i = 1
之前没有数字丢失。因此我们搜索数组的后半部分。
现在 i = 2.K[2] - 2 = 4 - 2 = 2
。因此,在索引 i = 2
之前,有 2
个缺失的数字。但是我们需要第四个缺失的元素。所以我们必须再次在数组的后半部分进行搜索。
现在我们到达一个空数组。我们现在应该做什么?如果我们在 K[j] & K[j+1]
之间到达一个空数组,那么它只是意味着 K[j]
和 K 之间的所有元素数组
。 K
中缺少 [j+1]
因此 K[2]
以上的所有元素都从数组中丢失,即 5
和 6
。我们需要 第 4 个元素
,我们已经从中丢弃了 2 个元素
。因此,我们将选择第二个元素,即 6
。
关于algorithm - 生成一个从 0 到 N-1 的随机整数,该整数不在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045158/
如标题所示,ans_list是一个答案列表,ans_index是一个数字(答案在词汇表中的索引,但与atm无关) 这里生成的 tree.anslist 是什么? (例如,仅针对第一个),忽略迭代。 f
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我目前将用户的输入存储在逗号分隔的列表中,如下所示: Userid | Options 1 | 1,2,5 用户在一个数组形式中勾选一组选项,然后用逗号连接起来 1,2,5 然后 MySQ
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将具有一个元素的东西拿走。 这与 How do I “flatte
我想知道如何完全展平列表和包含它们的东西。除其他外,我想出了一个解决方案,它可以将具有多个元素的东西滑倒并将它们放回原处,或者在滑倒后将带有一个元素的东西拿走。 这与 How do I “flatte
这个问题已经有答案了: Convert nested list to 2d array (3 个回答) 已关闭 7 年前。 java中有没有快捷方式可以转换 List> 到 String[][] ?
我在排序时遇到问题 List> 。我创建了一个自定义比较器,在其中编写了对数据进行排序的代码。 public class CustomComparator implements Comparator
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Java Generics: Cannot cast List to List? 我只是想知道为什么下面的java代
试图想出一个 LINQy 方法来做到这一点,但我什么也没想到。 我有一个对象列表<>,其中包含一个属性,该属性是逗号分隔的字母代码列表: lst[0].codes = "AA,BB,DD" lst[1
假设我有这些任务: points = [] point = (1, 2) 我怎么会这样做: points += point 它工作得很好,并且给了我点 = [1, 2]。但是,如果我这样做: poin
如何在 scala 中将 List[Task[List[Header]]] 类型转换为 Task[List[Header]]。 我有一个方法返回 Task[List[Header]] 并多次调用 do
如何在 Java 中查找二维列表的元素? 我有一个参数为 List> 的函数我想知道如何找到这个列表的行和列。 最佳答案 如果你喜欢 List> obj 然后你就可以像这样访问 obj.get(cur
分配 List到 List工作正常。 分配 List>到 List>不编译。 代码 public class Main { public static void main(String[] a
我正在用 Java 编写一个方法,该方法必须接收并迭代 Serializable 的 List。 有什么区别: public void myMethod(List list) { } 和 public
我看到很多人想用 mvvm 更新网格/列表/树的一部分,但他们不想刷新整个列表。 对于所有遇到此问题的人,我做了以下示例。 希望这对你有用。 最佳答案 这是一个简单的例子。整个代码中最重要的是: Bi
我正在为现有的 C++ 库编写包装器,该库使用列表,其中 T 是自定义结构。我被建议使用 vector 而不是列表,但我试图避免修改库。 为了更好地理解这个场景,我做了一个简单的应用程序,使用一个列表
List list List list 这两种声明有什么区别吗? 谢谢, 最佳答案 是的。 List可以包含所有派生自 Base 的不同事物的混合物. List包含同质项(从某种意义上说,它们必须全部
有人可以尽可能详细地解释以下类型之间的区别吗? List List List 让我更具体一点。我什么时候想使用 // 1 public void CanYouGiveMeAnAnswer(List l
我有一个元组列表,每个元组都是一对列表。所以我的数据看起来像: mylist = [(['foo', 'bar'], ['bar', 'bar']),(['bar', 'bar'],['bar', '
也许是一个时髦的标题,但我遇到了以下问题: 给定一个类型为 (a * b) list 的列表,我想创建一个类型为 (a * b list) list 的新列表。一个例子: 给定列表 let testL
我是一名优秀的程序员,十分优秀!