这是有关学习Java的数据结构和一些算法的总结
总结:如何学习数据结构:
(1)数据结构 = 结构定义 + 结构操作
(2)数据结构就是定义一种性质,并且维护这种性质,在某些场景下,只需要知道这种性质就可以使用它,而不必了解其内在如何实现
数据结构&算法的设计思维
(1)结构归纳法(数学归纳法)
(1)先证明P(1)是正确的
(2)假设P(k)是正确的再去证明P(k+1)是正确的
(3)联合(1)(2),证明由P(1) -> P(n)是正确的
程序代码:求前n项自然数的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
其中sum = 0就是P(1),即前 1 项的和是0,肯定是正确的
sum代表了前 k 项的和,假设P(k)即前k项的和是正确的,又因为i = k + 1,前 k 项的和再加上k + 1就代表了前k + 1项的和,即前 i 项的和,这是P(2)是正确的
联合前两步,因为P(1)是正确,又因为前一项正确,后一项也正确,所以P(n)即前 n 项的和是正确的,证明完毕
总结:复杂的算法设计按照结构归纳法的思想设计,可以很大概率上避免算法的逻辑错误
1.递归算法
思维:
1.重点:给递归函数一个明确的语义(不需要考虑如何实现的,给出明确的解释)
2.实现边界条件时的程序逻辑(相当于归纳法中的P(1))
3.假设递归函数调用返回结果是正确的,实现本层函数逻辑(相当于归纳法中的P(2))
例如:求阶乘
int f(int n){
if (n == 1) return 1; // 相当于P(1)
return f(n - 1) * n; // 相当于P(2)
}
2.迭代算法
但是递归设计再数字较大的时候可能会导致栈溢出,并且每次递归会创建新的栈,导致栈的神的增加,耗费计算时间
迭代算法:
int f(n){
int result = 1;
for(int i = 1; i <= n; ++i) {
result *= i;
}
return result
}
相较于递归,迭代每次都会更新n的结果,不会拓宽栈的深度,也不会有溢出发生