【问题标题】:The Randomized algorithm Parody随机算法模仿
【发布时间】:2019-08-23 11:20:23
【问题描述】:

我正在阅读 CLRS,但被问题 5.1-2 卡住了。

描述仅调用 RANDOM(0,1) 的过程 RANDOM(a,b) 的实现。作为 a 的函数,您的过程的预期运行时间是多少 em> 和 b?

这里写的解决方案提供了 O(lg(b-a)) 的复杂度。

http://sites.math.rutgers.edu/~ajl213/CLRS/Ch5.pdf

我也写了一个算法,我想要一些关于它的建议。

Random[a,b]
arr[]={a,....,b}
if(high-low <= 1)
 if(Random[0,1])
  new_arr[high]
  return
 else
  new_arr[low]
  return

if(Random[0,1])
 new_arr[a+b/2,.......,b]
else
 new_arr[a,...........,a+b/2-1]

我的解决方案是基于分而治之的,复杂度也是 O((b-a+1))。

请问我的解决方案正确吗?

【问题讨论】:

  • 你会在codereview.stackexchange.com获得更好的运气。
  • 我也去试试。TIA
  • 当数组的长度不是 2 的幂时,预期的算法似乎无法正常工作。在这种情况下,某些数字的采样频率会高于其他数字。
  • 你能说一个过采样的例子吗?我无法理解。我认为没有过采样,因为我自己使用 mid-1 和 mid 来处理它。@qwertyman
  • 这是一个演示分布问题的 dotnetfiddle - dotnetfiddle.net/QlBulo 在非 2 的幂数中,某些值会比其他值更频繁地出现。

标签: algorithm random clrs


【解决方案1】:

当 b-a+1 不是 2 的幂时会出现问题(如果我正确理解您的代码,但其中缺少一些东西)。

以数组 [1,2,3] 为例。你有 0.5 的概率去 [1] 和 0.5 的概率去 [2,3]。这意味着最终,每个数字的选择概率是:

  • 1:0.5
  • 2 : 0.25
  • 3 : 0.25

即使您将数组划分为 [1,2] / [2,3],概率也不正确,您将拥有

  • 1:0.25
  • 2:0.5
  • 3 : 0.25

【讨论】:

  • 可能你是不正确的,因为 RANDOM[0,1] 返回 0 或 1 的概率是 0.5,并且在下一个函数调用中,数组内容只会是 [2,3] 并且两者的概率它们的出现次数仅为 0.5。我使用了 D&C 技术,或者概率会随着每个独特的函数调用而变化?
  • 我知道 RANDOM[0,1] 的概率为 0.5。我说的是总概率。你怎么得到1?你去 [1,2,3] -> [1]。正如你所说,这种情况发生的概率为 0.5。你怎么得到3?你去 [1,2,3]->[2,3]->[3]。请注意,有两个步骤需要发生,两个步骤单独发生的概率为 0.5,因此两个步骤一起发生的概率为 0.25。因为你需要 RANDOM[0,1] 连续两次返回 1。
  • 好的,我明白你的意思了,但是如果我们暂时离开概率分析,这个算法会在 a 和 b 之间产生随机数吗?
  • @Arpitking 会的。但是书中指定“对 RANDOM(a; b) 的调用返回 a 和 b 之间的整数,包括两个整数,每个这样的整数都有同样的可能性”,所以这不符合函数的描述。
  • @Zoe 对不起我的错误我只是一个不到 2 年经验的本科生,我只是来这里学习的,既不是为了代表也不是为了任何积分。但是是的,我会遵守制定的规则这是一个更好的网站。
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2012-09-08
相关资源
最近更新 更多