好久就想总结下了,一直懒于学习,就拖了下来
以前学习数据结构接触部分算法但是毕竟不是计算机科班,没有系统的学习常用算法。经过系统的学习算法我认为想要理解上手算法需要从几个步骤着手
1 先搞懂所要解决的问题,看似简单,但是很有必要
2 搞懂解决问题的步骤的(本质是搞懂所解决问题的解空间)
3 有个大致的思路,然后对照代码看懂具体细节
4 各个算法比较 对比学习这样印象深刻
5 项目中使用,最终提高能力的方法(遇到问题在学习, 提示本就是个螺旋上升的过程)
其中 第二步骤 很重要 搞懂问题解空间说通俗点就是在解决问题中用了几维空间来解决问题。 比如说常用排序(插入,冒泡,快拍,归并 )他们的逻辑结构都是通过一维空间解决问题是线性的, 但是背包问题(二叉树),最长公共子序列问题就是(数组 --- 貌似动态规划问题很多都可以用数组来取得最终结果集,这点回头还需要总结)搞懂了得出结果的解空间,理解代码这样才能比较顺畅。
void lis(int a[n])
{
int n = L.length;
int[] f = new int[n];//用于存放f(i)值;
f[0]=1;//以第a1为末元素的最长递增子序列长度为1;
for(int i = 1;i<n;i++)//循环n-1次
{
f[i]=1;//f[i]的最小值为1;
for(int j=0;j<i;j++)//循环i 次 这部分和插入排序 "类似" 都是让前i个有结果,都是在一条‘直线上’操作 -------本人理解。。。。。。
{
if(L[j]<L[i]&&f[j]>f[i]-1)
f[i]=f[j]+1;//更新f[i]的值。
}
}
for(int m = 0; m < n; m++ )
{
printf("%d" , f[n]);
}
}
这部分代码是根据java的代码改写了下
下一篇 最长公共子序列