8.1 霍纳法则

2023-10-27

  以下是一个典型的多项式运算

int y = 4*x*x*x*x +9*x*x*x +2*x*x +7*x +1;

  这个表达式能不能性能优化?
  细数一下这个表达式用了4+3+2+1=10次乘法,同时用到了4次加法。
  可以优化为

int y = (((4*x+9)*x+2)*x+7)*x+1;

  优化后,只有4次乘法和4次加法。直接减少了6次乘法运算。
  这就是霍纳法则,也叫秦九韶算法,最早由中国人发明,用于减少多项式的计算次数。
  霍纳法则原理很简单,缓存重复运算的结果,但是不是动态规划思想,因为不包含递归。
y = a x 4 + b x 3 + c x 2 + d x + e y=ax^4+bx^3+cx^2+dx+e y=ax4+bx3+cx2+dx+e
  合并 a x 4 + b x 3 ax^4+bx^3 ax4+bx3包含的乘以 x 3 x^3 x3重复运算:
( a x + b ) x 3 + c x 2 + d x + e (ax+b)x^3 +cx^2+dx+e (ax+b)x3+cx2+dx+e
  进一步合并乘以 x 2 x^2 x2重复运算:
( ( a x + b ) x + c ) x 2 + d x + e ((ax+b)x+c)x^2+dx+e ((ax+b)x+c)x2+dx+e
  进一步合并乘以x重复运算,得到结果,本质是空间换时间:
( ( ( a x + b ) x + c ) x + d ) x + e (((ax+b)x+c)x+d)x+e (((ax+b)x+c)x+d)x+e
  代码实现就非常简单了

public static int horner(int[] args, int x) {
    int r = args[0];
    for (int i = 1; i < args.length; i++) {
        r = r * x + args[i];
    }
    return r;
}

  python代码如下:

# _*_ coding:utf-8 _*_

class HornerPolynomial:

    def __init__(self, items: list):
        self.__polynomial = items

    @property
    def polynomial(self):
        return self.__polynomial

    # 本身是个函数
    def __call__(self, *args, **kwargs):
        result = 0
        for coefficient in self.polynomial:
            result = result * args[0] + coefficient
        return result

  那霍纳法则实用在哪里?
  1 java String类的hashcode使用霍纳法则计算
  2 用切比雪夫近似值计算sin(x) cos(x)时也用到了霍纳法则
  3 开发工具生成得hashcode代码用到了霍纳法则。
  尤其是切比雪夫近似值的优化,霍纳法则的使用可以说支撑了整个游戏世界。因为3D游戏中的投影计算中,大量使用了正弦余弦。但是计算机的正弦余弦都是用多项式近似值去计算的。只要用到多项式,必用霍纳法则。
  对于计算机来说,乘法的开销远远大于加法,所以减少乘法次数非常重要,常见的减少乘法次数的算法还有矩阵strassen算法,二进制快速幂,Karatsuba算法等。

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

8.1 霍纳法则 的相关文章

随机推荐

  • 面试官: Async是如何被JavaScript实现的

    太久没和大家见面了 因为最近业务上接了新的项目所以写文的时间被严重挤压 这篇 Async 是如何被实现的 其实断断续续已经在草稿箱里躺了很久了 终于在一个夜黑风高的周六晚上可以给他画上一个句号 引言 无论是面试过程还是日常业务开发 相信大多
  • Python 中常见的魔法方法

    什么是Python魔法方法 魔法方法是在Python的类中被双下划线前后包围的方法 如常见的 init new del 等 这些方法在类或对象进行特定的操作时会自动被调用 我们可以使用或重写这些魔法方法 给自定义的类添加各种特殊的功能来满足
  • 内网穿透代理(NPS)搭建以及使用

    与公众号同步更新公众号文章链接 内网穿透代理 NPS 搭建以及使用 部署前提需要一台公网服务器 各大云piao 获取到服务器后需要放行服务器端口 建议所有端口 ALL 新建一个NPS文件夹 mkdir NPS 进入NPS文件夹 cd NPS
  • Go语言面试题--基础语法(11)

    文章目录 1 定义一个包内 全局 字符串变量 下面语法正确的是 2 下面这段代码输出什么 3 下面这段代码输出什么 1 定义一个包内 全局 字符串变量 下面语法正确的是 A var str string B str C str D var
  • 彻底搞懂Vue中的Mixin混入(保姆级教程)

    彻底搞懂Vue中的Mixin混入 保姆级教程
  • 【IC设计】EDA palyground使用

    有时候我们在外地无法使用vivado等工具来进行Verilog编程 可以使用这个在线网站www edaplayground com 这个笔记记录一些需要注意的点 它会自动帮我们建立一个testbench sv 里面写入testbench 需
  • HTML5-画布使用教程

    1 简介画面的基本使用教程 CSS绘图和数据存储原理 橘猫吃不胖 的博客 CSDN博客
  • Python 读取txt文件每一行数据生成列表

    本意是将数据 改为如下形式 push lea push mov call mov mov pop retn mov jmp push mov mov call test jz push call add mov pop retn mov m
  • .PersistenceException: ### Error querying database.Cause: java.lang.NullPointerException

    错误 org apache ibatis io ResolverUtil Checking to see if class com wei mapper UserMapper matches criteria is assignable t
  • c++ protobuf 可能会遇到的坑

    1 发现存在内存泄露 程序退出时记得调用 google protobuf ShutdownProtobufLibrary 这里一定是在程序退出时调用 如果调用后又使用了 protobuf 会出现异常 因为protobuf 中使用构造 会有创
  • Mysql undo log

    一 基本概念 undo log有两个作用 1 为事务提供回滚 2 多版本并发控制 MVCC undo log和redo log记录物理日志不一样 它是逻辑日志 可以认为 当delete操作时 undo log记录的是insert记录 反之亦
  • 【Leetcode】1684. Count the Number of Consistent Strings

    题目地址 https leetcode com problems count the number of consistent strings 给定一个字符串 a a a和一个字符串数组 A A A 问
  • 单链表学习笔记(C语言)

    单链表学习笔记 C语言 一 说明 1 链表 所谓链表 就是用一组任意的存储单元存储线性表元素的一种数据结构 2 结构 链表的每个数据的存储都由两部分组成 1 数据元素本身 其所在的区域称为数据域 2 指向直接后继元素的指针 所在的区域称为指
  • RocketMQ消费者设置了instanceName属性后消息竟不翼而飞

    文章目录 背景 问题重现 生产者代码 消费者代码 紊乱的消费结果 原因分析 消费负载均衡 clientId怎么生成 为什么会生成相同的clientId 解决方案 方案一 不设置instanceName属性 方案二 两个消费者设置不同的ins
  • 踩坑:Python找不到指定路径的文件 最全解决方法

    数据集为ucr时间序列数据集 其中 Adiac文件夹中的文件可以通过下面的代码打开 其他文件格式与Adiac相同 且在同一个目录文件下 跑其他的文件 会出现某某文件不存在的问题 网上找了各种解决方法都尝试了 依然还是会报文件找不到错误 最后
  • 程序媛菜鸡算法题流水账之ZJU机试题

    最近考研分数线还没有正式公布 感觉自己处在危殆边缘 于是分岔路口之多令我眼花缭乱 将近八个月没有碰过IDE 机试路漫漫 且行且记忆 ZJU机试题 from NewCoder 做题顺序为通过率递减 同时推荐用C 用时真的少很多 虽然我选修过但
  • Llama-2大模型本地部署研究与应用测试

    最近在研究自然语言处理过程中 正好接触到大模型 特别是在年初chatgpt引来的一大波AIGC热潮以来 一直都想着如何利用大模型帮助企业的各项业务工作 比如智能检索 方案设计 智能推荐 智能客服 代码设计等等 总得感觉相比传统的搜索和智能化
  • 【GD32】FreeRTOS-ADC-DMA采集

    本文章介绍ADC多通道采集DMA进行传输 并且在任务中实时去获取数据 一 时钟配置 分别配置GPIO ADC DMA时钟 static void SystemClock Configration void rcu periph clock
  • Autofac的AOP面向切面编程研究

    什么是AOP 我的理解是 把系统性的编程工作封装起来 我给这个取个名字叫 Aspect 然后通过AOP技术把它切进我们的业务逻辑代码 业务 这样的好处 Aspect 和 业务 相互独立 既可以让 业务 用到了 Aspect 又让2者互相独立
  • 8.1 霍纳法则

    以下是一个典型的多项式运算 int y 4 x x x x 9 x x x 2 x x 7 x 1 这个表达式能不能性能优化 细数一下这个表达式用了4 3 2 1 10次乘法 同时用到了4次加法 可以优化为 int y 4 x 9 x 2