biganans / c_practice

练习基本的c算法

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

c_practice

练习基本的c算法

主要内部排序方法的性能

方法 平均时间 最坏时间 附加空间 稳定性 算法简单描述
直接插入 O(n^2) O(n^2) O(1) 稳定 从i后依次选择数与i-1倒叙进行对比,如果i位置数大则i位置后移。(往前插入的时候有折半插入方法,实质都一样只是查找插入位置快了一点,但是移动的位置是一样的)
shell(希尔)排序 O(n^1.3) O(1) 不稳定 缩小增量排序过程,先取l=(len+1)/2两两对比:即位置0和位置l对比、1和l+1对比;然后继续取(l+1)/2位置增量进行对比,直到增量为0为止。
直接选择(简单选择) O(n^2) O(n^2) O(1) 不稳定 两层循环,只要后面的数比当前数小就进行位置交换。
堆排序 O(nlog2(n)) O(nlog2(n)) O(1) 不稳定 1:建立堆;2:将堆顶记录和最后一个记录交换位置,则前n-1个记录是无序的,而最后一个记录是有序的;3:堆顶记录被交换后,前n-1个记录不再是堆,需将前n-1个待排序记录重新组织成为一个堆,然后将堆顶数据和倒数第二个记录交换位置,即将整个序列中次小关键字值的记录调整(排除)出无序区;4:重复上述步骤,直到记录排好序为止。
冒泡排序 O(n^2) O(n^2) O(1) 稳定 最多有0...length次对比,每次从1..length-i选出最大的数,如果当前没有比默认第一个位置的数大,则排序完毕。
快速排序 O(nlog2(n)) O(n^2) O(nlog2(n)) 不稳定 先确定参照数,默认选0位置,1:从右选出比参照数小的j位置赋值为参照数,记录数变成j位置的数;2:从左边选出比参照数大的位置k把参照数记录为k位置的数并赋值为参照数;重复1、2步骤,直到左右位置重合,则该位置为最后的参照数位置。对于最后的位置再次分为左右区间,再依次对左右重复上述步骤,直到分界出来的左右相等为止,意思就是左右两边都找不到满足1、2条件的情况,算法结束。
归并排序 O(nlog2(n)) O(nlog2(n)) O(n) 稳定 开始归并的时候,每个记录是长度1的有序子序列,对这些序列进行逐趟归并,每次归并后有序的子序列长度扩大一倍;当子序列的长度大于等于整个序列时,此时整个记录为有序的。即2->4->8->2n子序列归并排序
基数排序 O(d(n+r)) O(d(n+r)) O(n+r) 稳定 依次对每个进位数进行排序:个位->十位->百位->... 最后得到的序列即为有序数组。其中,d 为位数,r 为基数,n 为原数组个数。

字符串匹配

方法 期望时间 最坏时间 算法简单描述
BF(Brute Force,暴力检索) O(m*n) O(m*n) 首先将原字符串和子串左端对齐,逐一比较;如果第一个字符不能匹配,则子串向后移动一位继续比较;如果第一个字符匹配,则继续比较后续字符,直至全部匹配。
RK(Robin-Karp,哈希检索) O(n) O(m*n) RK算法是对BF算法的一个改进:在BF算法中,每一个字符都需要进行比较,并且当我们发现首字符匹配时仍然需要比较剩余的所有字符。而在RK算法中,就尝试只进行一次比较来判定两者是否相等。 RK算法也可以进行多模式匹配,在论文查重等实际应用中一般都是使用此算法。
KMP(Knuth-Morris-Pratt) O(n) O(m+n) KMP算法在开始的时候,也是将原字符串和子串左端对齐,逐一比较,但是当出现不匹配的字符时,KMP算法不是向BF算法那样向后移动一位,而是按照事先计算好的“部分匹配表”中记载的位数来移动,节省了大量时间。
BM(Boyer Moore) O(n) O(m*n) BM算法的执行效率要比KMP算法快3-5倍左右,并且十分容易理解。各种记事本的“查找”功能(CTRL + F)一般都是采用的此算法。
horspool O(n) O(m*n) horspool算法将主串中匹配窗口的最后一个字符跟模式串中的最后一个字符比较。如果相等,继续从后向前对主串和模式串进行比较,直到完全相等或者在某个字符处不匹配为止。如果不匹配,则根据主串匹配窗口中的最后一个字符β在模式串中的下一个出现位置将窗口向右移动。Horspool算法相对于Boyer-Moore算法改进了坏字符规则,Boyer-Moore算法只是将模式串P中从当前未匹配位置向右第一个坏字符与母串的坏字符(未匹配的字符)对齐进行再次匹配,Horspool算法是以当前匹配窗口中母串的最末尾的一个字符和模式串最靠近它的字符对齐。
Sunday O(n) O(m*n) 一种比BM算法还要快,而且更容易理解的算法。
Aho-Corasick (AC自动机算法) O(n) O(n) Aho-Corasick算法和前面的算法一样都要对模式串进行预处理,预处理主要包括字典树Tire的构造,构建状态转移表(goto),失效函数(failure function),输出表(Output)。Aho-Corasick算法包括以下3个步骤:1.构建字典树Tire;2.构建状态转移表,失效函数(failure function),输出表(Output);3.搜索路径(进行匹配)。 敏感词过滤一般可以用这种算法。一个版本的git地址:https://github.com/hankcs/aho-corasick

以上算法需要配合各种图来看才更明白,网上搜索可得。

About

练习基本的c算法

License:BSD 3-Clause "New" or "Revised" License


Languages

Language:C 100.0%