首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我使用computeIfAbsent计算斐波那契数时,hashmap size()返回不正确的值

当使用computeIfAbsent计算斐波那契数时,HashMap的size()方法返回不正确的值的原因是,computeIfAbsent方法会在计算新值时修改HashMap的内部结构,但是size()方法并不会重新计算HashMap的大小,而是返回HashMap在最后一次扩容之后的大小。

具体来说,computeIfAbsent方法是HashMap中的一个函数式方法,用于根据指定的键计算一个新的值并将其插入到HashMap中。在计算新值时,computeIfAbsent方法会检查HashMap中是否已经存在该键的值,如果存在则直接返回该值,如果不存在则使用指定的计算函数计算新值并插入到HashMap中。

由于computeIfAbsent方法可能会修改HashMap的内部结构,例如插入新的键值对,因此会导致HashMap的大小发生变化。但是size()方法并不会重新计算HashMap的大小,而是返回HashMap在最后一次扩容之后的大小。这就导致了在使用computeIfAbsent方法计算斐波那契数时,HashMap的size()方法返回不正确的值。

为了解决这个问题,可以在使用computeIfAbsent方法计算斐波那契数之后,手动调用HashMap的size()方法重新计算HashMap的大小。可以通过创建一个新的HashMap对象,并将原HashMap中的所有键值对重新插入到新的HashMap中,然后调用新HashMap的size()方法来获取正确的大小。

以下是一个示例代码:

代码语言:txt
复制
import java.util.HashMap;

public class FibonacciCalculator {
    private HashMap<Integer, Integer> cache;

    public FibonacciCalculator() {
        this.cache = new HashMap<>();
    }

    public int computeFibonacci(int n) {
        return cache.computeIfAbsent(n, this::calculateFibonacci);
    }

    private int calculateFibonacci(int n) {
        if (n <= 1) {
            return n;
        } else {
            return computeFibonacci(n - 1) + computeFibonacci(n - 2);
        }
    }

    public int getCacheSize() {
        HashMap<Integer, Integer> newCache = new HashMap<>(cache);
        return newCache.size();
    }
}

在上述示例代码中,我们创建了一个FibonacciCalculator类,其中使用了HashMap作为缓存来存储已计算的斐波那契数。在computeFibonacci方法中,我们使用computeIfAbsent方法来计算斐波那契数,并在计算完成后手动调用getCacheSize方法来获取正确的缓存大小。

请注意,以上示例代码中没有提及腾讯云相关产品和产品介绍链接地址,因为根据要求,不能提及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等流行的云计算品牌商。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《程序员数学:斐波那契》—— 为什么不能用斐波那契散列,做数据库路由算法?

那这个就是斐波那契的基本定义和特性,并且基于这样的特性在计算机科学中,斐波那契常用于;伪随机数生成、AVL二叉树、最大公约数、合并排序算法等。...那么既然 ThreadLocal 是基于斐波那契散列计算的下标索引,那为啥数据库路由算法不能使用同样的方式计算散列索引呢?因为通过验证可以得知,斐波那契散列并不满足严格的雪崩标准(SAC)。...接下来小傅哥就带着大家一起来使用数据验证下。 二、斐波那契计算 斐波那契数列可以通过循环、递归以及封闭式表达式(比奈公式) 的方式进行计算。...例如 HashMap 的扰动函数。 3. 斐波那契散列 其实斐波那契散列是一种特殊形式的乘法散列,只不过它的乘法因子选择的是一个黄金分割比例值,所以叫做斐波那契散列。...乘法散列为什么要用2的幂值作为每次的扩容条件? 你有了解过 0x61c88647 是怎么计算的吗? 斐波那契散列的使用场景是什么?

95640

斐波那契散列算法和hashMap实践

斐波那契散列和hashMap实践适合的场景:抽奖(游戏、轮盘、活动促销等等)如果有不对的地方,欢迎指正!...//计算hash值,未使用扰动函数 int idx = key.hashCode() & (res.length - 1); log.info("key的值{},idx的值{}",key,idx...斐波那契散列算法前置条件:生成模拟数据:随机且不重复的100个数声明散列数组:大小128若有hash冲突,保存map,方便数据查看静态变量声明://黄金分割点private static final int...//map排序if(CollectionUtil.isEmpty(map)){ log.info("斐波那契额散列数据集:{}",JSON.toJSONString(result)); System.out.println...("===》无重复数据,不需要排序"); return;}mapSort(map);使用斐波那契散列算法输出结果展示:斐波那契额散列数据集:38,15,29,22,55,86,70,64,47,32,67,7,60,85,97,95,58,46,14,83,12,72,18,96,36,20,76,59,6,33,50,30,23,42,81,31,66,71,82,61,53,84,41,45,74,63,89,77,90,16,8,37,1,62,65,99,51,78,91,39,5,57,27,56,44,13,92,25,0,24,80,3,94,26,40,34,73,35,88,2,87,11,93,54,69,68,10,17,43,48,19,9,79,21,98,52,4,28,75,49

1.1K00
  • 斐波那契查找不再迷惑

    或者说, 怎么确定数组里裴波那契数的最大值呢?(最后一个值) 答:只要刚好能满足我们的需要就可以了,裴波那契数组的长度,取的是大于等于待查找数组长度的最小值。...不依赖数组的斐波那契查找 我百度“斐波那契查找”的时候, 一大部分基于数组实现的代码都是创建了一个长度固定为20的斐波那契数组。...而第20个斐波那契数是6765,所以这样的代码只能处理长度小于等于6765的数组。...于是就有了另一种编写斐波那契数组的方法: 不依赖数组的编码方法 请点这里: 不依赖数组的斐波那契查找 说一下这种方法和我上面介绍的方法的不同点 我上面介绍的版本: 先把斐波那契数算出来,再全部用数组存起来..., 要用的时候直接从数组里拿就可以了 这个版本: 不用数组存, 只算出来需要的最大的斐波那契数, 要用的时候“临时”计算就可以了 二分,插值和裴波纳契查找的性能比较 二分查找: 二分查找的轨迹可以用一颗判定树来表示

    86411

    C++模板元编程:利用编译时计算和泛型编程

    C++的模板机制允许我们使用编译器的计算能力,将计算过程转移到编译时进行处理,从而避免了运行时的开销。 一个经典的示例是计算斐波那契数列。...在传统的编程中,我们常常使用递归或循环来计算斐波那契数列,然而这样的方法在大规模计算时会存在性能问题。使用模板元编程的方法可以在编译时计算出斐波那契数列的值,而不需要在运行时进行计算。...Fibonacci 的值 // result 变量的值为 55 return 0;}通过使用模板元编程,我们可以在编译时计算出斐波那契数列的值,并将结果作为常量存储在编译阶段。...在Fibonacci模板结构体中,我们定义了一个静态常量value来存储斐波那契数的值。当N大于0时,我们使用递归调用来计算前两个数的和作为当前数的值。...当N等于0或1时,我们定义基准条件,将结果设置为0或1。 在main函数中,我们使用Fibonacci::value来计算第10个斐波那契数。

    59700

    我是如何将递归算法的复杂度优化到O(1)的

    斐波那契数列就是像蜗牛的壳一样,越深入其中,越能发觉其中的奥秘,形成一条条优美的数学曲线,就像这样: ?...按照二分递归的模式,我们可以再次求和斐波那契求和问题。...通过 \(Q\)- 矩阵,我们可以利用如下公式进行计算​ \(F_n\): \[ F_n = (Q^{n-1})_{1,1} \] 如此一来,计算斐波那契数列的问题就转化为了求 \(Q\) 的 \(...对于斐波那契数列这个常见的递推数列,其第 \(n\) 项的值的通项公式如下: \[ a_n = \dfrac{(\dfrac{1+\sqrt{5}}{2})^n - (\dfrac{1-\sqrt{5...}}{2})^n}{\sqrt{5}}, (n> = 0) \] 既然作为工科生,那肯定要用一些工科生的做法来证明这个公式呀,嘿嘿,下面开始我的表演~ 我们回想一下,斐波那契数列的所有的值可以看成在数轴上的一个个离散分布的点的集合

    1.5K10

    深入浅出理解动态规划(一) | 交叠子问题

    任何时候当我们需要求解一个子问题时,我们首先查询这个表,如果这个表中有我们预先对该子问题求解的结果,则我们直接返回表中的这个值,否则我们就对子问题进行计算,并把计算结果存入这个表中,以便在后续计算中可以重复使用...下面的程序是求解第n个斐波那契数的记忆化搜索版本: /* 求解第n个斐波那契数的记忆化搜索程序 */ #include #define NIL -1 #define MAX 100...例如,同样是计算第n个斐波那契数,首先计算fib(0),然后计算fib(1),再计算fib(2),计算fib(3),直到fib(n)。因此,我们采用的是自底向上的方式逐一建立子问题的求解结果表的。...下面是打表法求解第n个斐波那契数的程序。(所谓打表法,就是把计算结果制成表格,然后打印结果,简称打表法,也称制表法。)...下面通过比较递归法、记忆化搜索方法、打表法在求解第n项斐波那契数时的时间开销来分析算法的优劣性。

    1.2K10

    【Java】如何高效计算斐波那契数列:递归与循环的比较与优化

    递归的基本思路 递归是一个常见的编程技巧,它允许函数通过调用自身来解决问题。在计算斐波那契数列时,递归的实现方式非常直观。其核心思路是:通过函数调用自身来计算前两个斐波那契数的和。...递归实现的细节解析 基本情况:当 n 为 1 或 2 时,直接返回 1,因为斐波那契数列的前两项固定为 1。...每计算出一个新的斐波那契数,就更新 last2 和 last1 的值,准备计算下一个斐波那契数。 返回结果:循环结束后,cur 保存了第 n 项的值,直接返回。 3....空间复杂度:空间复杂度为 O(1) ,因为只使用了固定数量的变量存储斐波那契数列中的前两项和当前项。 与递归相比,循环方法的运行效率更高,且内存占用较少,尤其适合计算大规模的斐波那契数。 4....cur,即 5 这种方式非常高效,尤其适用于计算较大的斐波那契数。

    11110

    斐波那契查找原理详解与实现

    最近看见一个要求仅使用加法减法实现二分查找的题目,百度了一下,原来要用到一个叫做斐波那契查找的的算法。查百度,是这样说的: 斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。...他要求开始表中记录的个数为某个斐波那契数小1,即n=F(k)-1;  开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种  1)相等,mid位置的元素即为所求...mid-1]范围内,k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1个,所以可以递归的应用斐波那契查找 ---- 大部分说明都忽略了一个条件的说明:n=F(k)-1, 表中记录的个数为某个斐波那契数小...std; const int max_size=20;//斐波那契数组的长度 /*构造一个斐波那契数组*/ void Fibonacci(int * F) {...(n>F[k]-1)//计算n位于斐波那契数列的位置 ++k; int * temp;//将数组a扩展到F[k]-1的长度 temp=new int [F[k]-

    1.9K80

    斐波那契数

    斐波那契数[1] 描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。...解题思路 利用递归的思想; 当N为0或1时,返回自身的值; 当N大于1时,返回fib(N-2)+fib(N-1)的值 实现 package Array; /** * Created with IntelliJ...斐波那契数[1] 描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。...解题思路 利用递归的思想; 当N为0或1时,返回自身的值; 当N大于1时,返回fib(N-2)+fib(N-1)的值 实现 package Array; /** * Created with IntelliJ...斐波那契数: https://leetcode-cn.com/problems/fibonacci-number/

    30430

    斐波那契数列

    我们都知道斐波那契数(也叫兔子数)是一组十分有趣的数字,首相为1,第二项也是1,之后的每一项就是前两项之和,那么该如何实现输入第n项就打印其对应的斐波那契数字呢?...递归实现 事实上,要实现斐波那契数的打印并不困难,最简单的思路就是递归。 递归就是将斐波那契数计算过程进行提炼,进而得出一段递归。...事实上,当我们输入50,既要打印第50项的数字时,递归的代码就会要运算很长的时间,这是因为递归不会记住之前的项的结果,所以求的项数越大,就会进行越多的重复计算,就会严重拖慢结果的打印时间。...循环实现 这个时候就可以使用循环来会解决递归重复进行计算的问题了 我们可以将第一项和第二项定义为a和b,c=a+b,然后依次进行推移,就可以实现打印斐波那契数了 #include int...要是n与b相等则说明n就是斐波那契数,所以最小偏移量就是0。 要是n介于两个斐波那契数之间,就要取距离n最近的间距。

    49930

    《C++模板元编程:高效实现编译期斐波那契数列计算》

    一、斐波那契数列简介 斐波那契数列是一个非常经典的数学序列,其定义如下:第一个和第二个数都是 1,从第三个数开始,每个数都是它前面两个数的和。...当 N 为 0 或 1 时,编译器会选择这两个特化的模板结构体,从而终止递归。 现在,我们可以使用这个模板结构体来计算斐波那契数列的第 N 个数。...为了进一步优化编译时间,我们可以使用一些技巧。 1. 记忆化:记忆化是一种优化技术,它可以避免重复计算。在我们的斐波那契数列计算算法中,我们可以使用记忆化来避免重复计算已经计算过的斐波那契数。...当计算第 N 个数时,我们首先检查 memo[N] 是否已经被计算过。如果已经被计算过,我们直接返回 memo[N] 的值;否则,我们计算第 N 个数,并将结果存储在 memo[N] 中。 2. ...这样,编译器可以在编译期计算出 fibonacci 函数的返回值,从而避免了运行时的计算。 五、总结 通过 C++的模板元编程,我们可以实现一个在编译期计算斐波那契数列的算法。

    6100

    斐波那契数列

    0x01 刷抖音突然刷到了斐波那契数列,突发奇想就用java写一个斐波那契数列。虽然很早之前学习算法,这应该是最基本的,但是对于一个干着普普通通工作的我已经是需要深思熟虑一番。...0x02 斐波那契数列是指从第3个数开始,每个数都是前两个数的和。数列的前几个数字如下所示:0、1、1、2、3、5、8、13、21、34、55、89……以此类推。...斐波那契数列在数学和计算机领域具有广泛的应用。它们可以描述自然界中许多现象,如植物的分枝、螺旋线形状等。在编程中,斐波那契数列常用于解决一些递归问题,也被用于算法优化和动态规划等方面。...public class Feibonaqi { public static void main(String[] args) { int n = 3; // 要计算的斐波那契数列长度...第三个方法是我询问 gpt 怎么使用递归的方式写,gpt给出答案。 看到那一刻唤醒了记忆,这应该是斐波那契最优写法。 0x04 长期的没有数学思考,已经缺乏了数学思维。所以写的很烂。

    25610

    【C语言】求斐波那契数列的第n位

    斐波那契数列------从第三项开始,每一项都等于前两项之和;而第一项和第二项都是1 1.非递归方法实现 主函数部分,定义变量,初始化变量,输入想求斐波那契数列的第n位 n int main()...,然后将a+b赋给c,即为从第三项开始,每一项都等于前两项之和;每次相加完赋值之后,将b的值赋给a,c的值赋给b,迭代下去;从第二位斐波那契数开始,每迭代一次就能得到下一位的斐波那契数,所以想求第n位的斐波那契数...c; } printf("%d\n", c); } else printf("%d\n", a); return 0; } 使用非递归的方法计算斐波那契数列的第...n位,效率会快很多,但当数值过大时无法计算出准确值. 2....递归方法实现 当n>2时,使用递归返回斐波那契数的前一位和前两位的和;当n返回1.

    16410

    【重修Python】谈一谈递归

    4月 5月 6月 7月 8月 9月 10月 11月 1 1 2 3 5 8 13 21 34 55 89 144 这也非常著名的斐波那契数列...,如下: # 斐波那契数列 def fibonacci(n): if n == 0: return 0 elif n == 1: return 1...但是还没有完,往往我们递归的问题出在后面的异常超时等问题。 Stack overflow ①当我们终止条件不正确的时候,见下图 如果上述阶乘的案例中,不小心将-错写成了+。...拿常规的斐波那契写法举例(见前言中的案例),如果n设置为100,那么你将会看到控制台像卡住一样得不到结果(你需要进行大约 1.67 亿次递归调用)。...maxsize=None 表示缓存的大小没有限制。这将缓存所有已计算的斐波那契数,从而减少时间复杂度。 请注意,这种方法在计算大的斐波那契数时可能会消耗大量内存。

    49340

    DP:斐波那契数列模型

    自底向上或自顶向下求解:通过保存子问题的解(通常使用数组或表格),从最基本的子问题开始逐步求解最终问题。 动态规划的应用场景: 斐波那契数列:通过保存已经计算过的斐波那契数,避免重复计算。...n项的值,所以这里我们的填表顺序应该是从左到右填表,最后我们应该考虑的是返回值的问题,求的是斐波拉契数列的第n项,所以最后的返回值应该是dp[n],做斐波拉契数列模型大概就是这几步。...有关题目 1.第n个太波那契数 题目链接 题目: 样例输出和输入: 这道题的题意很简单就是让我们求太波那契数列的第n项 算法原理: 还是根据上面讲的,首先确定状态表示,这道题我们要求太波那契数列的第...n项的值,所以这道题的dp[i]就表示太波那契数列的第n项的值。...斐波那契数列作为一个经典的递归问题,通过引入动态规划技术,不仅可以有效地降低时间复杂度,还可以避免重复计算,提高算法的效率。

    9810

    递归的理解与实现

    ❝知其然知其所以然 前言 我们在写业务代码的时候,或多或少都会遇到需要使用递归的场景,比如在遍历树形结构时。...求斐波那契数 求特定位置的斐波那契数,用递归实现代码很简单,接下来我们先看下斐波那契数的概念。...0号位置的斐波那契数是0 1号位置的斐波那契数是1 n(n>1)号位置的斐波那契数等于 n-1位置的斐波那契数 + n-2位置的斐波那契数 我们知道怎么计算斐波那契数后,就可以用递归来将其实现了。...我们可以将上述递归的理解中应用到求斐波那契数里,实现思路和实现代码如下: Base case: 0号位置的斐波那契数是0,1号位置的斐波那契数是1。...返回到F(3)时,与第3步一样,获取其右子树的值,然后重复第3至6步的步骤,直至计算出F(3)和F(2)的值,将其相加就得出了F(4)的值,此时F(4)处的值就是我们需要求的斐波那契数,即图中的第6~16

    49920

    LeetCode题解—斐波那契数列

    前言 今天继续算法题:斐波那契数列 题目:斐波那契数列 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。...斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(N) = F(N - 1) + F(N - 2) 其中 N > 1....斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。...示例 1:输入:n = 2 输出:1 示例 2:输入:n = 5 输出:5 提示:0 <= n <= 100 解法一 斐波那契数列,面试中还是比较常遇到的,比较经典的一个题目。...n=1的时候,按道理来不用进入循环,直接返回b值1,跟上述的a冲突了。所以选择进入循环一次,给a赋值了b的值,然后返回a,也就是1。

    1.1K10

    Java 8 函数式编程Java 8 函数式编程

    .* @FunctionalInterface 都是函数接口,没有成员(状态) 高阶函数:参数或返回值为函数 方法引用:类名::方法名 可以 类名::new、String[]::new 流操作 Stream.of...("-1", "0", "1") // 生成 .map(函数) // 映射 .filter(返回布尔值函数) // 过滤器(重构:找for中if) .flatMap(函数) // 平面映射:多个流合并...// 完工者:转换为想要的结果类型 Set characteristics(); // 特征:返回不可变集合 .collect(Collectors.toList(...public interface Supplier { T get(); } // 判定:返回布尔值的函数 Predicate { boolean test(T t); and; 否定...= 0); } 使用 Map 的 computeIfAbsent 方法高效计算斐波那契数列。 这里的“高效”是指避免将那些较小的序列重复计算多次。

    1.1K30

    求斐波那契数列的问题

    前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了。如果真这么想,那就危险了。 递归解法 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。...编译: gcc -o fibo fibo.c 运行计算第5个斐波那契数: $ time ....但是特别注意的是,这种改进版的递归,虽然避免了重复计算,但是调用链仍然比较长。 迭代解法 既然递归法不够优雅,我们换一种方法。如果不用计算机计算,让你去算第n个斐波那契数,你会怎么做呢?...50个斐波那契数: $ gcc -o fibo1 fibo1.c $ time ....斐波那契数列应用 关于斐波那契数列在实际中很常见,数学上也有很多奇特的性质,有兴趣的可在百科中查看。

    60210
    领券