程序员实用算法阅读总结

本文详细介绍了各种常用的查找和排序算法,包括Boyer-Moore、KMP、多字符串查找、模糊字符串查找、Soundex算法,以及Bubble Sort、Insert Sort、Shell Sort、Quick Sort、Heap Sort等多种排序算法的原理和性能分析。对于数据结构部分,讲解了Red-Black Tree、Splay Tree和B-Tree的特点和应用场景。同时,还探讨了数据压缩技术如Run Length Encoding、Huffman Encoding和LZW压缩。通过对这些基础算法的理解和掌握,可以提升程序员的实际工作能力。
摘要由CSDN通过智能技术生成

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.刚开始让AB左对齐,然后从B的右边开始逐个字符匹配,遇到必要情况下右移B。利用bad-character算法和good-suffix算法决定向右移动的距离。此算法优点:

采用了启发式策略引导,使可以多移动一些距离,减少比较次数。

更巧妙的是,这两个规则的移动位数,只与搜索词有关,与原字符串无关。因此,可以预先计算生成《坏字符规则表》和《好后缀规则表》。使用时,只要查表比较一下就可以了。

所以需要针对捜索词pattern做一些预处理,计算出一些good-suffixbad-character的移动量。



此算法应用在editorsearch,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 等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值