1 Chapter 1
减少io,和函数调用次数
针对io考虑调整输入,输出缓冲大小。
针对调用次数,考虑使用内联或者宏,尽量避免递归
2 chapter 4 查找
字符串A中找子串
bruteforce查找,可以先判断第一字符是否匹配,否则直接跳过该字符。
2.1 Boyer-moore查找,启发式查找。
英文:
http://www.stoimen.com/blog/2012/04/17/computer-algorithms-boyer-moore-string-search-and-matching/
这篇更简洁易懂中文:
http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
中文还可以:
http://www.cnblogs.com/lanxuezaipiao/p/3452579.html
看得比较晕,上面的这个算法描述还算容易理解,基本思想,要想从字符串A中匹配查找字符串patternB.刚开始让A和B左对齐,然后从B的右边开始逐个字符匹配,遇到必要情况下右移B。利用bad-character算法和good-suffix算法决定向右移动的距离。此算法优点:
采用了启发式策略引导,使可以多移动一些距离,减少比较次数。
更巧妙的是,这两个规则的移动位数,只与搜索词有关,与原字符串无关。因此,可以预先计算生成《坏字符规则表》和《好后缀规则表》。使用时,只要查表比较一下就可以了。
所以需要针对捜索词pattern做一些预处理,计算出一些good-suffix和bad-character的移动量。
此算法应用在editor的search,replace功能中,比如GNUgrep采用了此算法。
Patlen: 要查找的pattern的长度
textLen: 源字符串的长度。
BM算法的时间复杂度:
准备时间:O(patlen)
最坏情况:O(textLen)
一般情况:O(textLen/patlen)
而bruteforce算法的时间复杂度:
准备时间:0
一般情况:O(textLen)
最坏情况:O(textLen*patlen)
一般来说,从一个大的text中查找一个较长的pattern,当textcharacter种类比较多时,BM算法较好。BM算法的精髓是尽量跳过较大的偏移。避免不必要的比较。
2.2 字符串匹配的kmp算法
中文资料:
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
这种算法,于BM算法不同,针对要查找的pattern,每次从pattern的左边开始匹配字符。并维护一个表来觉定当遇到不匹配时右移pattern的偏移量。
2.3 多字符串查找
比如要求从文本中查找多个关键字:abc, def 等等。