CIC内部的核心软件系统都是搭建在linux上的,为了方便程序间的协同操作,我们还编写了很多shell script,尽管类似grep, sort, cut之类的工具用起来很爽很强大,但是shell 脚本并不适于描述稍微复杂些的逻辑跟算法,譬如我曾经写过这样的代码,猜猜它是做什么的
text=abcde
echo $text|sed -r 's/(.)//1 /g'|cut -d" " -f1,2,3|sed 's/ //g'
其实呢,就是取字符串 'abcde' 的前三位,输出结果是 'abc'
如果程序里充满类似的代码,不难想象其可读性和可维护性都不会好到哪里去,因此我们正在尝试其他的脚本作为补充,Python就是一个理想的选择。为什么 没选其他语言呢,答案很简单:据说Google也用Python... 他们的选择总归不会太糟,我们也就懒得花时间挑了。
用Python来实现上面同样的功能,很简单, text="abcde";text[0:3]
作为我个人学习的一部分,我打算用Python实现《算法导论II》 中的一些经典算法,并且记录下来,和大家分享
我首先选择了第32章,即字符串匹配作为这系列文章的开始,毕竟我们内部的程序涉及大量的文本分析操作,用Python 来重新实现其中一些,也是温故知新,会更有效果。
在实现的过程中我发现,Python 语法和书中伪码很相像,加上命令的执行可以立竿见影,实在是非常适合用于教学的语言。只是需要注意的是书中伪码的字符串起始下标为1,结束下标是闭区间, 而Python中字符串起始下标为0(当作一个list进行slice), 操作时的结束下标为开区间。因此书中伪码翻译为Python时所有字符串起始下标都需要减1,而结束下标不变。
先用Python的语法简单描述一下何谓字符串匹配算法,一些对变量的大小约束这里不再赘述。
假设有长度为 m 的模式字符串 P, 长度为 n 的文本 T,如果 P 出现在 T 的偏移 s 处,则有 P[0:m] = T[s-1: s+m]
说到这里,我们可以先在Python的交互环境中实验一下:
输入
p="cde"
t="abcde"
p[0:3] == t[2:5] == "cde"
输出
True
从而证明 p 出现在 t 的偏移 2处
那么什么是字符串匹配算法呢,这类算法就是要在文本 T 中找到所有出现模式字符串 P 的偏移位置。
接下来同样用Python的语法来描述一些术语
有两个字符串变量 x 和 y
x 和 y 相结合(concatenation): x+y
x 是 y 的前缀(prefix): x.startswith(y)
x 是 y 的后缀(suffix): x.endswith(y)
x 的包含k个字符的前缀: x[0:k-1]
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。