数学与编程的基本实践

2012-03-06 6:38  -  PHP-B  -  130 个人浏览   

不久前利用贝叶斯公式和全概率公式(参考网上的资料)开发一套垃圾过滤的系统,根据开发的实践和结论得到的一些经验如下: 1、数学与实际编程应用是有差距性的,当然这点在很多数学课程上已经做了说明,比如数值计算教会我们减小计算机的误差,这次根据全概率来计算联合概率,就因为连乘导致精度丢失问题,而结果是悲惨的,往往得到的结果与事实相反,而之所以这样就是因为计算机所能容纳的数据有限度,而导致溢出的,当然在PHP编程中,已经有现成的函数可以解决这个问题那就是bcmath。 2、涉及到分词的问题,其实分词本身对于中文来说就是一大难题,现在很多流行的机械分词,词典分词等基本能够做到正确的分词,但是对于本系统的应用却有不足,主要是因为垃圾的内容不确定性很大,尤其是总会有错词,同义词,同音词这些出现,而这些本身就是分词的难度所在,分词的不正确性导致计算的结果偏差很大,而目前唯一能做的就是人工修正词库(利用词典分词的组件)。 3、去除干扰因素,对于中文来说,垃圾大多数是混合内容,什么乱七八糟的都混合在一起,如何过滤干扰因素需要一个标准,一个可行的方法就是只留下中文内容,以便于分析。 4、公式的参数影响,对于贝叶斯公式,实际上先验概率以及计算的已知概率影响很大,当然本人数学实在不行,也只能参照公式进行开发了,其实后来发现公式其实体现的就是现实意义。 目前来说,此套系统效果还行,能够过滤大部分的垃圾,当然不是真正的智能化,还是需要比较多的人为干预,而且不能完全寄希望于机器处理。

已有 0 条评论 »

C里面的枚举类型

2011-11-09 4:24  -  Linux C  -  379 个人浏览   

看了本书,里面说匿名的枚举类型的最大限制是如果你不在声明的同时定义变量,那么以后的代码就无法定义一个变量了,然后就没具体说明了。 这段话给了一个很大的误导,总让人觉得没法定义变量是不是指就无法使用这个枚举类型了? 其实常见的做法当然是typedef 可以定义个类型,那么其实后面可以继续使用这个声明新的变量: typedef enum(struct) { } TEST; 即使不这么做,而直接写: enum { YES = 1<<1, NO = 1<<2 }; 也可以使用YES和NO这两个值。 其实尽管不能定义变量,但是可以使用枚举值,只要类型一致(整型?)就可以了。

已有 0 条评论 »

ci框架的若干感受

2011-11-09 4:06  -  PHP-B  -  656 个人浏览   

看了几遍ci框架,谈谈自己的一些感受。 首先是设计方式上和很多框架其实大同小异,有几个地方是值得学习的,因为目前考虑自己设计自用小框架都是为了方便,所以不会太考虑性能问题,所以在一些方面就不会去追究细节问题了,所以ci目前发现的个人觉得的好处: 1、全局载入问题,尤其是一些常用的库,比如mysql库有没有必要全局载入,其实现在做很多应用会发现都没有必要用mysql数据库的相关api了,所以全局载入都没有什么必要,需要的时候再加载。 2、每一个运行的细节的单元处理,ci框架都有性能调试开关,这也就可以跟踪耗时的程序问题了。 3、简单的载入机制和静态缓存,其实ci从一个OOP程序员的角度看来可能还是过程话的内容比较多,但是不管怎么样还是有很多类和实例化出来的对象,很好的全局缓存是有必要的。 4、提倡原生模板语法,其实这个涉及到用不用模板引擎的争论,在我看来模板引擎如果失去易用的意义就真没什么意义了,毕竟所谓的模板引擎也是需要一个解析的过程,这个过程需要耗时,而且解析的php代码优劣在于模板引擎的开发作者的水平。 5、ci的hook技术比zf简单多了,原因其实在于zf本身设计的逻辑比较复杂,尽管hook的技术方式都差不多,但是嵌入到复杂的逻辑中就有点不清楚了。 6、开发规范的一致以及专人的维护,这个可能是很重要的方面,团队开发只需要考虑自己的实际产品,不需要自己摆弄框架了,顺带着把开发规范也做了。 ci个人觉得比较蛋疼的地方: 1、就下载的官方demo来说,这个设计的结构层次其实可以再改进,根据从各个前辈那里学来的经验,包括zf设计的层次,完全可以把运行的核心代码放置到web访问以外的地方,而不需要每次都在文件头判断是不是从单入口进来的(单入口设计方式的特征),同时增加了安全性以及某些情况下的便捷性。 2、某些地方可能没有遵从OOP的开发原则,比如一个类的属性最好都是私有的,通过公有的统一方法来访问这些私有变量(这里也是为了安全性,但是在php中体现的不是那么准确),另外OO和过程话的函数混合比较严重,如果觉得OO的设计思想这些很重要,比如设计模式,可维护性,可扩展性,那么相对来说zf更加的合适去研究。 3、就真正的代码规范性来说,个人觉得zf更胜一筹,可能是出自官方,所以里面的代码更加精致和流畅些。 已上仅为个人观点。

已有 2 条评论 »

malloc的变量不free的影响有多大?

2011-09-09 4:46  -  Linux C  -  503 个人浏览   

做了一个导出数据的小程序,数据大概是400W条,循环导入到数据库,结果最后被kill掉了,其原因就因为一个重复分配的内存没有释放掉。 由此可以看出对于大数据的导出操作,其实就是一个无限循环,相当于一直在分配内存,即使是一个不起眼的字符指针。 如何保证: 1、检查所有的内存分配,及时释放,最好的做法就是像nginx一样预先分配内容,然后由程序的自身来管理分配的内容,这样即使最后没有释放,也可以实现自动释放。 2、使用栈内的自动变量,这样在一个域结束之后都会自动回收

已有 0 条评论 »

char string

2011-08-24 12:49  -  Linux C  -  584 个人浏览   

字符串不是C的基础类型,基础类型只有整型,浮点型和指针,那么为什么没有字符型,因为字符型实际就是整型互相转义得到的。 实际上C中有字符串常量这个概念,定义一个字符串“abcde“就是一个字符串常量,但是某个情况下却表示一个字符数组,具体看初始化的场景。 比如 char a[] =”xxx”; 初始化,a是字符数组,本身是一个地址,但是又不能完全当作指针来用,因为它确实不完全等于指针,它的类型是一个长度为4的字符数组,包括最后的\0字符,用以表示字符数组的结束,可以理解a为一个分配的内存块,而且本身是常量,你可以使用一个指针指向这个内存块的开始位置,因为内存地址对其,所以可以用指针或者数组名顺序访问它的单元,而a++这种想要改变常量的表达式就是错误的了。 对于一个这样的字符数组,初始化也十分重要,在一个函数域中,你不将其初始化,会导致默认的单元是随机的。 像字符数组初始化也有很多情况: 1、能不能先定义char a[];然后赋值,不管是a=”xxx”;还是a={‘x’,’x’,’x’,‘\0′}都是错误的,初始化只能发生在定义的时候。 2、能不能先定义char a[4],然后赋值,对于a=”xxx”和a={‘x’,’x’,’x’,’\0′}也是错误的,只能发生在定义的时候,但是和上面相比,这个字符数组定义了实际的大小,从而可以通过数组名来填充数据初始化。 而对于char a[] = {‘x’,’x’,’x’};与char a[] = “xxx”的区别在于最后的’\0′字符存不存在问题了。 对于 char *a = “xxx”;这种,开始一直以为存在在堆里面,查阅资料发现存在数据段中,也就是静态存储区,而这和堆的最大区别是一旦这个做,表明这个字符串是常量的,也就是你无法通过指针偏移来改变内容,而对于char *a =(char *)malloc(sizeof(char)*4);则是可以的,分配在堆中,如果在一个栈中(函数域),想通过指针访问一个变量,就应该要么字符串常量(全局存在的和全局变量,静态变量一样了),要么就malloc吧,但是要记得用完free掉。 最后这个 char *a = {‘x’,’x’,’x’}; 会告诉你类型不匹配,一个指针型,却使用字符数组型初始化。 其他: 字符串在网络编程中很多使用,常用的函数一般为str开始的比如strlen,strcpy,strcasecmp,strcmp这些,其特点就是不会计算或者以’\0′为准,比如strlen不会把’\0′算在长度内,这里不得不说sizeof和这个在计算字符串(数组)的时候区别了,如果是字符指针初始化,strlen可以得到结果,但是不包含\0的长度,sizeof则直接计算char的类型长度为4,如果是字符数组型初始化,则strlen可以得到正确结果,具体看何种方式,“”和{},而sizeof则会得到包含\0的长度计算在内,看见char a[] = “xxx”;sizeof也是可以计算的。 另外一类函数是mem开始的,memcpy,memmove,memcmp这类,这个就是直接将要的内容在内存中复制,移动,要不要包含\0在于你的设定了,因为一般都有个size的限定。 最后涉及字符串的还有 const char * 和char *const 还有const char *const这中定义,而且很常见。

已有 0 条评论 »

watch hannah montana free tetris watch dragon ball