自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

转载 只为测试使用

江湖救急 192.168.0.1转载于:https://www.cnblogs.com/huangfeidian/p/5151841.html

2016-01-22 17:08:00 84

转载 跳舞链解数独 静态数组优化

前几天有人问我之前写的那个跳舞链解数独的程序的内存泄漏问题如何解决,因此回顾了一下我的那个程序。现在看来那个程序简直不忍直视,于是大刀阔斧的改了。主要是把动态内存分配都改为了静态预分配,这样就可以避免频繁的调用malloc和free。同时静态分配的好处就是内存访问局部性比较好,cache不容易miss。而且在一行四个节点连续分配的情况下,就没有必要存储左右指针了。而且在连续分配的时候,指...

2014-08-24 13:59:00 177

转载 关于编程之美2014格格取数

个人感觉是ac了,只不过没有注册编程之美的号,所以没有办法测试,反正对于自己手写的几个例子都正确。这里偷了一下懒,就是把行数限制为64个以内,这样好做位操作。当然可以用两个长整型来表示,这样就可能比较麻烦了。有意愿的人自己去完善吧。核心思想是预处理加减枝加深搜,复杂度最坏指数级没办法。下面贴一下题目。描述给你一个m x n (1 <= m, n <= 100)的矩阵A...

2014-04-14 09:53:00 109

转载 Vc++内存布局

Vc++内存布局测试平台Windows server 2012 R2 and visual studio 2013 professional。本篇文章意在介绍vc++中类的内存布局方式,只是研究其大概的排列方式,对于内存对齐方面则没有进行深入探讨。如有需要研究类的具体大小可以参考其他博客。测试方式在vs中,查看类的内存布局主要有两种方式。一种是实例化一个类,然后在de...

2014-02-13 14:57:00 114

转载 最长上升子序列的最优算法

最长上升子序列的最优算法 1 问题背景 最长上升子序列问题(Longest Increasing Subsequence)在算法教学中的经典问题,在学习动态规划(Dynamic Programming)相关内容时经常出现。在动态规划这一章节中出现的频率只比最长公共子序列(Longest Common Sequence)小。最长上升子序列问题的动态规划解法的时间复杂度为n2,而我们...

2013-12-21 18:39:00 629

转载 通过位操作来实现组合算法

这篇文章简直就是位操作的练习,各种位操作都使用到了。主要思想是将n选m表示为一个长度为n的二进制串,1为选中,0为不选中。每次的结果都根据上一次生成的结果在常数时间生成的,即从右向左查找第一个01,将其变为10,并把这个位置往右的的1都推向最右边。初始的字符串1都在最右边,最后终止的时候1都在左边。代码如下,比较难懂。 1 #include <stdio.h>...

2013-12-05 12:14:00 72

转载 高效生成集合的固定子集划分

本文章讨论的是将一个包含n个不同元素的集合分割为所有的s个不为空的集合,且每次生成的s个集合不需要考虑顺序关系。相关的背景内容在我的倒数第四篇博客中已经说了,这篇文章主要是贴代码。 1 #include <stdio.h> 2 #include <malloc.h> 3 #define SET 6 4 #define PART 3 ...

2013-12-01 00:07:00 107

转载 高效生成所有的组合

这篇文章翻译自coolest way to generate combination,但不是全译,如有错误欢迎指出。文章中把他们这个快速生成所有的组合的方法称为 cool-lex方法,特点是最后可以优化成没有循环和分支判断语句的执行代码。下面,我们先来介绍一些定义。什么是前缀,什么是后缀我就不罗嗦了。定义\(S =s_1 ,s_2,s_3,\cdots s_m\)是一个字符串序列...

2013-11-29 18:56:00 135

转载 高效生成所有的排列

这方面的一般算法是递归,可是递归的效率略坑。另外一个经典的算法是next permutation,即从右边开始找到第一个非增序(从右到左)的最短序列,然后将这个序列最左端的数调换为递增序中第一个比他大的数,然后将右端排序为降序(从右到左),这样就得到了比当前排列刚刚好大一点的新的排列。如此往复就可以生成所有的排列,初始的是1234...n,最后是n....4321。每次生成的过程中都需...

2013-11-28 22:26:00 87

转载 常数时间生成集合划分

常数时间生成集合划分本文章是Shin-ichiro KAWANO and Shin-ichi NAKANO的论文 constant time generation of set partition的部分翻译,限于译者的水平,不保证准确,本文最后的插图也是来自此论文。绪论在实践中常常需要生成一个包含N个元素的K子集划分。其中每个子集都是非空子集,而且全集中每个元素都是相互可区分...

2013-11-10 23:41:00 96

转载 跳舞链解数独

---恢复内容开始---#include <stdio.h>#include <malloc.h>#include <time.h>typedef struct DLX_node//节点定义{ struct DLX_node* up; struct DLX_node* down; struc...

2013-10-19 23:48:00 143

转载 minic 类型声明与变量定义句型处理

1 #include "token_define.h" 2 //这个文件是用来处理句型的,对于算术表达式都是放在前面的那个头文件中来处理 3 typedef struct _handle_tree_node//句型语法树的节点 4 { 5 union 6 { 7 int handle_type;//...

2013-07-24 17:56:00 283

转载 minic 动作句型处理

1 #include "lex_define.h" 2 enum keywords_type//代表一些关键字 3 { 4 loop_for=3,//代表for关键字 5 loop_while,//代表while关键字 6 branch_if,//代表if关键字 7 branch_else,//代表...

2013-07-24 17:55:00 398

转载 minic 符号表

1 #include <stdio.h> 2 #include <string.h> 3 #include <malloc.h> 4 typedef struct _array_description 5 { 6 int array_size;//代表当前层的最高索引,即上界 7 struct...

2013-07-24 17:53:00 369

转载 minic 词法单元建立

1 #include <stdio.h> 2 #include "symbol_table_def.h" 3 //前面的那个词法和文法说明只是大概的说明,现在又有了改动,把指针运算符改为了@,把取地址运算符改为了$ 4 //但是类型声明的时候的指针类型仍然是* 5 //现在所有的符号都用了,除了让人恶心的逗号和问号 6 //现在开始定义词...

2013-07-24 17:52:00 1239

转载 文法设计,对于void的修改

1 //这个文件主要是用来描述当前源语言的词法结构和语法结构 2 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉 3 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此做不来 4 //如果有想做预处理的同志,可以自行修改代码。 5 //本代码完全木有任何版权,因此各位读者在使用过程中由于程序bug而造成的挂科、失...

2013-07-24 17:50:00 101

转载 文法设计,有一些大的修改

上次忘了写函数的实现,只写了函数的声明。此外修改了基本语句的文法,把判断语句删除了。嗯,就是这样。 1 //这个文件主要是用来描述当前源语言的词法结构和语法结构 2 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉 3 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此做不来 4 //如果有想做预处理的同志,可以自行修...

2013-07-18 18:50:00 115

转载 文法设计,删除自增自减运算。

这两运算就是一祸害,删了多好。反正编译器在优化的时候会自己生成自增自减运算指令,不劳咱们操心。转载于:https://www.cnblogs.com/huangfeidian/p/3185708.html...

2013-07-12 10:15:00 92

转载 文法设计,加上了函数

1 //这个文件主要是用来描述当前源语言的词法结构和语法结构 2 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉 3 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此做不来 4 //如果有想做预处理的同志,可以自行修改代码。 5 //本代码完全木有任何版权,因此各位读者在使用过程中由于程序bug而造成的挂科、失...

2013-07-10 13:40:00 116

转载 我的mini_c语言文法设计

1 //这个文件主要是用来描述当前源语言的词法结构和语法结构 2 //当前语言是c语言的一个子集,因此里面所有的描述大家都很熟悉 3 //注意,当前语言并不支持预处理,因为c预处理比较复杂,而且楼主能力低下,因此做不来 4 //如果有想做预处理的同志,可以自行修改代码。 5 //本代码完全木有任何版权,因此各位读者在使用过程中由于程序bug而造成的挂科、失...

2013-07-07 21:02:00 754

转载 这一篇是对上一篇的修改及注释

1 void first_set_preprocess(void)//这个函数是用来消除强联通图,把强联通图直接短接,最后生成一个压缩图 2 { 3 first_graph_node** rev_first_graph;//这个当作逆转图的入口,因为我们要生成这个逆转图 4 first_graph_node** new_first_graph;/...

2013-07-06 20:49:00 58

转载 生成前缀集合和后缀集合时,对环状依赖的处理

由于在生成前后缀的时候,我们需要将这个文法符号按照拓扑排序来排列生成顺序,不过当语法里面有环的时候,一般的拓扑排序就无效了,这个时候需要采取将一个强联通区域的点汇聚在一起,也就是生成压缩图。课本上虽说强连通算法是线性时间,但是不写不知道,一写吓一跳,尼玛都快四次复杂度了有木有。这里就贴一下生成强连通的代码 1 void first_set_preprocess(void)/...

2013-07-06 19:42:00 87

转载 first集合及follow集合

前面那片文章生成的语法分析表并不是最优的,因为有些项在遇到错误输入的时候,并不是采取报错,而是执行规约,直到不能再规约的时候才报错。这是不科学的,我们需要在得到错误输入的时候立马报错,为了实现这个功能,我们需要知道某个文法符号的后面可能接的终结文法符号的集合,只有当前的输入终结文法符号处在栈顶文法符号的后缀集合中时,我们才去采取接受规约移进这三个操作,否则报错。为了得到后缀集合,我们...

2013-07-05 19:58:00 126

转载 SLR,语法分析表的构建

太累了,感觉不会再爱了。执行了跟编译原理上的一模一样的例子,输出了正确结果 1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string.h> 4 //这个头文件是为了将语法声明的产生式按照调用顺序来构建调用图,并顺便构建反向调用图。 5 //从而来构建拓扑...

2013-07-04 19:44:00 521

转载 dfa最小化,上一个版本采用的是moore的打表法,这个版本采用的是hopcroft的方法,但是实现中采用链表而不是栈来优化。...

hopcroft法的复杂度,他们说是nlogn,可是都没有严格的证明。难得找到一篇讲的详细点的论文,却又啰里啰唆的,不过那篇论文里面采用的是颜色树这个结构,有点意思。前面的那个算法是n的平方复杂度,虽然这个复杂度计算都是建立在一些操作为单位时间操作的基础上。可是这些被认为的单位时间操作在我的实现中却有着平方复杂度,情何以堪,万恶的理论计算机科学家。hopcroft实现的代码,太长...

2013-06-28 21:43:00 128

转载 dfa最小化,修正了上个版本的一些错误。

上个版本测试的时候,只用了两个非常简单的测试用例,所以好多情况有问题却没有测试出来bug1:在生成diff_matrix的时候,循环变量少循环了一次,导致最后一个节点在如果无法与其他点合并的情况下,程序不会给他生成一个群标号。修改:把循环变量那里加上等于号bug2:在遍历群的时候,程序是以碰到空指针为结束的,但是在malloc内存的时候,系统并不为这个内存初始化为0,而是0x...

2013-06-28 09:58:00 145

转载 dfa最小化,终于完成了。

采取的方法是hopcroft的填表法,详情见如下代码 1 #include "nfa_to_dfa.h" 2 int* dfa_diff_matrix; 3 4 int mini_dfa_number;//这个是最小化的 dfa表的索引 5 typedef struct _min_dfa_node 6 { 7 pdfa_edge b...

2013-06-27 15:13:00 517

转载 nfa转dfa,正式完成

为了加速转换的处理,我压缩了符号表。具体算法参考任何一本与编译或者自动机相关的书籍。这里的核心问题是处理传递性闭包,transitive closure,这个我目前采取的是最简单的warshall算法,虽然是4次的复杂度,但是由于我构建nfa的时候并没有采取标准的方法,使得nfa的节点减少很多。ps,上上篇所说的re转nfa,我这里有一个修改,就是对于or转换,不再增加节点,而是只增...

2013-06-26 16:50:00 158

转载 正则转nfa:完成

太累了,感觉不会再爱了。问题已经解决,具体的懒得说了。 1 #include "regular_preprocess.h" 2 //这个版本终于要上nfa了,好兴奋啊 3 //由于连个节点之间可能有多条边,所以只能用邻接表来存储了 4 //注意这里是有向图 5 //对于每一个token,这里都会生成一个或多个图节点 6 //但是每个token会附带...

2013-06-25 12:55:00 100

转载 正则转nfa:bug消除

正则到nfabug的解决方法前面提到了这个bug,为了解决这个bug,我们必须在每次引用到一个假名的时候,都构建一个拷贝。现在假设我们遇到了一个假名,并得到了他的开始节点和结束节点,当前的难题就是构造这个假名所代表的nfa的副本。构造方法类似于子集构造法,我们设立一个集合,这个集合为R,集合中的每个元素都有一个标志位为访问位。初始化R为开始节点a,并让他的访问位为0。现在开始进入迭代...

2013-06-24 19:36:00 88

转载 正则转nfa:bug出现。

本人写的一个正则到nfa的bug刚写完前面的那篇,自己用脑子过了一下,发现了一个bug。具体情况如下。这个bug的产生条件是多次调用假名的时候,每次调用都会修改假名的nfa图。直接这么说不好理解,我就拿例子来讲吧。假设我们已经定义了一个假名num,而现在我们有一个正则表达式调用了两次这个假名,nums:[num][num],根据前面那篇文章里面所谈到的方法,会生成如下所示的nfa...

2013-06-24 16:16:00 73

转载 最初步的正则表达式引擎:nfa的转换规则。

[在此处输入文章标题]正则到nfa前言在写代码的过程中,本来还想根据龙书上的说明来实现re到nfa的转换。可是写代码的时候发现,根据课本来会生成很多的无用过渡节点和空转换边,需要许多的代码。为了简化代码,我实现了我自己的re到nfa的规则。注意我的这套re规则只包括如下几种类型:闭包,即*运算符一个或多个,即+运算符存在或不存在,即?运...

2013-06-24 15:10:00 229

转载 最初步的正则表达式引擎:生成nfa

这个版本修改了前面版本的两个个bug。第一个:识别到字符集的时候,只是将name_number加1,却并不对reg_pattern_table[name_number]进行初始化。第二个:识别到假名的时候,并不为他分配一个name_number,而只是在hash表中为其分配一个表项。现在,当识别到这两个的时候,都会为之分配一个name_number,并在reg_pattern...

2013-06-24 13:23:00 215

转载 最初步的正则表达式引擎:增加了字符集表示和?运算符和+运算符

关于正则的语法方面,就做到这吧。下一步是生成nfa,进而dfa,以及dfa的最简化。等下一个版本出来的话,估计要好久了。 1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string.h> 4 //这个版本在上一个版本的基础上,添加了?\+这两个操作符,这两个操作...

2013-06-23 15:33:00 98

转载 最初步的正则表达式引擎:在上个版本的基础上增加了转义字符

默认为转义字符的优先级最高,而且转义字符的作用是让输入处理函数把转义字符的下一个字符当作字符值看待,而不是可能的操作符。当前版本并不支持c语言中那些特殊含义的转义字符,例如\t。这个特性将会在之后的版本中加上。而对于c语言中的三元组转义字符,我将不会考虑他的存在,没啥意义。下面是代码,欢迎测试。 1 #include <stdio.h> 2 #in...

2013-06-23 13:07:00 76

转载 最初步的正则表达式引擎:支持子表达式替换

子表达式的语法为name:regex在处理时,会把name加入进符号表中,方法是hash,最简单的加法而在regex中如果碰到[name]这种模式,则尝试去找符号表,如果找不到则报错。代码如下,欢迎大家测试。#include <stdio.h>#include <malloc.h>#include <string.h>...

2013-06-22 20:16:00 91

转载 最初步的正则表达式引擎:将显示的连接符改为了非显示的连接符

由于当前的连接符变为非显示,所以在有些时候需要考虑当前输入指针所指的位置是否缺少连接符,如果缺少,则将连接符入栈。 1 #include <stdio.h> 2 #include <malloc.h> 3 #include <string.h> 4 //这里默认是没有显示的连接运算符,运算符的优先级为括号、闭包*、连接.、并...

2013-06-22 12:52:00 70

转载 最初步的正则表达式引擎

这里只是当作自己的代码版本管理器使用,并不去详细介绍代码,毕竟我的注释里面已经说明了很多。欢迎大家测试,如果发现出错了,望在下面回复,多谢。注意,当前的假定是输入自己不能有错误,而且*、(、)、.、|这几个操作符是保留字,其他的字符则当作其自身意思。当前不考虑转义字符及三元组,以及不考虑子表达式命名,因此只能处理一个长正则表达式。 1 #include <stdi...

2013-06-22 12:49:00 78

转载 关于windows虚拟内存管理的页目录自映射

Windows页目录自映射Windows的内存访问是采用虚拟内存形式,即对于任何一个Adr,首先根据CR3寄存器的值来得到页目录表的地址,此时页目录表是一个刚好大小为4k的页。页目录表中,每一项大小为4B,内容包括对应页表的物理地址和一些标志位。由于页表也是一个大小为4K的页,所以地址是按4K对齐的,因此这里的地址只需要20位就可以了,剩下的12位作为标志位。Adr所在页表的地址由页...

2013-05-28 12:54:00 272

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除