編程珠璣:變位詞程序的實現


這個程序的實現有助於壓縮key的大小,使查找效率更高

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。

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM