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
就是乙個理想的選擇。為什麼
沒選其他語言呢,答案很簡單:據說
也用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 和
yx 和y
相結合(concatenation): x+yx 是
y 的字首
(prefix): x.startswith(y)x 是
y 的字尾
(suffix): x.endswith(y)
x 的包含
k個字元的字首:
x[0:k-1]
字串基本處理演算法
最近想寫寫字串處理方面的東西。前面已經寫寫了字串分割函式的實現。下面再將幾種常見的字串處理演算法實現了下。第乙個為統計字串的長度函式,很簡單,定義乙個指標指向字串首位,然後從頭遍歷到字串的尾部,遇到 0 就停止,同時定義乙個變數累加。下面直接貼 int stringlen char str 第二函式...
演算法歸納系列 字串處理演算法
常見思路是在s中遍歷尋找str,演算法複雜度為o len str len s kmp演算法能將複雜度降低到o len s 級別,kmp演算法的思想主要是通過求匹配字串每個位置的最長重複字首,每次匹配失敗之後就直接用next陣列中的最長匹配字首那一部分去匹配,而不用重新匹配。vectorgetnext...
演算法 字串處理
輸入乙個字串,列印出該字串中字元的所有排列。例如,輸入字串abc,則列印出由字元a b c所能排列出來的所有字串abc,acb,bac,bca,cab,cba.我們求整個字串的排列,可以分成兩步,第一步求所有可能出現在第乙個位置的字元,即把第乙個字元與後面所有字元交換。第二步,固定第乙個字元,求後面...