实现变位词的程序(文件内容排序的实现)

《编程珠玑》第二章提到的问题C,查找一个单词的变位词,如果,直接全排列,然后再各个比对,那效率很低,书中使用了标签来表示同一类单词,而这一标签就是签名。签名的方式很多,不同签名,不同作用方式。由于变位词是指字母相同,但字母顺序不同的单词。故使用全字母签名。由此提出了“三段式”管道结构,三部分分别加签名,排序以及挤压合并。
第一部分,产生带有签名的词典:

void ExtendTheDictionary()
{
//extend the dictionary in the dictionary.txt
char word[WORDMAX],sig[WORDMAX];
fstream iofile("dictionary.txt",ios::in|ios::out);
assert(iofile);
cout<<"input the word..."<<endl;
while (scanf("%s",word) != EOF)
{
UpperToLower(word);
strcpy(sig,word);
Signature(sig);
iofile.seekp(0,ios::end);
iofile<<sig<<'\t'<<'\t'<<word<<endl;
//c语言标准库中的排序算法
//qsort(sig,strlen(sig),sizeof(char),charcomp);
printf("%s %s\n",sig,word);
}
iofile.close();
}

第二部分,按签名排序(方法很简单,也是标题中提到的关于文件内部排序的方法,每次提取出当前未排序的单词文件中最小单词,然后更新未排序单词文件):

void SortTheDictionary()
{
char word[WORDMAX],sig[WORDMAX],word1[WORDMAX],sig1[WORDMAX],word2[WORDMAX],sig2[WORDMAX];
cout<<"be sorting now...";
//实现签名的排序 并生成新文件
char *temp = "dictionary.txt";
ofstream outfile("SortedDictionary.txt",ios::out);
assert(outfile);
while (true)
{
ifstream tmp1(temp,ios::in|ios::_Nocreate);
//因为要删除上一个旧文件,需要清空
ofstream tmp2("temp2.txt",ios::out);
assert(tmp1);
assert(tmp2);
//find the smallest one in the current text
if(! (tmp1>>sig>>word)) break;
while (tmp1>>sig1>>word1)
{
//将当前文件中最小的签名提取出到最终文件,其他放到临时文件中
if (strcmp(sig1,sig) > 0)
{
tmp2<<sig1<<'\t'<<'\t'<<word1<<endl;
}
else
{
strcpy(sig2,sig);
strcpy(word2,word);
strcpy(sig,sig1);
strcpy(word,word1);
tmp2<<sig2<<'\t'<<'\t'<<word2<<endl;
}

}
outfile.seekp(0,ios::end);
outfile<<sig<<'\t'<<'\t'<<word<<endl;
tmp1.close();
tmp2.close();
//copy剩下未排序的元素
//temp2 -> temp1
ifstream f2("temp2.txt",ios::in);
ofstream f1("temp1.txt",ios::out);
//assert(f1);
//assert(f2);
f2.seekg(0);
while (f2>>sig>>word)
{
f1<<sig<<'\t'<<'\t'<<word<<endl;
}
f1.close();
f2.close();
//更改下次排序原文件
temp = "temp1.txt";
}
outfile.close();
cout<<endl<<"√ ok."<<endl;
}

第三部分,合并。此问题解决很简单,比较相邻两单词的签名是否相同,如果是的话,就合并到一行。

ifstream infile("SortedDictionary.txt",ios::in);
ofstream outfile("Result.txt",ios::out);
assert(infile);
assert(outfile);
infile>>sig>>word;
outfile<<sig<<'\t'<<'\t'<<word;
while (infile>>sig1>>word1)
{
if (strcmp(sig1,sig) == 0)
{
if (strcmp(word1,word) == 0)
{
//same word here
continue;
}
else
{
//same signature,different word
outfile<<'\t'<<'\t'<<word1;
}
}
else
{
outfile<<endl;
outfile<<sig1<<'\t'<<'\t'<<word1;
strcpy(sig,sig1);
strcpy(word,word1);
}
}
infile.close();
outfile.close();



另外,单词查找的话,我编了一个小函数,找到某一单词的同位词。但是,实现上有一些问题,就是,单词本身也会出现在其变位词中,如,输入stop,结果会显示:stop tops pots。还有待进一步改善。

void FindTheShiftingWord()
{
bool result1 = false; //has this signature
bool result2 = false; //has shifting words
char sig[WORDMAX],word[WORDMAX],sig1[WORDMAX],word1[WORDMAX];
//define the cache for one line
char temp[WORDMAX*10];
cout<<"now input the word whose shifting words u wanna find:";
cin>>word;
cout<<"result are:"<<endl;
strcpy(sig,word);
Signature(sig);
ifstream infile("Result.txt",ios::in);
assert(infile);
//the first word
infile>>sig1;
if (strcmp(sig,sig1) == 0)
{
result1 = true;
while (infile.get(word1,WORDMAX,'\n'))
{
//and put out all the words
if (strcmp(word,word1) == 0) continue;
else
{
cout<<word1<<endl;
result2 = true;
}
}
}
else
{
infile.seekg(0);
while(infile.getline(temp,WORDMAX*10))
{
//find this line's signature
infile>>sig1;
if (strcmp(sig,sig1) == 0)
{
//find the same signature
result1 = true;
while (infile.get(word1,WORDMAX,'\n'))
{
//and put out all the words
if (strcmp(word,word1) == 0) continue;
else
{
cout<<word1<<endl;
result2 = true;
}
}
break;//get out
}
else
{
//not the same signature
//the next line for checking out
continue;
}
}
}
if (! result1)
{
cout<<"? the dictionary does not have this word!"<<endl;
}
if (result1 && !result2)
{
cout<<"? cannot find the same word!"<<endl;
}
}

上述程序都集合到一个小程序中,可以实现一些功能,如添加单词,扩充词典,查看词典,找变位词等。
此外,在尝试从其他文件导入数据上遇到些麻烦,在这点上还在努力中。
19 变位词 所谓变位词是指把某个单词的字母的位置(顺序)加以改换所形成的一个新词。例如:silent 是 listen 的一个变位词,integral 是 triangle 的一个变位词。 请编写一个 C 语言程序,用来求解某个单词在一篇文章中的变位词。用户通过键盘输入一个单词和一个文本文件的名称,程序按照升序输出在这个文本文件中出现的该单词的所有变位词(同一个变位词多次出现,只输出一次)。如果没有变位词,... 阅读详情

相关推荐

变位词《编程珠玑》

若是不明白,详见http://blog.youkuaiyun.com/xjm199/article/details/21628091 变位词:一种把某个词或句子的字母的位置(顺序)加以改换所形成的新词,英文叫做anagram,词典把这个词翻译成“变位词”。 书中将这个程序按三个阶段的“管道”组织,其中一个程序的输出文件作为下一个程序的输入文件。第一类程序标识单词,第二个程序排序标识后的文件,而第三个程序将这些单词压缩为每个变位词类一行的形式。

变位词程序

如果两个单词,他们的字母组成一样而字母位置有区别,那么就称这两个单词为变位词。如 pans 和 span , tops 和 stop。 所有的变位词,对他们按字母顺序排序,得到相同的字符串(这个字符串成为该单词的签名)。把这个字符串作为这个单词的排序标准,排序完之后,相同签名的单词是变位词,将他们输出。 sign.exe 读入每个单词,为每个单词生成签名 #include #include

qyxqyxqyx的专栏 1131

算法设计ACM 变位词

输入N和一个要查找的字符串,以下有N个字符串,我们需要找出其中的所有待查找字符串的变位词(例如eat,eta,aet就是变位词)按字典序列输出

变位词算法C语言,第二章 啊哈!算法(变位词)

给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。“解决这个问题的许多方法都出奇地低效和复杂。任何一种考虑单词中所有字母的排列的方法都注定了要失败。而比较所有单词对的任何方法在我的机器上运行至少要花费一整夜的时间。”我们获得的”啊哈!灵机一动“就是标识字典中的每一个词,使得在相同变位词类中的...

weixin_39569753的博客 659

变位词ACM

Description 输入N和一个要查找的字符串,以下有N个字符串,我们需要找出其中的所有待查找字符串的变位词(例如eat,eta,aet就是变位词)按字典序列输出,并且输出总数目 Input 第一行:N(代表共有N个字符串属于被查找字符串) (N<=50) 第二行:待查找的字符串(不大于10个字符) 以下N行:被查找字符串(不大于10个字符) Output 按字典序列输出在被查找字符串中待查找字符串的所有变位词 每行输出一个 输出完成后输出总数目 Sample Input 7 asdfg asdgf asdfg dsafg xcvcv gfdsa tyuv asd Sample Output asdfg asdgf dsafg gfdsa 4

C++变位词问题分析

主要介绍了C++变位词问题分析,非常经典的算法,对于进行C++下的算法设计有很大的启发性,需要的朋友可以参考下

PTA-7-20 判断两个字符串是否为变位词(C语言)

PTA初级试题

qq_74482758的博客 816

从安装Eclipse 开始 开发第一个 CDS View

一篇超级简单快速的 创建CDS VIEW 入门步骤介绍文章。

IT小职员 4249

编程技巧:C语言实现变位词排序

使用C语言解决变位词问题。

猫晨的技术小屋 580

PCIe链路均衡实战:从Preset调节到系数优化的完整指南(附Synopsy IP案例)

本文深入解析PCIe链路均衡技术,从Preset调节到系数优化的全流程实战指南,特别针对PCIe 3.0/4.0中的Recovery.Equalization状态进行详细说明。通过Synopsy IP案例,展示如何应对高速信号完整性挑战,优化前向反馈均衡(FFE)机制,提升系统性能。

peace的博客 1054

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

C语言程序变位词

变位词变位词题目代码效果 变位词 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 题目 代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 1...

honeylife的博客 1899

KiCad插件安装太慢?试试华秋版,再手把手教你装这5个实用插件

本文介绍了KiCad华秋发行版如何解决插件安装慢的问题,并详细推荐了5个实用插件及其安装方法。华秋版优化了国内用户的下载速度,预装了常用扩展包,包括BOM生成器、3D模型增强工具等,显著提升PCB设计效率。

weixin_29184075的博客 547

输出变位词(c语言可运行)

#include<stdio.h> #include<string.h> //大写转小写 char toLower(char ch){ if(ch>='A' && ch <='Z'){ return ch+32; } return ch; } //分割字符串 int split(char *s,char ...

I want to know a little more. 819

利用requests库下载bilibili字幕文件

文章目录1. 前言2. 程序下载大法好2.1 挖掘思路2.2 核心知识点2.3 汇总代码 1. 前言   之前的博客介绍了使用工具下载B站视频,但美中不足的是无法下载字幕。为了提高效率,将下载字幕的工作用程序自动化处理。 2. 程序下载大法好 2.1 挖掘思路   在谷歌浏览器中按下F12,打开谷歌开发者工具。搜索subtitle,则会得到一个json文件,如下图所示:   在网页中空白位置点击查看网页源代码,然后通过搜索(Ctrl+f)查找subtitle,则会发现在subtitle_url中包含了对应

herosunly的博客 4万+

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1759

变位词--【编程珠玑】

重拾《编程珠玑》,再看一遍,之前未仔细看的或是忽略的,希望这次能有更丰富的收获; 好,如题,变位词:一种把某个词或句子的字母的位置(顺序)加以改换所形成的新词,英文叫做anagram,词典把这个词翻译成“变位词”。 书中将这个程序按三个阶段的“管道”组织,其中一个程序的输出文件作为下一个程序的输入文件。第一类程序标识单词,第二个程序排序标识后的文件,而第三个程序将这些单词压缩为每个变位词类一行的形式。

_Luffy的程序之路 2222

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1914

变位词算法C语言,程序实现英语变位词的搜索算法

算法实际上就是用计算机解决某个问题的方法和步骤。对某一类问题的解决,有很多解决的方法.针对不同的算法可能编写不同的程序。如何能使计算机高效的来解决问题,那就要有一个好的算法.本文详细介绍了英语中变位词的搜索算法。21 0 2年第 5期福建电脑13 4程序实现英语变位词的搜索算法高磊(河北衡水中学河北衡水 0 3 0 5 0 0)【摘要】算法实际上就是用计算机解决某个问题的方法和步骤。对某一类问题...

weixin_32340873的博客 587

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)

linux驱动由浅入深系列:块设备驱动之一(高通eMMC分区实例)linux驱动由浅入深系列:块设备驱动之二(块设备驱动结构分析)块设备驱动的模型还是基本基于字符设备驱动的,可以简单理解为块设备仅仅增加了操作缓冲区,对用户请求顺序进行队列重拍等等。字符设备驱动的相关分析可以查看本博客相关的博文。 按照本博客的行文习惯,在具体分析块设备驱动代码之前,我们会从整体上了解一下研究对象的特征,以及用户空间...

Radia的专栏 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

变位词问题

变位词问题:给定一个英语字典,找出其中的所有变位词集合,例如,"pots","stop"和"tops"互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。 如果考虑单词中字母的所有可能排列,那算法会出奇的低效和复杂。实际上,每个变位词相当于一个等价类。算法的关键是要选择...

chuifuhuo6864的博客 1265

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

变位词算法

[b]变位词[/b] 一种把某个词或句子的字母的位置(顺序)加以改换所形成的新词,英文叫做anagram,词典把这个词翻译成“变位词”。 最近参加了一个面试,其中一道上机题目就是有关[b]变位词[/b]的。 题目描述大致如下: 1.给出一个两个字符串互为变位词的相似度算法。当他们为变位词的时候输出1.0;当他们长度不同且没有相同字母时输出0;其他...

zhuyufufu的专栏 1193

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

在一个词典中找出所有的变位词

编程珠玑题: java实现 package program.pearls; import java.io.*; import java.util.*; import java.util.Map.Entry; public class DictionaryAnagram { /** * 在一个词典中找出所有的变位词, * 例如 pots stop tops互为变位

jiutianhe的专栏 1315

c语言判断两个单词是否为变位词,C++变位词问题分析

在《编程珠玑》一书的第二章提到了一个变位词问题,变位词指的是一个单词可以通过改变其他单词中字母的顺序来得到,也叫做兄弟单词,如army->mary。由变位词可以引申出几个算法问题,包括字符串包含问题,比较两个字符串是否是变位词,以及找出字典中变位词集合的问题。一、字符串包含问题(1) 问题描述:存在字符串1和字符串2,假设字符串2相对较短,如何快速地判定字符串2中的字符都存在于字符串1里(假...

weixin_32019361的博客 1739

在字典中查找变位词的方法

背景是给定一个单词,比如说least ,然后再给你一部英语字典,在里面找出拥有相同字母的单词(书中称为变位词),比如有这样一些,setal stale steal .etc...我实在是没有这么一部电子版的字典,所以干脆自己生成了一部字典(当然字典里的单词都是乱七八糟的),然后我把给定的单词也随机产生,定为是5包含五个字母的单词,字典中的所有单词也都是只有5位数,(我后来这么一算的话发现这个字典撑死只有26^5个单词≈25^5=(100/4)^5=100^5/4^5=10,000,000,000 /102

草头菜的博客 2251
上一篇: 《编程珠玑》 二分查找在大量数据中的使用(查找一个不在文件中的数据)
下一篇: GOOGLE走了?
CalvinMankor
博客等级 码龄17年 10粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值