摘要:
最近在学习编译原理,发现以前在数据结构中学习到的KMP算法在词法分析中使用到,词法分析中要识别词法单元,构建符号表,并将识别的词法单元返回给语法分析器来处理。在这个过程中有一个状态转化的过程,如下:如要识别ababaa,状态转换图如下所示:KMP提出了一种在文本串中搜索单个关键字b1b2....bn的算法,为了快速处理文本串并在这些串中搜索一个关键字,针对关键字b1b2....bn以及该关键字中的位置s(s表示关键字b1b2....bn中的状态转换图中的状态)定义了一个失效函数f(s),f(s)的含义如下:f(s)表示匹配到状态s,但是匹配不到状态s+1,下一次从状态f(s)开始匹配。比如文本 阅读全文
摘要:
求一个数组中第k大的数,我第一印象是冒泡,因为只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,时间复杂度为O(kn),n为数组长度。但是我们都知道快速排序是对冒泡的改进,降低冒泡的递归深度,使时间复杂度降低到O(nlgn),为什么不用快排呢?那么快排的时间复杂度又是多少呢?因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归, 阅读全文
摘要:
对于冒泡排序,大家肯定都熟知,每一轮的冒泡都将最大的数排到最前面,每一轮的时间复杂度是O(n),如果要排序的数组大小为n,要经过n轮才能将数组中所有元素排序,所以总共的时间复杂度为O(n2)。关于冒泡排序的源码如下:迭代型冒泡排序#include <stdio.h>#define length(array) sizeof(array)/sizeof(array[0])#define true 1#define false 0void BubbleSort(int *a, int len) //待排数组a以及它的长度len{ int ordered = false; int temp 阅读全文