《编程珠玑》第二章2.8 变位词 思路

这个程序的实现有助于压缩key的大小,使查找效率更高。 详细解释请看《编程珠玑》第18页

1.问题描述

     给定一本英语单词词典,请找出所有的变位词集。所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。

 

 

2.解决思路

编程珠玑的变位词程序要按照三个步骤来执行,其中前一个步骤程序的输出作为下一个步骤程序的输入:

第一:程序标识单词,第二:程序排序标识后的文件,第三:程序将这些单词压缩为每个变位词类一行的形式

下面是编程珠玑的举例,仅有6个单词的字典的处理过程

由以上可看出需要三个程序的处理

1).sign程序:假设输入单词的长度不超过100,对每个输入的单词依照字母进行排序,将结果输入这个单词所对应的”签名“

2).sort程序:依照1)程序排序后的输出的“签名”,对其输出的结果排序,如上图.

3).squash程序:将同一个变位词类中的各个单词放到同一行中

 

3.代码实现

 sign程序:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WORDMAX 100

int charcomp(const void *x , const void *y)
{  
    return *(char *)x - *(char *)y;
}

int main()
{   
    char word[WORDMAX], sig[WORDMAX];
    while (scanf("%s", word) != EOF) 
    {
        strcpy(sig, word);
        qsort(sig, strlen(sig), sizeof(char), charcomp);
        printf("%s %s\n", sig, word);
    }
    return 0;
}
复制代码

 

sort程序:可以调用系统排序的程序

 

squash程序:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define WORDMAX 100

int main()
{   
    char word[WORDMAX], sig[WORDMAX], oldsig[WORDMAX];
    int linenum = 0;
    strcpy(oldsig, "");
    while (scanf("%s %s", sig, word) != EOF) 
    {
        if (strcmp(oldsig, sig) != 0 && linenum > 0)
            printf("\n");
        strcpy(oldsig, sig);
        linenum++;
        printf("%s ", word);
    }
    printf("\n");
    return 0;
}
复制代码

 

4.使用命令运行

编程珠玑上面通过下面的命令构建变位此列表

sign < dictionary | sort | squash >gramlist.txt

该命令将文件将文件dictionary输入到程序sign,连接sign的输出到sort,连接sort的输出至squash,并将squash的输出写入文件gramlist。

转自http://www.cnblogs.com/biyeymyhjob/archive/2012/08/14/2636962.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值