在 O(n) 时间和 O(1) 空间中生成数组的随机排列

2024-04-24

我们必须生成数组{1,2,3,..,n} in O(1) space.
我能够做到O(n) space.

I did O(n)空间解决方案,首先存储数组,然后将其随机化。但是如何在不存储数组的情况下做到这一点O(1) space.

我只是生成随机数,而不是存储它们,我需要打印它们,因为存储需要 O(n) 空间,但我需要在 O(1) 空间中进行,我的疑问是,如果我们继续生成随机数并且打印它们,可能有一些 1 到 n 之间的数字可能会生成多次,有些可能不会生成。那么如何在 O(1) 空间中将所有数字精确打印一次呢?

P.S.-我没有得到任何数组。输入只是“n”,我必须在 O(n) 时间和 O(1) 空间中打印数组 {1,2,3,...,n} 的排列。


我已经构建了一个线性反馈移位寄存器生成器解决方案,我认为它满足您的要求。该实现基于斐波那契 LFSR,因此它可以实现给定位数的完整周期。我继续输入最多 19 位的多项式系数,并根据指定的值选择适当的系数集N。生成的值大于N被卡入水中,但整个周期中的值总数小于2N所以它会产生你的N值在O(N)时间。 LFSR 保留一个状态字,所以它是O(1) space.

下面是 Ruby 中的实现:

#!/usr/bin/env ruby -w

# Linear Feedback Shift Register generator which operates on smallest bit
# range possible for a specified integer range, and skips over values outside
# the specified range. Since this attains full cycle length for the specified
# number of bits, and the number of bits is minimized relative to the specified
# N, the total number of iterations is bounded by 2N and is therefore O(N).
class LFSR
  # Polynomials for maximal LFSRs determine shift amounts for up to 19 bits.
  # See https://en.wikipedia.org/wiki/Linear_feedback_shift_register for
  # details. Add more entries if you need more than 19 bits.
  SHIFT_AMT = [
    [], [], [1], [1], [1], [2], [1], [1], [2, 3, 4], [4], [3], [2],
    [1, 2, 8], [1, 2, 5], [1, 2, 12], [1], [2, 3, 5], [3], [7], [1, 2, 5]
  ]

  # Constructor for the LFSR.  Specify the N and seed value.
  def initialize(n, seed)
    @n = n
    @state =  (seed % n) + 1
    @num_bits = Math.log2(n).floor + 1
  end

  # Generate the next iterate of the LFSR.  If it's above the specified N,
  # keep trying until you're done.
  def next_value
    loop do
      bit = @state
      SHIFT_AMT[@num_bits].each { |amt| bit ^= (@state >> amt) }
      @state = ((@state >> 1) | ((bit & 1) << (@num_bits - 1)))
      return @state if @state <= @n
    end
  end
end

N = (ARGV.shift || 100).to_i # Specify the 'N' value on cmd line. Default = 100
SEED = (ARGV.shift || 0x7FFF).to_i # Optionally specify a "seed" for the LFSR
my_lfsr = LFSR.new(N, SEED)  # Instantiate an LFSR object
N.times { p my_lfsr.next_value }   # Invoke it N times, print the results
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 O(n) 时间和 O(1) 空间中生成数组的随机排列 的相关文章

  • 为什么 C++ 中的 rand() 函数不是真正随机的

    我制作了非常简单的随机函数 并将结果保存在文件中 我使用该程序创建了两个不同的文件 并且它们中的信息完全相同 为什么会发生这种情况 这是我的简单程序 include
  • 使用堆属性按排序顺序打印树 (Cormen)

    我对算法理论 来自 Cormen 感到耳目一新 二进制尝试一章中有一个练习 要求 min heap 属性可以用来打印 n 节点的键吗 树在 O n 时间内排序 展示如何做 或解释为什么不做 我想是的 这是可能的 在最小堆中 节点中的元素小于
  • 对于范围从 0 到最大值的 uint64_t 键,最佳哈希函数是什么?

    假设我们有一组元素并希望将它们存储在哈希映射中 例如std unordered set 并且每个元素都有一个 type 的键uint64 t其值可以从 0 到最大可能值变化 使用简单哈希函数 其中键的哈希值就是键本身 是最佳选择吗 它是否取
  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • 在 O(nloglogn) 最坏情况时间内对具有 O(logn) 个不同元素的 n 元素数组进行排序

    目前的问题是标题本身的内容 即给出一种算法 该算法在 O log logn 最坏情况时间内对具有 O log n 个不同元素的 n 元素数组进行排序 有任何想法吗 此外 您通常如何处理具有多个非不同元素的数组 O 日志 日志 n 时间足以让
  • python中的指数分布随机生成器(对数函数)?

    我真的需要帮助 因为我被困在代码的开头 我被要求创建一个函数来研究直方图上的指数分布 函数为 x log 1 y 是一个常数 我在代码中将其称为 lamdr 并简单地给了它 10 我给了 N 随机数的数量 10 并运行了代码 但结果和生成的
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 天气预报算法多样

    目前 英国气象局的预测引发了一场巨大的 风暴 他们预测冬季将是温和 潮湿的冬季 而北爱尔兰的气温却是有记录以来最冷的 地面上有厚厚的积雪 这在 12 月通常很少见 这是我很想尝试的东西 并不是我声称我可以击败他们 而是想知道人们目前正在使用
  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的
  • 我怎样才能找到圆的所有点? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给定半径和圆心坐标 如何找到圆的所有
  • 如何修复错误嵌套/未闭合的 HTML 标签?

    我需要通过使用正确的嵌套顺序关闭任何打开的标签来清理用户提交的 HTML 我一直在寻找一种算法或Python代码来做到这一点 但除了PHP等中的一些半生不熟的实现之外 还没有找到任何东西 例如 类似的东西 p p ul li Foo bec
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 无痛“算法分析”培训? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在大学时曾有过一次关于 算法分析 课程的痛苦经历 但最近发现在大学中需要它真实世界 无论如何 我正在
  • 在二维平面中找到距离 P 点最近的 K 个点

    资料来源 亚马逊面试问题 解决方案1制作大小为 K 的堆并按最小距离收集点O NLogK 复杂 解决方案2 取大小为 N 的数组并按距离排序 应该使用QuickSort 霍尔修改 取前 K 点作为答案 这太复杂了 NlogN 但可以优化到近
  • 算法:最大计数器

    我有以下问题 您有 N 个计数器 最初设置为 0 并且您对它们有两种可能的操作 increase X 计数器 X 加 1 max counter 所有计数器都设置为任何计数器的最大值 给出一个包含 M 个整数的非空零索引数组 A 该数组代表
  • 可重复的随机数系列

    如何在 PHP 中获得一系列可重复的伪随机数 在旧版本的 PHP 中 我只需在RNG http en wikipedia org wiki Random number generation 但它不再起作用了 因为 PHP 改变了 rand
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数

随机推荐

  • boost::shared_mutex 多读取器/单写入器互斥体

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • 如何通过脚本使Texture2D可读

    我想让用户能够解码从图库加载的 QR 图像 我找到了一个插件来探索图像并将其加载为texture2D 但是要解码该 QR 代码 Texture2D 必须是可读 可写的 我检查了该插件 对于 Android 它使用 jar 进行探索和加载内容
  • 从 PhoneGap 重新启动设备

    有没有办法用phonegap cordova重启设备 我该怎么做呢 我认为这在 iPad iPhone 上可能不可能 但在 Android 上可以 首先 除非您的设备已root 越狱 否则基本上无法完成 取决于我们谈论的是Android o
  • Visual Studio 2010:如何在解决方案中强制执行项目的构建顺序?

    我在 Visual Studio 2008 中没有遇到任何问题 但 VS 2010 似乎有问题 我敢打赌这可能是我的问题 我有一个包含 ASP NET 网站项目和一些 C 项目 BLL DAL NUnit 中的测试 的解决方案 我已将测试项
  • Java:如何复制一个对象,使其来自同一个子类?

    我尝试使用一个简单的例子来更好地理解 我有一堂课Tool以及正在延伸班级的子班Tool Hammer Saw 两者都定义了一些字段 例如weight两者都是重写方法getCost有自己的实现 Tool first tool new Hamm
  • 如何以及何时在 MySQL 中正确使用 SLEEP()?

    和 关联我的另一个问题 https stackoverflow com questions 4284162 calling stored procedure sequentially from sql file and php fails
  • Java节流机制

    Update 我使用的是 Java 1 6 34 没有机会升级到 Java 7 我有一个场景 每分钟只允许调用一个方法 80 次 它实际上是由第 3 方编写的服务 API 如果调用次数过多 它会 关闭 忽略调用 其 API public c
  • 多种形式的异常处理

    当我调试时与运行编译的 exe 时 我看到不同的行为 异常被捕获或未被捕获 我有两个表格 Form1 和 Form2 Form1 上有一个按钮 用于实例化并调用 Form2 上的 ShowDialog Form2 上有一个按钮 故意产生除以
  • 使用布隆过滤器有什么好处?

    我正在阅读布隆过滤器 它们看起来很愚蠢 使用布隆过滤器可以完成的任何事情 都可以使用单个哈希函数而不是多个哈希函数在更少的空间内更有效地完成 或者看起来就是这样 为什么要使用布隆过滤器以及它有何用处 亚历克斯已经解释得很好了 对于那些还没有
  • Laravel 5.4:如何保护 api 路由

    我有一个 React 应用程序 它从 laravel api 中获取数据 定义如下 routes api php this is default route provided by laravel out of the box Route
  • Swift 崩溃日志中的“Arg = Exploded”是什么意思? [复制]

    这个问题在这里已经有答案了 我从 Crashlytics Fabric 收到崩溃日志 内容如下 function signature specialization
  • 是否可以在新的密钥库中安装现有的私钥和 ssl 证书?

    我们在服务器故障期间丢失了用于生成 CSR 的原始密钥库 我们有私钥 key 文件 和原始 CSR csr 文件 的备份 是否可以用这些重建密钥库 由于创建证书链的所有说明都需要原始密钥库 这适用于 Tomcat 7 0 27 Thanks
  • 切换分支时发生致命 Git 错误

    错误信息 致命 git checkout 更新路径与切换分支 强制不兼容 如何解决这个 Git 签出错误 通过明确指定 git checkout HEAD blah 而不是仅仅说 git checkout blah 假设您确实想查看文件 然
  • Android 创建 JSON 对象的 JSON 数组

    您好 有谁知道如何创建一个包含对象的数组 每个对象中都包含多个对象 我似乎无法理解它 结构应该是这样的 Array object subobject subobject object subobject subobject 这是我到目前为止
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • i18next 翻译问题

    我仍然尝试使用 i18next 来翻译我的 jQuery 应用程序 解决了一些一般问题后 此处解决 如何使用i18next 翻译问题 https stackoverflow com questions 13005791 how to use
  • 在后台从 url 加载一个大 plist

    我从 url 加载一个大的 plist 文件 我必须等待几秒钟才能使用该应用程序 有什么解决办法吗 如何在后台加载它 是GCD我需要的 如何实施 My code NSString urlStr NSString alloc initWith
  • 带猫头鹰旋转木马的 Fancybox (lazyLoad)

    我正在使用带有lazyLoad选项的Fancybox v3 5 4和Owl carousel v2 3 4 当我们点击照片时 Fancybox 就会弹出照片 然后 如果我们点击几次 下一步 以获取 Fancybox 上的下一张照片 然后关闭
  • Java:URLConnection合理的超时时间

    默认情况下 URLConnection 的超时时间为 0 无限制 XXXXX 的合理值是多少 URL url URLConnection uCon url openConnection uCon setConnectTimeout XXXX
  • 在 O(n) 时间和 O(1) 空间中生成数组的随机排列

    我们必须生成数组 1 2 3 n in O 1 space 我能够做到O n space I did O n 空间解决方案 首先存储数组 然后将其随机化 但是如何在不存储数组的情况下做到这一点O 1 space 我只是生成随机数 而不是存储