当前位置: 编程技术>综合
本页文章导读:
▪c++实现文本中英文单词和汉字字符的统计 源代码下载:http://download.csdn.net/detail/nuptboyzhb/4987141
1.统计文本中汉字的频数,为后续的文本分类做基础。对于汉字的统计,需要判断读取的是否为汉字。源代码如下:
[C++ code]
/*
*@aut.........
▪程序员日记(两个与长方体有关的算法) 之前的用2d画个三维图形,我说到过跟长方体有关的两个算法,(一个通过中心坐标长宽高求八个顶点,一个通过八个顶点求十二条边) ,但是那两个算法实在是太丑.........
▪php:统计邮件的大小方法
//统计用户收件箱所占空间有多少,先计算每封邮件的大小(标题+内容+附近),后总和;
//1、计算附近大小;
//2、计算标题和内容大小
//3、总和求出单封邮件大小
eg:
<?php
.........
[1]c++实现文本中英文单词和汉字字符的统计
来源: 互联网 发布时间: 2013-11-10
源代码下载:http://download.csdn.net/detail/nuptboyzhb/4987141
1.统计文本中汉字的频数,为后续的文本分类做基础。对于汉字的统计,需要判断读取的是否为汉字。源代码如下:[C++ code]
/* *@author:郑海波 http://blog.csdn.net/NUPTboyZHB *参考:实验室小熊 *注:有删改 */ #pragma warning(disable:4786) #include <iostream> #include <vector> #include <fstream> #include <string> #include <map> #include <queue> #include <ctime> using namespace std; void topK(const int &K) { double t=clock(); ifstream infile("test.txt"); if (!infile) cout<<"can not open file"<<endl; string s=""; map<string,int>wordcount; unsigned char temp[2]; while(true)//国标2312 { infile>>temp[0]; if(infile.eof()) break; if (temp[0]>=0xB0)//GB2312下的汉字,最小是0XB0 { s+=temp[0]; infile>>temp[1]; s+=temp[1]; } else//非汉字字符不统计 { s=""; continue; } wordcount[s]++; s=""; } cout<<"单词种类:"<<wordcount.size()<<endl; //优先队列使用小顶堆,排在前面的数量少,使用">"; priority_queue< pair< int,string >,vector< pair< int,string > >,greater< pair< int,string> > > queueK; for (map<string,int>::iterator iter=wordcount.begin(); iter!=wordcount.end(); iter++) { queueK.push(make_pair(iter->second,iter->first)); if(queueK.size()>K) queueK.pop(); } pair<int,string>tmp; //将排在后面的数量少,排在前面的数量多 priority_queue< pair< int,string >,vector< pair< int,string > >,less< pair< int,string> > > queueKless; while (!queueK.empty()) { tmp=queueK.top(); queueK.pop(); queueKless.push(tmp); } while(!queueKless.empty()) { tmp=queueKless.top(); queueKless.pop(); cout<<tmp.second<<"\t"<<tmp.first<<endl; } cout<<"< Elapsed Time: "<<(clock()-t)/CLOCKS_PER_SEC<<" s>"<<endl; } int main() { int k=0; cout<<"http://blog.csdn.net/NUPTboyZHB\n"; while (true) { cout<<"查看前K个频率最高的汉字,K="; cin>>k; if(k<=0)break; topK(k); } return 0; }
[图1]
[c++ code]
/* *@author:郑海波 http://blog.csdn.net/NUPTboyZHB *参考:实验室小熊 *注:有删改 */ #pragma warning(disable:4786) #include <iostream> #include <vector> #include <fstream> #include <string> #include <map> #include <queue> #include <ctime> using namespace std; void topK(const int &K) { double t=clock(); ifstream infile; infile.open("test.txt"); if (!infile) cout<<"can not open file"<<endl; string s; map<string,int>wordcount; while(true) { infile>>s; if(infile.eof()) break; wordcount[s]++; } cout<<"单词种类:"<<wordcount.size()<<endl; //优先队列使用小顶堆,排在前面的数量少,使用">"; priority_queue< pair< int,string >,vector< pair< int,string > >,greater< pair< int,string> > > queueK; for (map<string,int>::iterator iter=wordcount.begin(); iter!=wordcount.end(); iter++) { queueK.push(make_pair(iter->second,iter->first)); if(queueK.size()>K) queueK.pop(); } pair<int,string>tmp; priority_queue< pair< int,string >,vector< pair< int,string > >,less< pair< int,string> > > queueKless; while (!queueK.empty()) { tmp=queueK.top(); queueK.pop(); queueKless.push(tmp); } while(!queueKless.empty()) { tmp=queueKless.top(); queueKless.pop(); cout<<tmp.second<<"\t"<<tmp.first<<endl; } cout<<"< Elapsed Time: "<<(clock()-t)/CLOCKS_PER_SEC<<" >"<<endl; } int main() { int k=0; cout<<"http://blog.csdn.net/NUPTboyZHB\n"; while (true) { cout<<"PUT IN K: "; cin>>k; if(k<=0)break; topK(k); } return 0; }
[图2]
作者:NUPTboyZHB 发表于2013-1-12 10:05:51 原文链接
阅读:32 评论:0 查看评论
[2]程序员日记(两个与长方体有关的算法)
来源: 互联网 发布时间: 2013-11-10
之前的用2d画个三维图形,我说到过跟长方体有关的两个算法,(一个通过中心坐标长宽高求八个顶点,一个通过八个顶点求十二条边) ,但是那两个算法实在是太丑陋了,对于向我这种有强迫症的人简直不能忍受,所以我现在先把它们的算法用python描述出来,接着试着把它们变得更精巧,俗话说,代码就像女生的超短裙,越短越好...(虽然不知道是谁说的,但肯定是个男人)
算法1.通过一个中心坐标cen,和长方体的长宽高lwh,求出长房体的八个顶点 其实如果(x,y,z) = cen, (l,w,h) = lwh 我们的算法就是要求出x加减l,y加减w,z加减h然后在做一个组合,不过要注意位置不能变,所以一共有八个结果,这就是我们要求的八个顶点, 我的算法就是模仿八皇后,不过不需要回溯,递归到合适的值,把值保存起来,
def cubovers(cen,lwh): vertex = [None]*3 res = [] def ver(i): if i == 3: res.append(vertex[:]) else: for x in [-1, 1]: vertex[i] = cen[i] + x*lwh[i]/2.0 ver(i+1) ver(0) return res
其中for x in [-1, 1]: 就是分别求出了加和减,(做个乘法就行了)
算法2.第二个算法根据前面求出的顶点,计算出应该有的十二条边,这个算法说起来很简单,找出顶点集合中三个坐标中有两个相等的,那么它们之间就有一条连线。
所以我们先要写一个函数来判断两个点是否是共线(在长方体)
def same2(ver1, ver2): for i in range(3): for j in range(3): if i == j: continue if ver1[i] == ver2[i] and ver1[j] == ver2[j]: return True return False
我们要小心三个都相等,那就成同一个点了。
之后,求线算法就调用此函数来判断是否符合并把它们保存起来.
def cubolines(vers): res = [] for i in vers: for j in vers: if i == j: continue if same2(i, j): res.append([i,j]) return res
再短一点,再细一点---------孙悟空
我们的代码之所以看上去那么长,是因为没有很好的处理遍历集合,如果你能很好的写出你想要的遍历方式,那么你的代码会变得非常漂亮,而且有的时候,你以为自己写的代码已经很漂亮了,但是很可能另一个人的代码就会让你自叹不如,python就是这样,如果你只是把这些可跌代对象当c语言中的数组使,肯定会让代码变得跟c语言一样长,下面我用yield,闭包,和新的遍历方式重写这两个算法,使它们更短,如果哪位大神能写出更短的比如用什么itertools,求指点呀!
1,求顶点的算法:
def cubovers(cen, lwh): def vers(i): for x in [-1, 1]: p = cen[i] + x*lwh[i]/2.0 if i == 2: yield (p,) else : for rs in vers(i+1): yield (p,)+rs return list(vers(0))说明,因为使用了yield所以不需要一个列表保存结果了,中间变量也不需要用参数传递,而且我还是用了闭包,因为cen和lwh我并不想在参数中传递,这样看上去会很舒服。返回的时候返回list(vers(0)),因为yield返回的算是一种佚代器
2.求边线的算法
def same2(ver1,ver2): for i in range(3): if ver1[:i]+ver1[i+1:] == ver2[:i] + ver2[i+1:]: return True return Falsesame2看上去比以前短了,因为新的方式佚代出我想要的元素,比如用了切片
def cubolines(vers): return [[vers[i],t] for i in range(len(vers)) for t in vers[i+1:] if same2(vers[i],t)]
cubolines只用了一行,看上去会有点难,我返回了一个列表推导式,其实内部就是对一个列表中的元素作了个组合运算,
作者: aiqier
CSDN博客: http://blog.csdn.net/aiqier627
作者:aiqier627 发表于2013-1-12 9:59:20 原文链接
阅读:42 评论:0 查看评论
[3]php:统计邮件的大小方法
来源: 互联网 发布时间: 2013-11-10
//统计用户收件箱所占空间有多少,先计算每封邮件的大小(标题+内容+附近),后总和;
//1、计算附近大小;
//2、计算标题和内容大小
//3、总和求出单封邮件大小
eg:
<?php $attach_size= 0; if($attachmentid){ //获取附近的大小 $attach_data= attachdata($attachmentid); if($attach_data){ foreach($attach_dataas$value) { $attach_size+= $value['filesize']; } } } //获取标题和邮件内容的大小 $email_content_size= 0; $_filename= "attachment/emailsizecalculate.tmp"; $_file= fopen($_filename, "wb"); fwrite($_file, $subject.$content); fclose($_file); if($_temp= filesize($_filename)){ $email_content_size= $_temp; } $del_ret= @unlink($_filename); $sum_size= $attach_size*1024 + $email_content_size; //邮件总大小 ?>
作者:zyb_icanplay7 发表于2013-1-12 9:53:11 原文链接
阅读:41 评论:0 查看评论
最新技术文章: