时间复杂度

本文详细解析了HashMap的get方法时间复杂度,包括O(1)、O(N)、O(logn)的不同情况,以及与红黑树的关系,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常看到说HashMap的get方法时间复杂度是O(1)、O(N)、O(logn),所以针对这几个内容我大概梳理一下。

  • O(1): 常数时间复杂度,操作的运行时间与输入规模无关,是最理想的情况。

  • O(log n): 对数时间复杂度,常见于分治算法和二分搜索等。

  • O(n): 线性时间复杂度,操作的运行时间与输入规模成正比。

  • O(n log n): 线性对数时间复杂度,常见于一些高效的排序算法,如快速排序和归并排序。

  • O(n^2): 平方时间复杂度,常见于一些简单的嵌套循环算法。

  • O(n^k): 多项式时间复杂度,其中 k 是常数,通常表示更高次幂的多项式时间复杂度。

  • O(2^n): 指数时间复杂度,常见于一些指数级增长的问题,如穷举搜索。

  • O(n!): 阶乘时间复杂度,通常表示在排列组合问题中的情况。

一般我们常用的是O(1)、O(N)、O(logn)、O(n^2)。
上述描述的HashMap的get方法。如果通过key得到的hashCode,通过hash方法得到hash值,再通过hash & (length-1)得到数组下标。
如果当前的Node节点只有一个,那么一次查询就得到,这个时候时间复杂度是O(1)。
如果当前是多个Node节点,那么需要遍历,调用next一直循环对比,这个时候时间复杂度是O(n)。
如果当前节点是TreeNode节点,红黑树也是二叉树的一种,所以时间复杂度是O(logn)

部分简单的代码案例:

package com.jarvis.java;

/**
 * @author jinzhaopo
 * @date 2024-01-19 11:33
 */
public class Func {

    public static void main(String[] args) {
        testTo3(516);
    }


    /**
     * O(1)
     *
     * @param i
     */
    public static void testTo(int i) {
        //执行一次
        System.out.println(i);
    }

    /**
     * O(n)
     *
     * @param i
     */
    public static void testTo1(int i) {
        for (int i1 = 0; i1 < i; i1++) {
            //执行n次
            System.out.println(i1);
        }
    }

    /**
     * O(n^2)
     *
     * @param i
     */
    public static void testTo2(int i) {
        for (int i1 = 0; i1 < i; i1++) {
            for (int i2 = 0; i2 < i; i2++) {
                System.out.print(i1 + "," + i2 + "; ");
            }
            System.out.println();
        }
    }

    /**
     * O(logn)
     * @param i
     */
    public static void testTo3(int i) {
        for (int i1 = 1; i1 < i; i1 = i1 * 2) {
            System.out.println(i1);
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没脸见人555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值