用hash_map统计出现次数最多的前N个URL

2023-05-16

海量数据统计频率最高词汇的常规办法之一是先通过一个hash函数处理数据然后取模N,拆分为N个小文件,对每一个小文件进行词频统计和排序处理,然后归并N个小文件取频率最大的M个数。


下面程序是利用hash_map处理小文件词频的实现(堆排序部分的代码没加上,可以参见http://blog.csdn.net/wodet/article/details/16948511)

关于hash_map和map的选择使用有几点注意的,hash_map是hash表的形式实现的,map是红黑树的结构,时间复杂度前者为N*(logN),后者为O(log2N)以内.从稳定性来说map占优,从平均性能来看hash_map占优,还有hash_map目前没有纳入C++标准库,但是各个版本的STL都提供了实现。具体情况具体选择咯。。


#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <hash_map.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

using namespace std;

class HashFunction {
public:
	size_t operator()(const string& s) const {
	unsigned long __h=0;
	for(size_t i=0;i<s.size();i++) 
	__h=5*__h+s[i];
	return size_t(__h);
	}
};

class Compare {
	public:
	bool operator()(const string& str1,const string& str2)const {
	return str1==str2;
	}
};



typedef hash_map<string,int,HashFunction,Compare> HashMap;



int main(int argc, char* argv[]) {
	printf("%s","-=-=-=-=-=-=-=-=-=-=hash_map测试-=-=-=-=-=-=-=-=-=-=-=-=\n");
	HashMap obj;
	/*
	obj["10010"]="联通客服";
	obj["10086"]="移动客服";
	obj["1368351111"]="电话号码";
	obj["123456"]="你的密码";
	*/
	//构造关键字与次数的hash_map,即统计词频
	int ai[]={22,41,22,46,13,13,22,44,44};
	for(int i=0;i<9;i++) {
		char aa[12]={0};
		sprintf(aa,"%d",ai[i]);
		obj[aa]++;
		cout<<aa<<" ,count="<<obj[aa]<<endl;
	}
	//将hash_map数据放入结构数组里
	struct tmp {
	int count;
	char str[12];
	};
	struct tmp stmp[9];
	memset(stmp,0x0,sizeof(tmp)*9);
	hash_map<string,int,HashFunction,Compare>::iterator itor=obj.begin();
	int j=0;
	for(;itor!=obj.end();itor++,j++) {
	sprintf(stmp[j].str,"%s",itor->first.c_str());
	stmp[j].count=itor->second;
	cout<<stmp[j].str<<"	"<<stmp[j].count<<endl;
	}
	//可以根据堆排序stmp[]数组,取前N个最多出现的字段
	//省略
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用hash_map统计出现次数最多的前N个URL 的相关文章

随机推荐

  • JAXB(二)Map属性映射

    JAXB support Collection List Set does not support Map not Collection XmlAdapter lt ValueType BoundType gt use List to im
  • JAXB(三)xsd 验证

    现在只有最简单的关联映射验证 关键点 xff1a jaxbMarshaller setSchema sch 还不会验证集合类型 xff1a List Set Map 以后再把JAXB xff08 二 xff09 的例子加上 xff0c 64
  • jstat

    http blog csdn net swpihchj article details 8197204
  • Effctive Java 笔记

    8 重写equals xff0c 只适合值类 xff08 枚举类除外 xff09 自反性 xff1a x equals x 61 61 true 对称性 x equals y 61 61 true 必然 y equals x 61 61 t
  • maven

    http blog csdn net zjf280441589 article details 53044308 http www infoq com maven Porject groupId 43 artifactId 43 versi
  • Linux第二课:Ubuntu 操作入门(内含:1Ubuntu 下打开终端+2 Linux 文件属性+3 设置屏幕+4 系统关机与重启+5.文件浏览器)

    Ubuntu 操作入门 2 2 1Ubuntu 下打开终端 方法1 点击 Ubuntu 桌面左上角图标进入搜索框 xff0c 输入 term 可以弹出终端 Terminal 程序 方法2 xff1a 桌面或者在文件浏览器的任何目录下右键鼠标
  • 堆中存什么?栈中存什么?

    堆中存的是对象 栈中存的是基本数据类型 和堆中对象的引用 一个对象的大小是不可估计的 xff0c 或者说是可以动态变化的 xff0c 但是在栈中 xff0c 一个对象只对应了一个4btye的引用 xff08 堆栈分离的好处 xff1a xf
  • 计算一个数的N次方

    计算一个数的N次方时 xff0c 我们先设定两个参数n和k xff0c n表示你要输入的数 xff0c k表示这个数的次方 这个时候我们必须对次方数k作出分类 xff1a k 61 0 return 1 其他 xff1a return n
  • 用结构体编写电话通讯录

    用结构体数组编写电话通讯录 xff0c 必须得知道结构体的形式 xff0c 那先把结构体定义回顾一下 xff1a 一般形式为 xff1a xff08 1 xff09 struct 结构体名称 成员表列 数组名 数组长度 如 xff1a st
  • linux(centos)下安装git并上传代码些许步骤(亲自验证过的步骤)

    以前听说了好多次github xff0c 但直到最近才第一次学习使用github来托管自己在linux下的代码 xff01 说实话 xff0c 我自己在使用的时候从网上查了好多教程 xff0c 但总觉得难以掌握 xff08 步骤过于繁琐 x
  • shell具体执行过程及自主实现shell解释器

    在编写shell 解释器之前 xff0c 先来分析几个知识点 xff1a xff08 1 xff09 shell 执行命令时步骤 xff1a xff08 如下图 xff09 xff08 2 xff09 shell 执行脚本时的步骤 xff1
  • Linux下的桥接模式和Nat模式的区别

    先来看一下linux在的桥接模式和Nat模式的差别 xff1a 桥接模式 xff1a Nat模式 xff1a 真正的接触这个问题是因为同学要给我远程传输文件 xff0c 这个时候就调节至桥接模式下 xff0c 进行ping 尽管我们用的是同
  • C知识点整合

    C语言总结 一 语法 1 常见的数据内置类型所占字节 xff08 64 位下 xff09 xff1a char 1 int 4 float 4 long 4 double 8 Longlong 8 2 变量 xff1a xff08 1 xf
  • 判断一棵二叉树是否为完全二叉树

    1 完全二叉树的特点 xff08 来自专业定义 xff09 看到上面完全二叉树的特点 xff0c 我可以将其特点按照自己的 理解归纳为以下几点 xff1a xff08 1 xff1a 若二叉树最下面一层有节点出现 xff0c 那么这个节点一
  • 深入理解JNI技术

    一 JNI是什么 xff1f JNI是Java Native Interface的缩写 xff0c 译为Java本地调用 JNI是一种技术 二 JNI技术的用途 xff1f Java程序中的函数调用Native程序中的函数 Native一般
  • HTTP基本认证(Basic Authentication)

    在浏览网页时候 xff0c 浏览器会弹出一个登录验证的对话框 xff0c 如下图 xff0c 这就是使用HTTP基本认证 1 客户端发送http request 给服务器 服务器验证该用户是否已经登录验证过了 xff0c 如果没有的话 xf
  • 将字符串以单词为单位逆序"I am a Student" 解法

    网上有个题目 xff0c 将字符串以单词为单位逆序 例如 34 I am a Student 34 要变成 34 Student a am I 34 解法大致为 xff1a 先将字符串整体逆序第一个字符和最后一个交换 xff0c 第二个与倒
  • 堆排序查找前N个最大数和二分查找算法

    先了解堆排序概念 堆排序利用了大根堆 xff08 或小根堆 xff09 堆顶记录的关键字最大 xff08 或最小 xff09 这一特征 xff0c 使得在当前无序区中选取最大 xff08 或最小 xff09 关键字的记录变得简单 xff08
  • 构建hash表和两种处理冲突方法

    hash表定义 hashing定义了一种将字符组成的字符串转换为固定长度 xff08 一般是更短长度 xff09 的数值或索引值的方法 xff0c 称为散列法 xff0c 也叫哈希法 由于通过更短的哈希值比用原始值进行数据库搜索更快 xff
  • 用hash_map统计出现次数最多的前N个URL

    海量数据统计频率最高词汇的常规办法之一是先通过一个hash函数处理数据然后取模N xff0c 拆分为N个小文件 xff0c 对每一个小文件进行词频统计和排序处理 xff0c 然后归并N个小文件取频率最大的M个数 下面程序是利用hash ma