zoukankan      html  css  js  c++  java
  • 【转】五笔的字典序编码与解码

    题目:  

      五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下:a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy。其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 

      1)编写一个函数,输入是任意一个编码,比如baca,输出这个编码对应的Index; 
      2)编写一个函数,输入是任意一个Index,比如12345,输出这个Index对应的编码。

      注意到:如果都是4字符的定长串的话,很简单,就是25进制的一个表示法,但这里是不定长的。

      1、观察头几个串:a->0, aa->1, aaa->2,aaaa->3。应该可以看出来,这里的索引就是:字符串长度-1;

      2、已知a的索引,求b的索引:因为a到b之间隔了以下四种情况的字符串:a后跟1字符的串有25个(aa,ab,...ay),a后跟2字符的串有25*25个(aaa, aab, ... ayy),a后面跟3字符的串有25*25*25个(aaaa,aaab,...ayyy),然后才是b,所以b的索引 = a的索引 + 25+25*25+25*25*25 + 1,加1是因为b排在a和中间的字符之后1个;

      3、已知aa的索引,求ab的索引:同理,ab的索引 = aa索引 + 25 + 25* 25 + 1;

      4、已知aaa的索引,求aab的索引:同理,aab的索引 = aaa索引 + 25 + 1;

      5、已知aaaa的索引,求aaab的索引 = aaaa索引 + 1。

      至于aaaa,aaa,aa, a的索引由1: 可归纳为 字符串长度-1。

      所以:可用一个权重数组来表示修正后的进制:factor[4] = {1+25+25*25+25*25*25, 1+25+25*25, 1+25, 1}

      然后字符串string的索引函数为:index(string) = (string.length - 1) + sum[ factor[i] * (string[i] - 'a') ,  {i, 0, string.length-1 } ]

      其中sum是对内部表达式求和。

      举例:求cdef索引号过程

      c_index = a_index + ('c'-'a')*(25*25*25+1) = 0 + 2*factor[0]

      ca_index = c_index + 1

      cd_index = ca_index + ('d'-'a')*(25*25+1) = 2*factor[0]+1 + 3*factor[1]

      cda_index = cd_index + 1

      cde_index = cda_index+('e'-'a')*(25+1) = 2*factor[0]+1 + 3*factor[1]+1 + 4*factor[2]

      cdea_index = cde_index + 1

      cdef_index = cdea_index+('f'-'a') = 2*factor[0]+1 + 3*factor[1]+1 + 4*factor[2]+1 + 5*factor[3]

      程序参考:

    int factor[]={25*25*25+25*25+25+1,25*25+25+1,25+1,1};
    int encode(char *str)
    {
        int len=strlen(str);
        int index=len-1;
        for(int i=0;i<len;++i)
        {
            index+=factor[i]*(str[i]-'a');
        }
        return index;
    }

      解码过程就是编码过程的逆过程,有了factor数组,就简单多了。

    int factor[]={25*25*25+25*25+25+1,25*25+25+1,25+1,1};
    char* decode(int index)
    {
        char str[4];
        int i=0;
        while(index>=0)
        {
            str[i]='a'+index/factor[i];
            index=index%factor[i];
            --index;
            ++i;
        }
        str[i]='';
        return str;
    }

    摘录自:

    http://blog.csdn.net/jiangnanyouzi/article/details/6827534

    http://www.cnblogs.com/daniagger/archive/2012/07/20/2600581.html

  • 相关阅读:
    HTML(三)
    HTML(二)
    HTML(一)
    Python-数据库索引浅谈
    Django-ORM之聚合和分组查询、F和Q查询、事务
    [LeetCode][Python]String to Integer (atoi)
    [LeetCode][Python]Reverse Integer
    [LeetCode][Python]ZigZag Conversion
    [LeetCode][Python]Longest Palindromic Substring
    [LeetCode][Python]Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/budapeng/p/3298163.html
Copyright © 2011-2022 走看看