数据结构与算法思考

数据结构和算法的理论来源是优化和组合数学,是代数学。包括分治、贪心、动态规划的思想都是和第一、第二数学归纳法以及(高阶)马尔可夫模型相关的。所以计算问题深入地去理解的话还是免不了需要数学方面的角度,数学方面的背景。但也有一些是计算机方面的思想,比如双指针的解法。还有就是信息的思想,有些如回文串计算等,都是要怎么借助回文等带来的信息。大的方面来说,有那么几种思想(待完善):

1.分治、回溯、分支定界、动规、贪心、近似、启发式搜索...

2.双(多)指针、快慢指针、对撞指针、滑动窗口(分别固定左/右)、等距指针、(两个表之间)跳跃指针、双指针其中一个总是指向最小元素值的链表...

3.数据结构的相关性质,回文、所给的即有序表等自身结构带来信息,如二叉搜索树性质(双亲结点大于左子树小于右子树、卡特兰数、中序遍历有序表)...

4.位运算、掩码、将数字的值与该值序号位置的内存关联(哈希)

5.利用数据结构如哈希,树,图,并查集(union-find set)(秩压缩),线段树,字典树等

 

有些算法是比较独特的,但是可以给其它算法带来很多思考,如KMP、Robin-Karp、manacher算法,对于字符串匹配的相关问题都可以引导到对模式串的自身结构分析上,也需要注意记忆。

*动规、分治类的算法的核心思想是先考虑小问题再考虑大规模,或者考虑大规模怎么变成小规模(递归的思想)。就像数学归纳法一样,先考虑(1) n=1的情况,然后考虑(2)当已知n=k,求n=k+1该如何做;

动规的核心是找最优子问题,然后获得考虑状态转移方程,而且转移方程是分条件的,最终目的是选择决策变量,而目标函数就是最优状态,所以就是选x,state,和state(i,x) = f(state(i-1,x),x ),其中i是阶段变量;

动态规划考虑能否用滚动数组优化空间复杂度。

回溯法的思想在于其backtrack(x+1);

分治法:divide,conquer,merge。(主定理就是适用于分治法计算时间复杂度的定理)

双指针的滑动窗口一般是固定左指针移动右指针满足条件1,再固定右指针移动左指针满足条件2;

不管是分治、动态规划、贪心还是回溯,其一个重要核心问题就是划分子问题

其它:“二维指针”(如从外层到内层遍历矩阵,可以设定单步方向),单调栈(常用于数组中只跟最大最小峰值有关的那种题目),单调队列,辅助栈,三/多指针(如three sum问题,固定center,然后left和right对撞),DFA有限状态机(常适用于判断是否符合语法),使用哑结点(占位符),前缀和(以及类似的异或,找单),摩尔投票法,使用位运算/位掩码,字符以一定形状重排/遍历(模拟移动),双向遍历,Brian Kernighan算法,hash解决无限循环,鸽巢原理/容斥定理,质数相关性质,中国剩余定理,带状态限制的动态规划问题(买股票问题),借助桶思想...

posted @ 2019-11-06 10:42  黎曼猜想  阅读(211)  评论(0)    收藏  举报