项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.Horner法则

假设有一个n次多项式需要计算。
f(x)=anxn+an−1xn−1+⋯+a1x+a0f(x) = a_nx^n + a_{n-1}x^{n-1} + \cdots + a_1x + a_0f(x)=an​xn+an−1​xn−1+⋯+a1​x+a0​
如果直接进行计算,需要n(n+1)2\frac{n(n+1)}{2}2n(n+1)​次乘法与nnn次加法。而乘法的代价是比较大的,所以效率会比较低。

将上面的多项式改写一下

f(x)=anxn+an−1xn−1+⋯+a1x+a0=(anxn−1+an−1xn−2+⋯+a2x+a1)x+a0=(((anx+an−1)x+an−2)x+⋯+a1)x+a0\begin{aligned} f(x) & = a_nx^n + a_{n-1}x^{n-1} + \cdots + a_1x + a_0 \\ & = (a_nx^{n-1} + a_{n-1}x^{n-2} + \cdots + a_2x + a_1)x + a_0 \\ & = (((a_nx + a_{n-1})x + a_{n-2})x + \cdots + a_1)x + a_0\\ \end{aligned} f(x)​=an​xn+an−1​xn−1+⋯+a1​x+a0​=(an​xn−1+an−1​xn−2+⋯+a2​x+a1​)x+a0​=(((an​x+an−1​)x+an−2​)x+⋯+a1​)x+a0​​
求上面的值的时候,很明显可以从括号里由内到位一次计算,最后的计算复杂度为n次乘法与n次加法。

2.java String中的HashCode

看看String类里hashCode的源码。

    public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}

根据源码不难看出,其计算方式就是
s[0]∗31(n−1)+s[1]∗31(n−2)+...+s[n−2]∗31+s[n−1]s[0]*31^{(n-1)} + s[1]*31^{(n-2)} + ... + s[n-2] * 31 + s[n-1]s[0]∗31(n−1)+s[1]∗31(n−2)+...+s[n−2]∗31+s[n−1]

3.MurMurHash

上面的hashCode方法有个不好的地方就是变化不够激烈。比如我们看一下的例子

    @Testpublic void test2() {String s1 = "abcdefg";String s2 = "abcdeff";System.out.println(s1.hashCode());System.out.println(s2.hashCode());}

上面代码运行的结果为

-1206291356
-1206291357

两个相似的字符串,得到的hash值也很相似。

MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby 在2008年发明,并出现了多个变种,都已经发布到了公有领域。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好,现在在libstdc++,hadoop和nginx等很多著名开源项目中使用。

Horner法则,MurMurHash相关推荐

  1. 求幂运算、多项式乘法及Horner法则的应用

    一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 retu ...

  2. 数值分析 | 多项式求值(Horner法则)

    Horner法则 又名秦九韶算法或嵌套乘法,是一种高效的多项式求值算法. 对于 n n n次多项式 f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + ...

  3. 陌生但默默一统江湖的MurmurHash

    看Jedis的主键分区哈希时,看到了名字很萌很陌陌的MurmurHash,谷歌一看才发现Redis,Memcached,Cassandra,HBase,Lucene都用它. 关于Hash,我之前只知道 ...

  4. hash算法MurmurHash

    先看看string的默认hash方法,代码如下 /**      * Returns a hash code for this string. The hash code for a      * { ...

  5. 数据结构 算法与应用C 语言描述第六章,数据结构算法与应用-C语言描述002.pdf

    下载 下载 第2 章 程 序 性 能 以下是本章中所介绍的有关程序性能分析与测量的概念: • 确定一个程序对内存及时间的需求. • 使用操作数和执行步数来测量一个程序的时间需求. • 采用渐进符号描述 ...

  6. 数据结构和算法分析: 第五章 散列

    散列表的实现常常叫做散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术. 5.1 一般想法 散列表的数据结构是一个包括一些项(item)的具有固定大小的数组.通常查找是对于项的某个部分(即数 ...

  7. 16进制字符串转化为10进制数

    同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字,例如"1A",则对应26.题目很简单,实现起来也 ...

  8. 数据结构与算法笔记(一) 程序性能分析

    程序性能:一个程序对内存和时间的需要.要对数据结构和算法给予评价,就必须能够计算程序性能 1. 用操作数和执行步数估计程序的运行时间 2. 用符号法描述程序在最好,最坏,平均情况下的运行时间. 确定程 ...

  9. C语言程序设计:现代方法(第2版)第二章全部习题答案

    前言 本人在通过<C语言程序设计:现代方法(第2版)>自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考.这些答案是本人自己解 ...

  10. 针对关键字是字符串的一个比较好的散列函数

    /* hash function */typedef unsigned int Index;Index Hash( const char *Key, int TableSize ) {unsigned ...

最新文章

  1. 卸载ORACLE 11g
  2. cross_val_score的使用
  3. NSUserDefault 的使用
  4. Linux下,安装配置Weblogic
  5. 转一个网络软件开发的广告
  6. linux 线程_Linux 多线程编程(不限Linux)
  7. request.getParameter、request.getParameterValues、request.getParameterMap用法
  8. 计算机知识竞赛的策划案,计算机趣味知识竞赛活动策划书
  9. 三大抽样分布:卡方分布,t分布和F分布
  10. Ubuntu20.04安装微信的方法
  11. 根据代表性序列预测OTU/ASV生活史策略——寡营养型or富营养型
  12. Swagger对自定义入参和出参(过滤器)的支持
  13. 单片机毕业设计 stm32智能路灯设计与实现
  14. pyltp包下载及使用
  15. 彻底弄懂@Controller 、@Service、@Component
  16. mysql缩写月名转换_mysql数据库时间、字符串类型互转
  17. JavaScript创始人Brendan Eich访谈录
  18. 软件技术专业就业方向分析
  19. MTD系统架构和yaffs2使用、Nandflash驱动设计
  20. 杜克大学计算机专业本科入学条件,杜克大学本科申请条件有哪些?

热门文章

  1. layui 工具条实现分页
  2. FPGA设计中遇到的奇葩问题之“芯片也要看出身”(二)
  3. 实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
  4. JavaScript原型OOP——你上车了吗?
  5. 模块化编程和Jigsaw项目最新早期访问版本使用教程
  6. Nutch1.2二次开发详细攻略(二)【图文】------Windows平台下Nutch1.2的搭建
  7. 关于BinaryFormatter
  8. AS3类库资源大集合
  9. C++ primer第一章 C++概述 纪要
  10. hashmap什么时候由链表转为红黑树