用于确定 n 是否完全平方的 O(log log n) 算法

2024-01-30

是否有已发布的 O(log b) 算法来确定 b 位数字是否为整数的平方?

(如果这个问题超出了本网站的范围,我深表歉意,如果是的话,我很乐意检索它)

更新:我意识到我提出的问题是不合理的。因此,让我通过询问 b 中的次多项式运算的任何算法来修改它。对于常数 k 不一定是 O(log^k b),并且具有“合理”的空间复杂度。操作是按照通常的意义定义的:对于手头的任务来说是合理的(例如加、求反、异或、与、或等)

后脚本: 现在我发现我的问题是无稽之谈。计算 n 位数字的下限平方根的成本小于两个 n 位数字相乘的成本。


  1. if b足够小然后使用sqrt表很复杂O(1)
  2. 如果不是,那么使用位近似是复杂的O(b/2) = O(log n)
  3. 使用完美的方桌也很复杂O(b/2) = O(log n)

但操作速度更快(只需比较和位操作)b位数可以是 max 的完全平方b/2位号,所以表中有2^(b/2)的条目b位数和近似索引搜索(类似于二分搜索)需要b/2 steps

  1. 可以通过近似进行一些改进

创建近似函数y=approx_sqrt(x);并计算y现在你可以检查值< y-c , y+c > 有运行时间~T(2c) where c是常数,取决于近似精度(1,2,3,...)。大多数近似值都较大,因此您可以c=log(b)和你的复杂性突然出现O(log b) = O(log log n)我想这就是你正在寻找的东西。

这是我上面经过测试的实现:

    //---------------------------------------------------------------------------
    int  is_square(int x,int &cnt)      // return sqrt(x) if perfect or 0, cnt = num of cycles ~ runtime
        {
        int y,yy;
        // y=aprox_sqrt(x)
        for (y=x,yy=x;yy;y>>=1,yy>>=2); // halves the bit count
        if (y) y=(y+(x/y))>>1;          // babylonian approximation
        if (y) y=(y+(x/y))>>1;
        if (y) y=(y+(x/y))>>1;
        // check estimated y and near values
        cnt=1;
        yy=y*y; if (yy==x) return y;
        if (yy<x) for (;;)
            {
            cnt++;
            y++;
            yy=y*y;
            if (yy==x) return y;
            if (yy> x) return 0;
            }
        else for (;;)
            {
            cnt++;
            y--;
            yy=y*y;
            if (yy==x) return y;
            if (yy< x) return 0;
            }
        }
    //---------------------------------------------------------------------------

我为您添加了 cnt,以便您可以自己测试复杂性。我使用的大约需要一个好的起始值,所以我将位数减半,这显然是O(log b)但对于bignums and float指数/位数已知,因此它仅转换为单个位/字/基数/指数移位O(1)。顺便说一句,这是IEEE 浮动魔法通过大多数近似来完成sqrt or log功能。

  1. 我的测量结果比我的第一次估计要好(即使对于不精确的巴比伦近似):

     /*----------------
     |          N | T |
     ------------------
     | 1000000000 | 6 |
     |  100000000 | 4 |
     |   10000000 | 2 |
     |    1000000 | 2 |
     ----------------*/
    

where N是循环N对其进行了测试。T is max cnt测试数字的值< 0,N >对于不同的近似值(更适合您的需求)可以看看here http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi

所以我对你问题的回答是YES它确实存在一种比O(log n)用于确定是否n是完全平方(例如我上面的也计算sqrt)但如果​​你还计算基本函数的复杂性,恐怕答案是NO因为即使是位操作也是O(log n)在大数上!!!

BTW the 二分查找sqrt无需乘法也可以完成 https://stackoverflow.com/a/34657972/2521214.

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

用于确定 n 是否完全平方的 O(log log n) 算法 的相关文章

  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • CSS Hex 到速记十六进制转换

    将十六进制转换为速记十六进制的正确算法是什么 例如 996633很容易被转换为 963 但如果是这样怎么办 F362C3 我的第一个猜测是我只取每种颜色的第一个值并使用它 所以 F362C3变成 F6C 但我不知道如何从数学上证明这种方法的
  • 帮助我在 Python 中实现反向传播

    EDIT2 新的训练集 Inputs 0 0 0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 0 1 0 0 0 1 0 1 0 1 0 2 0 1 0 3 0 1 0 4 0 2 0 0 0 2 0 1 0 2 0 2
  • 在 O(nloglogn) 最坏情况时间内对具有 O(logn) 个不同元素的 n 元素数组进行排序

    目前的问题是标题本身的内容 即给出一种算法 该算法在 O log logn 最坏情况时间内对具有 O log n 个不同元素的 n 元素数组进行排序 有任何想法吗 此外 您通常如何处理具有多个非不同元素的数组 O 日志 日志 n 时间足以让
  • 如何读取未知数量的输入?

    我正在使用 C Primer 这本书学习 C In 第1 4 3节 给出了以下关于读取未知数量的输入的示例代码 include
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • 最大流量算法的修改

    我试图解决一个关于最大流量问题 http en wikipedia org wiki Maximum flow problem 我有一个源和两个接收器 我需要找到该网络中的最大流量 这部分是一般的最大流量 然而 在这个特殊版本的最大流量问题
  • 如何修复错误嵌套/未闭合的 HTML 标签?

    我需要通过使用正确的嵌套顺序关闭任何打开的标签来清理用户提交的 HTML 我一直在寻找一种算法或Python代码来做到这一点 但除了PHP等中的一些半生不熟的实现之外 还没有找到任何东西 例如 类似的东西 p p ul li Foo bec
  • 关于合并排序代码中的组合步骤的困惑

    我有一个关于数组上的合并排序如何工作的问题 我理解 划分 步骤 它将输入数组划分为 1 长度的元素 然而 当谈到 合并 部分 组合步骤 时 我感到困惑 例如 给定输入 3 5 1 8 2 除法过程将产生 5 个元素 3 5 1 8 2 我只
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • 如何使用哈希表在最小堆上实现 O(1) 删除

    在某处阅读以下声明 可以使用附加的哈希表来快速删除 最小堆 问题 gt 如何组合priority queue and unordered map这样我就可以实现上面的想法了 include
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • for循环内递归函数的时间复杂度

    如果我们有一个函数 int x 0 int fun int n if n 0 return 1 for int i 0 i
  • 使用 rmultinom() 函数从 R 中的多项分布生成随机数

    我想从具有三个值的多项分布生成大小为 20 的样本 例如1 2 and 3 例如 样本可以是这样的sam 1 2 2 2 2 3 1 1 1 3 3 3 2 1 2 3 1 下面的代码可以工作 但没有得到预期的结果 gt rmultinom
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 为无向无权图实现推重标签算法 s-t 最小割边

    我正在寻找一个好的解决方案来在无向和未加权图中找到 s t 最小切割边 我想使用推送重新标记算法 但我不确定如何实现它以在无向和未加权图上找到最小割 在每对顶点之间有两条反向边 并在所有边上赋予相同的权重 并应用推送重新标记算法 我可以用这

随机推荐