矩阵
压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。
k维数组的行主映射和列主映射
行主映射map(i1, i2, ..., ik) = i1 u2 u3 ... uk + i2 u3 ... uk + ... + ik-2 uk-1 uk + ik-1 uk + ik
列主映射 map(i1, i2, i3, i4) = i4 u3 u2 u1 + i3 u2 u1 + i2 u1 + i1
特殊矩阵——三对角矩阵
三对角矩阵的概念 三对角矩阵就是对角线、邻近对角线的上下次对角线上有元素,其他位置均为0的矩阵。 三对角矩阵是一种特殊的上Hessenberg矩阵(这个就是上三角矩阵加上下三角部分的第一条次对角线有元素,其他都为0元素)。
三对角矩阵的特性 设一个n*n的方阵A,对于矩阵A中的任一元素aijaij,当|i-j|>1时,有aij=0(0≤i≤n−1,0≤j≤n−1)aij=0(0≤i≤n−1,0≤j≤n−1)时,矩阵A为三对角矩阵。 三对角矩阵中除主对角线及在主对角线上下最邻近的两条对角线上的元素外,所有其他元素均为0。
三对角矩阵的压缩存储 可以利用三对角矩阵的上述特性,只存储主对角线及其上、下两侧次对角线上的元素,其他的零元素一律不存储。对一个nn的三对角方阵A,元素总数有n2n2个,而其中非零的元素共有3n-2个。因此,存储三对角矩阵时最多只需存储3*n-2个元素。
可以仿照对称矩阵的压缩存储,可用一维数组B存储三对角矩阵A(这要区分两种存储方式:行优先方式和列优先方式)。
(1)行优先方式存储
(2)列优先方式存储
(3)补充:对角线
特殊矩阵——对称矩阵
- 对称矩阵的概念 元素以主对角线为对称轴对应相等的矩阵。
- 对称矩阵的特性 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵。 设一个n*n的方阵A,对于矩阵A中的任一元素aijaij,当且仅当aijaij=ajiaji时(0≤i≤n-1,0≤j≤n-1)时,矩阵A为对称矩阵。
- 对称矩阵的压缩存储 可以利用对称矩阵的上述特性,只存储对角线及对角线以下的元素,或者只存储对角线及对角线以上的元素,前者称之为下三角阵,后者称之为上三角阵。
对一个nn的对称方阵A,元素总数有n2n2个,而上三角阵或下三角阵的元素共有n+(n-1)+(n-2)+……+2+1=n(n+1)/2个元素。因此,存储对称方阵时最多只需存储n*(n+1)/2个元素。 利用对称矩阵的对称性,可以用一维数组B存储对称矩阵A(这主要要区分四种存储方式:行优先方式存储下三角阵、行优先方式存储上三角阵、列优先方式存储下三角阵和列优先方式存储上三角阵)。 (1)行优先方式存储下三角阵
(2)行优先方式存储上三角阵
(3)列优先方式存储下三角阵
(4)列优先方式存储上三角阵
稀疏矩阵
非零元素远远少于矩阵元素个数


时间复杂度
常数操作
一个操作和样本的数据量没有关系,每次都是固定时间内完成的操作,叫作常数操作
时间复杂度就是对常数操作数量指标的衡量
常数项时间
评价一个算法的好坏,先看时间复杂度,然后分析不同数据样本下的实际运行时间,也就是常数项时间
对数器和比较器
对数器
用于测试自己的程序
随机样本生成器
public static int[] generateRandomArray(int maxSize, int maxValue) {
// 大小在[1, maxSize]范围的随机数组
int[] arr = new int[(int)((maxSize + 1) * Math.random())];
// 向数组中填充随机数,范围时-maxValue到maxValue
for(int i = 0; i < arr.length; i++) {
arr[i] = (int)((maxValue + 1) * Math.random()) - (int)((maxValue + 1) * Math.random());
}
return arr;
}
验证器
比较器
JAVA中,一个专门的类去实现(imp)compartor接口(也可以类实现Comparable)
返回正数时,第二个参数在前;负数第一个参数在前
哈希表与哈希函数
哈希函数几个特点:
- 输入域无穷大,输出域有限
- same in -> same out
- different in -> same out(哈希碰撞)
- 离散性和均匀性
40亿个数统计词频

利用哈希函数将原始数据分为100个种类(先哈希后模100),每个种类用一个哈希表,每个哈希表最多32G/100,最后得到100个词频最高的数
滑动窗口
初始状态 L 和 R都在数组最左边,在任何时刻可以向右移动,但是L不超过R
动态求最大值
利用双端队列:双端队列要维持一种结构,队列中存放元素下标

- R右移时,如果在当前位置合适直接从尾部进入 如果在当前位置不合适,从尾部弹出数,直到合适为止
- L右移时,如果当前元素是头节点,直接删除,如果不是头结点则忽略
Master公式

T(N) = a * T(N/b) + O(N^d)
T(N)---母问题的规模
T(N/b)---子问题的规模 ==子问题的规模必须一样==
a---子问题调用次数
O(N^d)---除了子问题之外的时间复杂度
