经常看到说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);
}
}
}