数据结构笔记
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 n−1=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,n−1=n1+2n2 ⇒ \\Rightarrow ⇒ n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
高度为h
的m
叉树的最多结点个数n
:
n
=
m
h
−
1
m
−
1
n=\\frac m^h-1m-1
n=m−1mh−1
m
叉树的结点个数为n
,最低高度h
:
令
n
=
m
h
−
1
m
−
1
n=\\frac m^h-1m-1
n=m−1mh−1可得
h
=
log
m
(
n
(
m
−
1
)
)
h=\\log_m(n(m-1))
h=logm(n(m−1))
先中后序非递归遍历
先序
中序
后序
树、森林、二叉树的转换
规则:左孩子右兄弟
性质:树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. 另一棵树的子树