这个计算 a^n 的算法是如何重写以在 O(log n) 时间内运行的?

2024-04-04

Suppose you want to compute an. A simple algorithm would multiply a, n times, as follows:

result = 1;
for(int i =1; i <= n; i++)
    result *= a; 

该算法需要 O(n) 时间。不失一般性,假设 n=2^k

您可以使用以下方案改进算法:

 result = a;
 for (int i = 1; i <= k; i++)
     result = result * result; 

该算法需要 O(log n) 时间。对于任意n,可以修改算法并证明复杂度仍然是O(logn)

So confused, so how is n=2k, and why is k only shown in the second example? Don't understand how this transformed into a O(logn) time complexity...


The second algorithm doesn't work in the general case; it only works if there is some k such that you can write n = 2k. If there is a k where you can do this, then by taking the logs of both sides of the equality you get that log2 n = k. Therefore:

  • 该循环最多计数 k,运行 O(log n) 次。
  • 因此,循环的运行时间为 O(log n)。

如果你想摆脱神秘的 k,你可以写

int result = a;
for (int i = 0; i < log2(n); i++) {
    result = result * result;
}

This more clearly runs in O(log n) time, since the loop runs log2 n times and does O(1) work on each iteration.

我认为“不失一般性”说 n 是 2 的完美幂是不公平的,因为并非所有数字都是!上面的代码仅在 n 是 2 的幂时才有效。您可以使用以下方法将其推广到非二的幂重复平方算法 http://en.wikipedia.org/wiki/Exponentiation_by_squaring,其复杂度为 O(log n) 但适用于任何幂。

希望这可以帮助!

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

这个计算 a^n 的算法是如何重写以在 O(log n) 时间内运行的? 的相关文章

随机推荐

  • C# NotifyIcon ShowBalloonTip 超时

    在我的 C 2 0 框架 应用程序中 我使用通知图标控件 我想从此控件中显示气球提示 但是 showBalloonTip 事件我限制为超时 我想永远显示这个气球 我尝试使用一个计时器来一次又一次地显示气球 但在 vista 中 气球有淡入淡
  • mb_convert_case 未定义函数(Symfony2 FOS/UserBundle)

    在我的 Symfony2 应用程序上 我收到错误 致命错误 在第 18 行 Applications MAMP htdocs application vendor bundles FOS UserBundle Util Canonicali
  • 对JPanel函数的关注:paintComponent()

    你好 我是java编程新手 我需要有人向我解释这些代码行 public class drawpanel extends JPanel public void paintComponent Graphics g super paintComp
  • zend 模型架构

    假设我的数据库中有两个表 项目和用户 我创建了两个扩展 Zend Db Table Abstract 的模型 Model DbTable Users and Model DbTable Projects 现在 创建一个实例是一个好的模式吗
  • 如何向 WordPress 添加简单的 jQuery 脚本?

    我阅读了 Codex 和一些关于在 WordPress 中使用 jQuery 的博客文章 这非常令人沮丧 我已经加载了 jQueryfunctions php文件 但所有的指南都很糟糕 因为他们假设你已经有大量的 WordPress 经验
  • 如何在 gradle 中获取当前选择的构建变体?

    我正在使用带有 gradle 2 2 的 Android Studio RC 我的构建变体部分中有一些变体 我可以选择我想要构建的变体 例如 为匈牙利或德国构建的一个 我在 gradle 脚本中启动了一些任务 例如根据风味 变体更改名称 但
  • Backbone.js 中的分页

    我知道有一个组件可以实现此目的 但根据我所看到的 您必须创建一个扩展组件的新集合 还有另一种方法可以在主干中进行分页吗 我所需要的只是一个上一个和下一个按钮 将每页的项目限制为 12 个 我一直在 javascript 上创建它 对于生产环
  • 尝试在 slack 上为 laravel-botman 启用事件订阅时,如何响应正确的质询值

    这不是我之前的问题的重复here https stackoverflow com questions 52850571 connecting slack to botman in laravel on localhost 我正在使用botm
  • 未找到图像或类型未知 Dompdf 0.8.1 和 CodeIgniter

    我想从生成的图像将图像加载到 PDF 我已经设置了isRemoteEnabled 为 true和 生成的 QRCode 工作正常 这是我的代码 this gt load gt library array pdf ciqrcode data
  • 如何解码包含无效字节的字节对象,Python3

    在python2中 我可以整天生成以字符串格式表示的这些十六进制字节 x00 xaa xff gt gt gt 00 decode hex aa decode hex ff decode hex gt gt gt x00 xaa xff 同
  • 为什么 2 和 4 在 b 之前打印?

    function first return new Promise resolve gt console log 2 resolve 3 console log 4 async function f console log 1 let r
  • 如何使用用户提供的 Hadoop 正确配置 Spark 2.4

    我想使用 Spark 2 4 5 当前稳定的 Spark 版本 和 Hadoop 2 10 2 x 系列中当前稳定的 Hadoop 版本 此外 我需要访问 HDFS Hive S3 和 Kafka http spark apache org
  • 引导多个 angular2 模块时出错

    当我们更新应用程序的某些部分时 我们开始将当前的应用程序转换为 Angular2 所以我们正在尝试用 Angular2 模块 组件替换应用程序的某些部分 第一部分是创建两个不同的搜索组件并将它们放置在 asp net mvc 中的不同视图中
  • grails 更改 gsp 视图中的日期格式

    当我尝试在 gsp 视图中使用日期格式标记来更改日期格式时 但它不起作用 这是我的代码 class MyDate Date date 我的日期控制器 def unixSeconds params date replaceAll as lon
  • 我可以使用Treetop来解析IO吗?

    我有一个文件想要用 Treetop 解析 如果我想解析整个事情 我会使用 rule document category listing end 我真的不想立即将整个文件读入内存 我知道我可以设置解析器来解析一个category listin
  • MySQL 中的行版本控制

    我想在表中包含一个整数版本字段 在每次更新行时自动递增 在 MySQL 中可以做到这一点吗 请注意 我不是在谈论TIMESTAMP 这是不可靠的 因为同一秒内可能会发生两个并发更新 是的 更一般的问题称为缓慢改变尺寸 http en wik
  • 在强类型 MVC 视图用户控件中使用值类型

    我有一个具有以下基本结构的 MVC 用户控件 当我使用它时 它给出了这个错误消息 编译器错误消息 CS0452 类型 decimal 必须是引用 输入以便将其用作参数 泛型类型或方法中的 TModel System Web Mvc View
  • 如何使用 Nokogiri 访问属性

    我有一个访问某些属性的值的简单任务 这是一个简单的脚本 使用Nokogiri XML Builder创建一个简单的 XML 文档 require nokogiri builder Nokogiri XML Builder new encod
  • 如何在子线程中继续ThreadLocal的对象?

    我在 ThreadLocal 中传递了一个对象 现在我当前的线程将创建新的子线程 我希望 ThreadLocal 中的对象也应该继续使用子线程 有什么办法可以做到这一点吗 先感谢您 你需要的是一个InheritableThreadLocal
  • 这个计算 a^n 的算法是如何重写以在 O(log n) 时间内运行的?

    Suppose you want to compute an A simple algorithm would multiply a n times as follows result 1 for int i 1 i lt n i resu