Redis的ZSet类型底层用到了跳表,来支持平均
需要注意的是,Redis使用跳表时,实际用了跳表和哈希表双份保存,来分别支持高效的范围查找和单点查询(哈希表不支持有序)。
Redis的ZSet类型底层用到了跳表,来支持平均
需要注意的是,Redis使用跳表时,实际用了跳表和哈希表双份保存,来分别支持高效的范围查找和单点查询(哈希表不支持有序)。
设计模式是对软件设计问题常见问题的通用解决方案,使用设计模式可以提高代码的可读性、可维护性和复用性。此外,设计模式还为设计决策提供了共同的语言和框架。
一般来说,设计模式可以分为三类:创建型模式、结构型模式、行为模式。
函数式编程是一种“编程范式”,以函数为基本构建单元。在这种范式中,函数可以作为参数传递给其他函数、作为返回值返回,或赋值给变量。
由于Java不支持单独定义函数,我们可以将静态方法视为独立的函数,将实例方法视为自带
this
参数的函数。(from 函数式编程 - Java教程 - 廖雪峰的官方网站)
Java8引入了对函数式编程的支持,主要包括以下几个方面:
NullPointerException
。Floyd算法可以求任意两点之间的最短距离(多源最短路径),核心思想是将每个点作为中间点去更新最短路径。
Dijkstra算法可以求一个点到其他点之间的最短距离(单源最短路径)。
滑动窗口算法的核心思想是通过两个指针来定义一个窗口,通过动态调整窗口大小和位置来求解问题。
通常用于解决子数组、子串、子序列相关问题,比如:最大最小子数组(最大子数组和)、(包含所有字符的/无重复字符的)子字符串、定长子数组的最大/小值、滑动窗口平均值。
回溯就是暴力穷举,是一种搜索方式,其核心思想是从一个初始状态出发,深度优先搜索遍历所有可能的解决方案(解空间),如果确定某种方案不可行就回溯到上一步重新搜索。一般用来解决组合问题(无序)、子集问题(无序)、排列问题(有序)、字符串切割问题、棋盘问题等。
贪心算法的思想是在每个决策阶段,选择局部最优解,以此获取全局最优解。
动态规划
栈是一种「先进后出」的数据结构。单调栈是一种特殊的栈,在满足「先进后出」规则基础上,同时满足「从栈底到栈顶的元素单调递增/减」,因此也分为单调递增栈,单调递减栈。
单调栈用来解决下一个更大/小元素、上一个更大/小元素这一类的典型问题。比如739. 每日温度,84. 柱状图中最大的矩形,42. 接雨水都是这类问题。
队列是一种「先进先出」的数据结构。单调队列是一种特殊的队列,在满足「先进先出」规则基础上,同时满足「从队首到队尾的元素单调递增/减」。
单调队列用来解决滑动窗口内的最大/小值、中位数的动态查询这一类问题。比如239. 滑动窗口最大值。