我先抛砖引玉写几个topic,而后我会指定大家中的一些领域专家分享本身的知识,固然也欢迎大家毛遂自荐。html
这是我之前爱用的面试题,即便不考虑科学计数法和其它进制,短期写出正确程序仍然不易(须要考虑溢出)面试
设计安全机制,在服务正经常使用户的同时,拒绝非法访问算法
a) 每一个数出现的几率均等数组
b) 它们在1到n之间安全
c) 它们各不相同服务器
d) 效率较高ide
这5道题若是你能不借助任何外力,作出4道,请来找我。加密
进入正题:url
字符串处理在工做中常常遇到,最有名的算法就是kmp。可是,它有几个缺点:spa
1. 只能单字符串;
2. 须要预处理;
3. 其实,它的速度不是最快的……出名只是由于在教材中;
4. 不能处理最长公共子串等其它非匹配问题。
事实上,字符串处理博大精深:
在长度为n的匹配串中查找长度为m的模式串是否出现,以及出现的位置
a) Brute Force
从左到右一个字符一个字符比较
时间复杂度O(n*m)
b) KMP
最有名的算法,教科书中,做者之一(K)是图灵奖得主
核心思想是,充分利用m的特性,匹配失败时,尽量多地移动模式串,以减小比较次数
时间复杂度O(n)
http://jpkc.nwu.edu.cn/datastr/study_online/newsite/pluspage/kmp.htm
c) Horspool
从右到左比较
当匹配失败时,模式串从不匹配字符处向左寻找匹配串中不匹配的字符,若找到取最靠右的那个,移动模式串对齐;若找不到,移动模式串到不匹配字符处右方
时间复杂度平均O(n),最坏O(n*m)
http://www.cnblogs.com/dsky/archive/2012/04/24/2467655.html
d) BM
这个算法的实际效果比KMP快数倍;是逻辑上最复杂的算法
至关于KMP和Horspool的结合
时间复杂度O(n)
http://blog.csdn.net/iJuliet/article/details/4200771
e) Sunday
这是我我的最喜欢的算法,比BM快,同时很简洁
其它和Horspool相似,只是比较的不是不匹配的字符,而是匹配串中下一位字符
http://baike.baidu.com/view/6325831.htm?fr=aladdin
f) Rabin-Karp
以串而不是字符为单位,串映射为值;值同样再继续比较
http://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm
在不少匹配串(字典)中查找长度为m的模式串
a) Trie
我我的比较喜欢的一种算法,普遍应用于tips(搜索提示)、禁词过滤等
http://zh.wikipedia.org/zh/Trie
b) Aho–Corasick
有限状态自动机+KMP
http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm
后缀数组是字符处理的利器,普遍应用于求最长前缀、最长公共子串、最长递增子串、最长回文子串和最长重复子串等。
若是参加ACM,此技能必须掌握。