数据结构笔记

Posted Keep--Silent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构笔记相关的知识,希望对你有一定的参考价值。

持续更新ing

目录

第一章 绪论

算法复杂度

T ( n ) = 1 a × T ( n b ) + c × n k T(n)=\\left\\ \\beginaligned 1\\\\ a\\times T(\\frac nb)+c \\times n^k \\endaligned \\right. T(n)=1a×T(bn)+c×nk
⇓ \\Downarrow
T ( n ) = n log ⁡ b ( a ) , a > b k n k × log ⁡ b ( n ) , a = b k n k , a < b k T(n)=\\left\\ \\beginaligned n ^\\log_b(a), a>b^k\\\\ n^k \\times \\log_b(n),a=b^k\\\\ n^k , a<b^k\\\\ \\endaligned \\right. T(n)=nlogb(a),a>bknk×logb(n),a=bknk,a<bk

第三章 栈、队列和数组

出栈不同排列个数 卡特兰数: C 2 n n n + 1 \\fracC^n_2nn+1 n+1C2nn

第四章 串

模式匹配KMP

const int Size = 1e6 + 10;
int mynext[Size];
void get_next(string t) 
	t += ' ';
	int n = t.size(), i = 0, j = -1;
	mynext[0] = -1;
	while (i < n) 
		if (j == -1 || t[i] == t[j]) 
			mynext[++i] = ++j;
		
		else j = mynext[j];
	


vector<int> get_all_point(string s, string t) 
	vector<int> ans;
	int i = 0, j = 0;
	int sn = s.size(), tn = t.size();
	t += ' ';
	while (i < sn && j <= tn) 
		if (j == -1 || s[i] == t[j]) 
			i++; j++;
		
		else 
			j = mynext[j];
		
		if (j == tn)ans.push_back(i - tn);

	
	return ans;

第五章 树和二叉树

基本性质

假设总结点数是 n n n,度为 0 0 0的点有 n 0 n_0 n0个,度为 1 1 1的点有 n 1 n_1 n1个,度为 x x x的点有 n x n_x nx个:

  • n = n 0 + n 1 + n 2 + . . . + n x n=n_0+n_1+n_2+...+n_x n=n0+n1+n2+...+nx
  • n − 1 = n 1 + 2 n 2 + 3 n 3 + . . . + x n x n-1=n1+2n_2+3n_3+...+xn_x n1=n1+2n2+3n3+...+xnx

第二条等式成立的理由:
左边=边数=总结点n-1
右边=度为0的点往下无边,度为1的结点往下连着一条边,度为2的结点往下连着两条边,度为x的结点往下连着x条边

当该树为二叉树时:

  • n = n 0 + n 1 + n 2 , n − 1 = n 1 + 2 n 2 n=n_0+n_1+n_2,n-1=n1+2n_2 n=n0+n1+n2,n1=n1+2n2 ⇒ \\Rightarrow n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1

高度为hm叉树的最多结点个数n:
n = m h − 1 m − 1 n=\\frac m^h-1m-1 n=m1mh1

m叉树的结点个数为n,最低高度h:
n = m h − 1 m − 1 n=\\frac m^h-1m-1 n=m1mh1可得 h = log ⁡ m ( n ( m − 1 ) ) h=\\log_m(n(m-1)) h=logm(n(m1))

先中后序非递归遍历

先序

中序

后序

树、森林、二叉树的转换

规则:左孩子右兄弟
性质:树T转成对应的二叉树BT,则T的后序遍历和BT的中序遍历相同。

第六章 图

性质:假设图 G G G的邻接矩阵为 A A A,则 A x A^x Ax的第i行第j列表示的含义是

第七章 查找

二叉平衡搜索树

高为h的二叉平衡搜索树最少的结点数:
当它的一棵子树高度为h-1,另一棵子树高度为h-2,既平衡又结点最少

int GetNumberOfNodes(int n)

	if (n <= 1)
		return n;
	else
		return 1 + GetNumberOfNodes(n - 1) + GetNumberOfNodes(n - 2);

以上代码可用矩阵快速幂优化:
[ 1 1 1 1 0 1 0 0 1 ] × [ f n − 1 f n − 2 1 ] = [ f n − 1 + f n − 2 + 1 f n − 1 1 ] = [ f n f n − 1 1 ] \\left[ \\beginmatrix 1 &1 &1 \\\\1 & 0 &1 \\\\ 0&0&1 \\endmatrix \\right] \\times \\left[ \\beginmatrix f_n-1\\\\f_n-2 \\\\1 \\endmatrix \\right]=\\left[ \\beginmatrix f_n-1+f_n-2+1\\\\f_n-1 \\\\1 \\endmatrix \\right] =\\left[ \\beginmatrix f_n\\\\f_n-1 \\\\1 \\endmatrix \\right] 1JavaScript数据结构学习笔记(封装二叉树)

数据结构与算法笔记(十六)—— 二叉搜索树

LeetCode Java刷题笔记—572. 另一棵树的子树

LeetCode Java刷题笔记—572. 另一棵树的子树

学习笔记:Splay

数据结构与算法笔记(十四)—— 二叉树及二叉树遍历