【Programming Pearls】对文档中的单词进行计数问题

POWER(十一)charge pump原理 电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。 阅读详情

所谓单词就是用空格分隔开的字符序列。但是在网页文件中还包含&nbsp;<html>等词,所以需要避免这种情况。

 

示例 1:
int main(void)
{ set S;
set::iterator j;
string t;
while (cin >>t) //读取输入,插入到set集合S中,重复的单词忽略
S.insert(t);
for (j = S.begin();j != S.end(); ++j)
cout << *j<< "\n"; //按顺序输出单词
return 0;
}

下面我们将统计一个文档中各个单词出现的频率。

可以采用C++中的STL map容器来实现:

示例2:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{ map<string, int> M;
map<string, int>::iterator j;
string t;
while (cin >> t)
M[t]++;
for (j = M.begin(); j != M.end(); ++j)
cout << j->first << " " << j->second << "\n";
return 0;
}

         注:上面程序总共需要7.6秒处理Bible文档,其中读取需要2.4秒,插入需要4.9秒,写入输出为0.3秒。

       为了减少处理时间,我们采用哈希表的方式,采用一个节点,该节点包含一个指针指向该单词,一个变量对单词进行计数,以及一个指针指向下一个节点。


哈希表的结构如下:

typedef struct node*nodeptr;
typedef struct node{
char *word;
int count;
nodeptr next;
} node;
#define NHASH 29989 //定义单词的最大数
#define MULT 31   //哈希的乘数
nodeptr bin[NHASH];//定义哈希表

接下来将一个单词或字符串映射到一个无符号的整数,该整数小于NHASH。

 

unsigned inthash(char *p)
unsigned int h = 0;//这里使用unsignedint是为了保证为正数
for ( ; *p; p++)
h = MULT * h + *p
return h % NHASH
 

然后在主函数中,对哈希的每个bin进行赋初值,为NULL。然后读取单词,插入到哈希表中,无序插入。

int main(void)
{for i = [0, NHASH)
bin[i] = NULL
while scanf("%s", buf) != EOF
incword(buf)
for i = [0, NHASH)
for (p = bin[i]; p!= NULL; p = p->next)
print p->word,p->count
return 0
};

插入函数incword如下:

void incword(char*s)
h = hash(s)
for (p = bin[h]; p!= NULL; p = p->next)
if strcmp(s,p->word) == 0
(p->count)++
return
p =malloc(sizeof(hashnode))
p->count = 1
p->word =malloc(strlen(s)+1)
strcpy(p->word,s)
p->next = bin[h]
bin[h] = p
 

         注:使用哈希表的方法需要2.4s的读,0.5s的插入时间,0.06s的写入输出时间。总共需要3s的时间。该方法比C++的STL方法快了一个数量等级。但是使用sets和maps总能保证插入的单词是有序的,使用hash table则不能保证。Hash table的平均速度非常快,但是对最坏情况不能保证是一颗平衡树,不支持对单词的有序操作。

芒果YOLOv12改进108:基于QARep提出多种<独家原创结构>:ReNLANQARep, QARep, CSCQARep, C3QARep, C2fQARep等,即插即用提升小目标检测 阅读详情

相关推荐

告别手动标注!用ENVI Classic高效搞定高光谱图像语义分割标签(以农业/地物分类为例)

本文详细介绍了如何利用ENVI Classic实现高光谱图像的半自动化智能标注,特别针对农业和地物分类场景。通过光谱特征分析、智能标注技巧和MAT文件转换,显著提升标注效率和质量,助力AI模型训练。

weixin_28694169的博客 251

软件实习项目三——文本文件单词的检索与计数

实验内容 建立一个文本文件,统计给定单词在文本文件中出现的总次数及位置。 实验要求 文本文件中每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写,统计给定单词在文本文件中出现的总次数,检索输出的某个单词出现在文本中的行号、在该行中出现的位置。 设计数据量大的文本,进行子串的查询处理,分析算法运行的时间效率,对所有输出的匹配位置结果进行验证,以证明算法设计和实现的正确性。 用朴素模式匹配算法或KMP算法实现字符串定位; 可正确读取,保存文本; 编程语言及开发环境 编程语言:JAV

qq_45974622的博客 451

如何在n8n中高效调用playwright-mcp实现浏览器自动化(附避坑指南)

本文详细介绍了在n8n中高效集成playwright-mcp实现浏览器自动化的全流程指南,包括环境准备、工作流设计与优化、高级技巧与性能调优以及调试与问题排查。通过克服实际部署中的各种挑战,帮助用户打造稳定高效的自动化解决方案,特别适合需要浏览器自动化的工作流场景。

weixin_30379531的博客 387

wordcount源代码c语言,Word Count程序(C语言实现)

Word Count 程序GitHub地址:https://github.com/MansonYe/Word-Count一、项目简介Word Count 是用以统计文本文件的字符数、单词数和行数的常用工具。二、功能分析及实现情况· 基本功能:统计file.c的字符数(实现)统计file.c的单词数(实现)统计file.c的行数(实现)· 拓展功能:递归处理目录下符合类型的文件(实现)显示代码行、空...

weixin_33739574的博客 677

华硕ROG玩家国度安装Ubuntu双系统避坑指南:安全启动密钥那些事儿

本文详细解析了在华硕ROG玩家国度设备上安装Ubuntu双系统时,如何正确处理BIOS中的安全启动(Secure Boot)与密钥管理,避免常见的引导失败和Windows系统无法启动问题。指南提供了从数据备份、启动盘制作到BIOS精细设置(如将OS Type改为Other OS而非简单关闭Secure Boot)以及分区规划的完整流程,确保两个系统都能稳定共存。

weixin_29219189的博客 754

得物APP破解

本文介绍了得物App(版本4.74.5)的逆向破解过程,重点分析了绕过强制更新、抓包技巧以及破解newSign参数的详细方法。首先通过断网再联网的方式绕过强制更新,然后使用SocksDroid进行抓包分析,发现首页推荐接口需要newSign参数。通过反编译定位到RequestUtils.c方法,利用Frida进行Hook验证,最终解析出newSign的生成逻辑:将请求参数加入固定字段后排序拼接,再进行MD5加密生成签名。文中提供了完整的Hook脚本和签名算法分析,仅供学习移动安全技术参考。

m0_74653634的博客 3477

散列表(哈希表)-- 计算机科学里的一个伟大发明

      “ 散列表是计算机科学里的一个伟大发明,它是由数组、表和一些数学方法相结合,构造起来的一种能够有效支持动态数据的存储和提取的结构。散列表的一个典型应用是符号表,在一些值(数据)与动态的字符串(关键码)集合的成员间建立一种关联。你最喜欢用的编译系统十之八九是使用了散列表,用于管理你的程序里各个变量的信息。你的网络浏览器可能也很好地使用了一个散列表来维持最近使用的页面踪迹。你与I n t

SmilingDolphin的专栏 2021

通过CRC32爆破修改图片的宽高 ctf-misc图片隐写

** 一.在处理图片隐写题的时候,可能会修改图片原有的宽高,导致图片里面的内容无法正常显示,那么怎么判断它的宽高是否被修改了呢? ** 1.把图片拖进010editor中会发现左下角提示CRC不匹配,这是因为修改了高宽,却没有修改CRC,导致读取报错。 2.在linux中CRC32错误的图片是无法打开的,也可以利用pngcheck检查图片,会提示CRC32校验错误 ** 二.既然知道了CRC校验码错误,那么如何修改呢? 首先我们要知道CRC32是有哪些字节构成的 ** PNG文件中总是以固定的八个字节开

weixin_44145452的博客 1万+

题目3:文本文件单词的检索与计数(代码实现)

题目1:学生成绩档案管理系统(代码实现)一、信息类(pojo包下)1.单词类(Word.java)二、数据类和文档交互类(data包下)1.文档交互类(Reader.java)2.数据库类(Database.java)三、 数据访问对象类(dao包下)1.单词数据访问对象类(WordDao.java)四、服务端类(Service包下)1.系统服务端类(WordService.java)五、单词匹配算法类(algorithm包下)1.朴素模式匹配算法类(BF_Algorithm.java)2.KMP算法类(K

KT_xiaobai的博客 1286

OpenAI Realtime API实时语音交互实战指南

实时语音交互是人机自然对话的核心能力,其本质在于构建低延迟、双向、流式协同的音频-语义闭环。它突破传统REST API的请求-响应范式,依托WebSocket实现毫秒级音频输入流(audio.delta)、模型生成流(text/audio.delta)与动态控制流(session.update)三重并行。该技术显著降低端到端延迟至300ms以内,支撑语音助手、智能客服、对话式教育等强实时场景。本文聚焦OpenAI Realtime API的工程落地,详解PCM音频流处理、VAD语音活动检测、AudioCon

weixin_32285357的博客 391

卸载Office 16 Click-to-Run Extensibility Component详细步骤

卸载Office 16 Click-to-Run Extensibility Component详细步骤 第一步:按住键盘上的“Win+R”,打开运行窗口 在运行窗口输入“Installer”回车,打开Installer文件夹 第二步:在Installer文件夹红框最右侧,即“大小”后面,右击选择“其他”,找到“主题”,勾选,点击“确定”,添加主题列成功 第三步:在“主题”列找到“Office 16 Click-to-Run Extensibility Component

M_try的博客 3万+

ti-idf算法,实现对英文文档的检索,把多篇文档中的词(英文单词),按照权值从小到大进行排列

#include #include #include #include struct Ttree { char data[20]; double weight; double num; //一篇文献中的某一索引词出现的次数 double max; //一篇文献的总字数 double n; //索引

HUGEHEADHUGE的专栏 2039

YOLOv11改进策略【Head/分割头】| 结合CVPR-2024 中的DynamicConv 动态卷积 改进分割头, 优化模型(独家改进)

在大规模视觉预训练中,通常模型的性能受到数据、参数和FLOP三个关键因素的影响。一般来说,模型的参数数量越多,FLOP也越高,但在移动设备等对计算资源有限制的场景下,需要低FLOP的模型同时又希望模型能从大规模预训练中受益。传统的方法很难在增加参数的同时保持低FLOP,因此需要一种新的设计来解决这个问题,模块应运而生。

Limiiiing的博客 2310

【大数据学习-实验-6】Spark应用

1.统计有多少行符合要求 1.文档test.txt中存储了若干用户信息,一个用户的信息存储为一行数据,要求过滤出其中性别为“男”的用户,并且统计有多少行符合要求。 18375,2011-5-20,2013-6-5,女,4,广州,广东,CN,25,2014-3-31,2,0,0,0,100,0,1134,0,2013-6-9,0.25,0,430,297,4,4,195,12123,1,0,0,2,0,0,0,12318,12318,12123,12318,12123,1,0,0,0,22 36041,201

计忆芳华的博客 7921

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

对文本文件中的单词统计出现的次数(即词频)并按词频的从高到低排序

//业务需求:求给定words.txt中的相同单词出现的次数(即词频),并按照单词出现次数的从高到低排序!(原文本文件中只有单词和空格,且全为小写) //关键词 IO流 HashMap ArrayList //业务分析:1.读入文件,拿到内容;2.解析文件,进行切分;3.将每个单词放入集合;4.统计出现次数并排序 代码如下: public class Test33 { public ...

珉辰大数据 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【编程之美】读书笔记:寻找最大的K个数

目录(?)[-] 方法一:常规解法,先排序(时间复杂度为O(N*logN))方法二:利用快速排序原理(时间复杂度O(N*logK)(掌握)方法三:利用最小堆的原理(时间复杂度为O(N*logK))(掌握)方法四:二分法(在实际应用中效果不佳)方法五:用空间换取时间的方法                               问题:查找大量无序元素中最大的K个数。

xiaoding133的专栏【Stay hungry,Stay foolish】 3万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

双向链表的相关操作C++实现

对于循环双向链表 判断一个链表是否为空的条件为:head->next==head (头指针) 判断*p为最后一个节点的条件为:p->next=head #include using namespace std; /*双链表结构*/ typedef struct node { int data; struct node *prior; struct node *next; }DN

xiaoding133的专栏【Stay hungry,Stay foolish】 9505

【编程之美】读书笔记:寻找发帖水王

问题:传说,Tango有一大“水王”,他不但喜欢发帖还会回复其他ID发的每个帖子。该“水王”的帖子数目超过了帖子总数的一半,如何用快速的方法找出这个“水王”的ID?          分析:首先想到的是对所有的ID进行排序,然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*logN+N).

xiaoding133的专栏【Stay hungry,Stay foolish】 9112

【编程之美】读书笔记:寻找数组中的最大值和最小值

问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?                 解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可。这样需要2*N次的比较才能求出最大的数和最小的数。 void FindMinMax(int A[],int size,int &min,int &max) { min=A[0]; m

xiaoding133的专栏【Stay hungry,Stay foolish】 7810

C++栈类的实现

#ifndef _CStack #define _CStack #include template class CStack{ // LIFO 对象 public : CStack(int MaxStackSize = 10); ~CStack () {delete [] stack;} bool IsEmpty() const {return top == -1;} bool IsFull()

xiaoding133的专栏【Stay hungry,Stay foolish】 7623

C++顺序表的实现(采用模板)

(数组描述)采用模板 #ifndef CLinearList_ #define CLinearList_ #include template class CLinearList { public: CLinearList(int MaxListSize=10); //构造函数 virtual ~CLinearList(); bool IsEmpty() const

xiaoding133的专栏【Stay hungry,Stay foolish】 6492

链表的三种构造方法

#include #include #define MAX 100000 typedef struct SLink { int data; struct SLink *next; }SNode; /*前向插入法构造简单链表*/ SNode * CreateLinkA() { int x; SNode *head,*p; //SNode *p; head=NULL; scanf("

xiaoding133的专栏【Stay hungry,Stay foolish】 6082

【校园招聘】2013大众点评网软件研发岗笔试题

今天参加了南京地区的大众点评网软件研发岗的笔试,笔试题分成两部分,第一部分是行测,第二部分是算法设计题。行测中有言语理解题和数字推理以及图形观察题,考试时间20分钟。专业题有三道,都是算法设计题,考试时间为40分钟,先写思路,再写算法。下面回忆一下算法设计的三道题目。         第一题:质因数分解,给定一个整数,求出该数的所有质因数,如90=2*3*3*5;         第二题:求二

xiaoding133的专栏【Stay hungry,Stay foolish】 5392

用STL设计消息队列、优先级消息队列、资源分配管理器

STL库老早已经成为C++的一部分,在使用C++开发项目的过程中,很多人还在犹豫要不要使用STL库,觉得STL库很难,其实不然。我工作的项目中现在大量使用STL库,STL使用调试简单,高效,可以减少重复的代码量。        本文的主要目的是使用STL的queue 和 priority queue来阐述下项目中经常使用的消息队列以及资源分配模式。本文的例子主要如下: 消息队列带优先级的消息队

xiaoding133的专栏【Stay hungry,Stay foolish】 4496

【编程之美】读书笔记:求1到N之间整数中出现1的个数

问题:给定一个十进制正整数N,写下从1开始到N的所有整数,求其中出现的所有“1”的个数?例如:N=2,写下1,2.1的个数为1。当N=12,1的个数为5。        解法一:从1开始遍历到N,将其中每一个数中含有1的个数加起来,得到从1到N的所有1的个数之和。    int Count1InInteger(int n) { int iNum=0; while(n!

xiaoding133的专栏【Stay hungry,Stay foolish】 4473

【编程之美】读书笔记:给定一个整数N,求N!末尾有多少个0

问题:给定一个整数N,求N!末尾有多少个0          这个题目不能直接求出N!的值,这样可能会溢出。首先考虑N!=K*10^M,并且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10=2*5,所以M只和X和Z有关,每一对2和5相乘都可以得到一个10,于是M=min(X,Z);不能看出X>=Z.所以把公式简化为M=Z

xiaoding133的专栏【Stay hungry,Stay foolish】 4225
上一篇: 微软Wav音频文件解析
下一篇: 【Programming Pearls】查找一段文本或单词中的最长重复子串
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值