使用一组素数按升序生成整数

2023-11-24

我有一组素数,我必须仅使用这些素数因子按升序生成整数。

例如,如果集合是p= {2, 5} 那么我的整数应该是 1, 2, 4, 5, 8, 10, 16, 20, 25, …

有没有高效的算法来解决这个问题呢?


删除号码并重新插入它的所有倍数(由集合中的素数)进入优先级队列是wrong(就问题的意义而言) - 即它产生正确的序列,但是低效地 so.

它在两个方面是低效的——首先,生产过剩序列;其次,每个 PriorityQueue 操作都会产生额外的成本(操作remove_top and insert通常不是两者兼而有之O(1),当然不在任何基于列表或树的 PriorityQueue 实现中)。

高效的O(n)算法在生成序列时维护返回序列本身的指针,以查找并附加下一个数字O(1)时间。在伪代码中:

  return array h where
    h[0]=1; n=0; ps=[2,3,5, ... ]; // base primes
    is=[0 for each p in ps];       // indices back into h
    xs=[p for each p in ps]        // next multiples: xs[k]==ps[k]*h[is[k]]
    repeat:
      h[++n] := minimum xs
      for each ref (i,x,p) in (is,xs,ps):
        if( x==h[n] )
          { x := p*h[++i]; }       // advance the minimal multiple/pointer

For each minimal multiple it advances its pointer, while at the same time calculating its next multiple value. This too effectively implements a PriorityQueue but with crucial distinctions - it is before the end point, not after; it doesn't create any additional storage except for the sequence itself; and its size is constant (just k numbers, for k base primes) whereas the size of past-the-end PriorityQueue grows as we progress along the sequence (in the case of Hamming sequence, based on set of 3 primes, as n2/3, for n numbers of the sequence).


经典Haskell 中的汉明序列本质上是相同的算法:

h = 1 : map (2*) h `union` map (3*) h `union` map (5*) h

union a@(x:xs) b@(y:ys) = case compare x y of LT -> x : union  xs  b
                                              EQ -> x : union  xs  ys
                                              GT -> y : union  a   ys

我们可以生成平滑数字 for 随意的基础素数使用foldi函数(参见维基百科) 将列表折叠在树状的为了提高效率,创建固定大小的比较树:

smooth base_primes = h   where       -- strictly increasing base_primes  NB!
    h = 1 : foldi g [] [map (p*) h | p <- base_primes]
    g (x:xs) ys = x : union xs ys

foldi f z []     = z
foldi f z (x:xs) = f x (foldi f z (pairs f xs))
 
pairs f (x:y:t)  = f x y : pairs f t
pairs f t        = t

It is also possible to directly calculate a slice of Hamming sequence around its nth member in O(n2/3) time, by direct enumeration of the triples and assessing their values through logarithms, logval(i,j,k) = i*log 2+j*log 3+k*log 5. This Ideone.com test entry calculates 1 billionth Hamming number in 1.12 0.05 seconds (2016-08-18: main speedup due to usage of Int instead of the default Integer where possible, even on 32-bit; additional 20% thanks to the tweak suggested by @GordonBGood, bringing band size complexity down to O(n1/3)).

这在中进行了更多讨论这个答案在那里我们还可以找到它的完整归属:

slice hi w = (c, sortBy (compare `on` fst) b) where  -- hi is a top log2 value
  lb5=logBase 2 5 ; lb3=logBase 2 3                  -- w<1 (NB!) is (log2 width)
  (Sum c, b) = fold                                  -- total count, the band
      [ ( Sum (i+1),                                 -- total triples w/this j,k
          [ (r,(i,j,k)) | frac < w ] )               -- store it, if inside the band
        | k <- [ 0 .. floor ( hi   /lb5) ],  let p = fromIntegral k*lb5,
          j <- [ 0 .. floor ((hi-p)/lb3) ],  let q = fromIntegral j*lb3 + p,
          let (i,frac) = pr  (hi-q)      ;       r = hi - frac    -- r = i + q
      ]    -- (sum . map fst &&& concat . map snd)
  pr = properFraction 

This can be generalized for k base primes as well, probably running in O(n(k-1)/k) time.


(see 这个SO条目为了以后的重要发展。还,这个答案很有趣。和另一个相关答案.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用一组素数按升序生成整数 的相关文章

  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 在 Python 中快速确定小于 10 亿的数字是否为素数

    我目前在 python 中检查数字素数的算法对于 1000 万到 10 亿之间的数字来说速度很慢 我希望它能够得到改进 因为我知道我永远不会得到超过 10 亿的数字 背景是我无法获得足够快的实现来解决项目 Euler 的问题 60 我在 7
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 在java中使用BUBBLE SORT对二维字符串数组进行排序

    类似的问题已经被问过 但从来没有关于二维字符串数组 因此在尝试了很长时间之后我找不到我想要的 我正在尝试使用 BubbleSort 对 java 中的 2D 字符串数组进行排序 作为输入 我收到一个二维字符串数组 一个表 以及您应该排序的
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 平铺单纯形噪声?

    我 作为业余爱好者 对伪随机噪声生成很感兴趣 特别是 Perlin 和 Simplex 算法 Simplex 的优点是速度 尤其是在更高的维度上 但 Perlin 可以相对容易地平铺 我想知道是否有人知道平铺单纯形算法 固定维度就好 泛型更
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 我正在尝试寻找“调酒师算法”

    我正在解决旧编程竞赛中的一些示例问题 在这个问题中 我们输入了我们有多少调酒师以及他们知道哪种配方 每杯鸡尾酒的制作时间为 1 分钟 我们需要计算是否可以在 5 分钟内使用所有调酒师完成订单 解决这个问题的关键是尽可能高效地分配鸡尾酒 这就
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用

随机推荐

  • Laravel 从数据库加载设置

    我正在寻找一种使用 Laravel 5 从数据库加载设置 配置的有效方法 设置包括key and value列中 模型类基本上如下所示
  • 避免seaborn箱线图中被群图覆盖的重复图例

    在下面基于seaborn的图中 我正在制作一个由群图覆盖的箱形图 两者都是色调的子集 有什么办法可以让它们在图例中不重复两次吗 这是我的代码 ax sns boxplot x name xaxis y name col hue hue da
  • TelephonyManager 对于 IMEI 号码返回 null:什么可能导致此情况?

    我正在开发一个 Android 应用程序 并且正在得到null使用时返回 IMEI 号码TelophonyManager 多款华为手机都出现这种情况 均为 Ascend Y530 这些手机都有 SIM 卡 其他方面似乎都运行正常 我的印象是
  • 如何调试 Rust 中的内存问题?

    我希望这个问题不要太开放 我遇到了 Rust 的内存问题 我得到了通话中出现 内存不足 next on an Iterator特质对象 我不确定如何调试它 印刷品只是把我带到了失败发生的地方 我对其他工具不太熟悉 例如ltrace 所以虽然
  • Spark.python.worker.memory 与 Spark.executor.memory 有何关系?

    这张图对于不同 YARN 和 Spark 内存相关设置之间的关系非常清楚 除了涉及到spark python worker memory 如何spark python worker memory适合这个内存模型吗 Python 进程是否受以
  • Zoho mail 显示 Node Js 中的 535 身份验证失败

    我正在使用 Node Express 和 MongoDB 创建一个应用程序 用户创建成功后 想要发送给用户的邮件 我正在使用 zohomail 并且可以使用这些用户名和密码在线登录 zohomail 但是当我尝试发送邮件时出现错误 code
  • 在 Django 中覆盖外部应用程序的模板

    我想覆盖外部应用程序的模板 allauth 安装在站点包中 不幸的是我读到的建议没有起作用 我将以下内容添加到我的settings py PROJECT ROOT os path normpath os path dirname os pa
  • 在 O(n) 时间内将堆转换为 BST?

    我认为我知道答案并且最小复杂度是O nlogn 但是有什么方法可以让我从堆中创建二叉搜索树O n 复杂 没有算法可以在 O n 时间内从堆构建 BST 原因是给定 n 个元素 您可以在 O n 时间内从它们构建一个堆 如果您有一组值的 BS
  • 有没有办法强制 std::array 完全初始化

    我在用std array
  • 为什么C++中允许从外部修改常量对象的指针成员变量的内存?

    我一直试图理解 当我在 C 中编写一个带有常量参数和该对象内部的指针变量的函数时 const 标志并不能保护底层内存免受修改 例如 在以下位置执行以下操作是完全合法的operator 类的函数称为X class X public X ope
  • 使用 StructureMap 实现策略模式的最佳方法

    我的 Web 应用程序在业务逻辑和表示逻辑方面有一些细微的变化 具体取决于登录的用户类型 似乎通过根据用户类型注入不同的具体类来获得变化非常适合 DI 所以我想知道我应该使用 StructureMap 的哪些功能来实现这一目标 或者我是否偏
  • 如何在 Blade 模板中包含子视图?

    我正在尝试使用 laravel 建立一个网站 但我确实在文档未涵盖的基本内容上遇到了麻烦 在这种情况下 我看到它说我可以通过使用将一个视图包含在另一个视图中 include view name 什么是视图名称 它保存在哪里 我尝试创建一个文
  • 在 Django 中缓存站点地图

    我使用 Django 的默认站点地图应用程序实现了一个简单的站点地图类 由于执行时间较长 我添加了手动缓存 class ShortReviewsSitemap Sitemap changefreq hourly priority 0 7 d
  • 会话变量的替代品是什么? [复制]

    这个问题在这里已经有答案了 有哪些限制会话变量开发大型网络应用程序 还有什么是最好的会话变量的替代方案 请向我提供会话变量的替代方案 要了解不使用会话的优点 您必须了解会话的工作原理 在默认设置下 会话由用户浏览器中设置的 cookie 来
  • iPad 兼容 HTML Wysiwyg 编辑器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有兼容 iPad 的所见即所得 HTML 编辑器 Edit 我正在寻找的是可以在网络应用程序上运行的东西 而不是本机 iPad 应用程序 我认为
  • 将嵌套 JSON 反序列化为 C# 对象

    我从如下所示的 API 返回 JSON Items Item322A prop1 string prop2 string prop3 1 prop4 false prop1 string prop2 string prop3 0 prop4
  • Firebase 本地服务器

    我刚刚发现 Firebase 如果我不想要付费帐户 有没有办法在我自己的服务器上运行它 或者如果这不可能 Firebase 是开源的 所以我们可以用它们来托管 Firebase 是一项专有服务 不是开源或公共源代码 具有免费层和多个付费层
  • 在spyder中使用系统环境变量

    我有一个用Python 2编码的程序 我需要运行它 我想通过anaconda软件在spyder中运行它 问题是 要通过终端运行程序 我必须事先在系统环境变量中添加两个新变量 计算机中的一个文件夹 其中包含一些必需的包 包含所需许可证的 IP
  • 如何在 React SPA 的浏览器中保留 Auth0 登录状态

    目前 当我创建路由时 我检查 Auth0 方法 isAuthenticated 以确定是否返回受保护的页面或重定向到登录 但是 这种状态仅存在于内存中 并且在浏览器刷新时不会将用户保留在其页面上 我想这样做 这是一个 React RR4 R
  • 使用一组素数按升序生成整数

    我有一组素数 我必须仅使用这些素数因子按升序生成整数 例如 如果集合是p 2 5 那么我的整数应该是 1 2 4 5 8 10 16 20 25 有没有高效的算法来解决这个问题呢 删除号码并重新插入它的所有倍数 由集合中的素数 进入优先级队