从本周开始(3.14)开始进行算法训练,结合学习进行。
--------------------------------------------------------------------------------------------------------
3.14 -- 3.15
完成算法 EditDistance (算法导论P218)
涉及: 动态规划,算是对动归有了良好的理解:
1. 两个特征:最优子结构 和 重叠子问题
2. 用通俗的话讲,就是能够将问题转化为n*m的矩阵, 然后对矩阵的每一个元素求值,通常M[n][m]即为所求解,而通常时间复杂度为O(mn)
遇到的两个问题:
1. 对KILL operation 的处理,只需要将其放在操作序列的最后即可。
2. 对DELETE的处理, 不需要条件 if (src[i-1] == tgt[j] ) ,只需要j和i-1满足要求范围即可,原因是Delete操作,即可将问题转化到[i-1][j]的
状态,而不需要理会后续的匹配的问题。E[i-1][j]已经表明该状态能够满足 src[1..i-1]到tgt[1..j]的转换了,所以src[1..i]到tgt[1..j]的转换也
被满足了。
-------------------------------------------------------------------------------------------------------
3.16
今晚完成的是PrintEditProcess
1. 没想到会遇到这么多困难,居然花了一个晚上的时间来写!
反思: 先想好算法,再动手编码是最好的 最快 最高效的方法, 千万不要一上来就编码 ,这样反而会因为紧张而陷入 迷乱当中!
2. 遇到的一些问题: 在String中加入了重载的全局函数operator << (std::ostream &o, BasicString<char> &s)
(1) 首先应该要注意 friend 声明应该放在private 或 public中,
(2)友元函数的声明一定要完成一致,不匹配就会出现 m_iLength是私有成员 无法访问的情况。
3. 程序中的算法相关的问题:
主要是PrintOperation中出现的: 如何打印出
Original String: algorithm
Opeartion-<Copy>: a*lgorithm
Opeartion-<INSERT>: an*lgorithm
Opeartion-<INSERT>: ana*lgorithm
Opeartion-<Copy>: anal*gorithm
Opeartion-<DELETE>: anal*orithm
Opeartion-<Replace>: analy*rithm
Opeartion-<Replace>: analys*ithm
Opeartion-<Copy>: analysi*thm
Opeartion-<DELETE>: analysi*hm
Opeartion-<Replace>: analysis*m
Opeartion-<DELETE>: analysis*
这样的过程呢?
其实算法很简单:就是对当前choice[i][j]
for l=0 to j-1 print target[l]
print *
for l=i to src.length()-1 print source[l]
为什么? 因为i,j表示当前进行到的源串和目标串的下标
花了两个小时都没弄好,原来是因为这个原因!!!
----------------------------------------------------------------------------
3.25
今晚开始完成编程之美的题目,今晚完成第一题:1的数目,其实这题就是找规律比较简单~而且调试也太好调了。