【转】五笔的字典序编码与解码
题目:
五笔的编码范围是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]='\0';return str; }
摘录自:
http://blog.csdn.net/jiangnanyouzi/article/details/6827534
http://www.cnblogs.com/daniagger/archive/2012/07/20/2600581.html
转载于:https://www.cnblogs.com/budapeng/p/3298163.html
【转】五笔的字典序编码与解码相关推荐
- 五笔的字典序编码与解码
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ba, ...
- ibus五笔造词、删词功能
本文转载至:http://forum.ubuntu.org.cn/viewtopic.php?t=353240 一年前,我曾问系统自带的ibus五笔86能否自定义词组?结果280的浏览量,只有2个回复 ...
- 学习五笔之我见[转]
首先说下现在的状态:原来用了多年的拼音,灌水速度最快可以达到120字/分,为了切身了解五笔和拼音的各种争议,抱着实践和求知的想法来学五笔的.经过接近三个月地用五笔,现在是打单字,看着屏幕打文章的速度是 ...
- 算法:五笔编码,如何根据输入的词条自动生成输入编码
算法:五笔编码,如何根据输入的词条自动生成输入编码 一.想要实现的 最近做的一个五笔码表工具,想要实现根据用户输入的词条自动生成输入编码. 比如: 输入 我们 生成 trwu 输入 五笔基础知识 生成 ...
- 水鱼五笔编码练习系统
水鱼五笔编码练习系统是我大三时的一个课程设计作品,因我小时候就学会了五笔, 再之身边会五笔的人没几个,想学五笔的人又没有简单.有效的五笔练习软件可以拿来用, 这让我萌生了写一款五笔练习软件的想法.个人 ...
- 【原创】生成五笔编码
生成五笔编码 最近在修改项目中汉字生成五笔编码的问题.很多的生僻字无法生成对应的五笔编码.查找了很多资料,终于找到这个非常齐全的编码表.总共20902个汉字,包括汉字与对应的全拼.五笔.郑码.UNIC ...
- 五笔编码查询工具(念青字库) 新增快捷键 | #hta #五笔 #javascript
前段时间写的五笔编码查询,最近又增加了快捷键: [list] [*]'/'键定位到输入框 [*]'Esc'键定离开推入框 [/list] 看图说话: [img]http://dl.iteye.com/ ...
- 计算机五笔字型编码方法,无字型五笔编码计算机中文输入法
主权项: 1.一种计算机中文键盘输入形码编码输入法,使用计算机通用西文键盘,选取汉字\r\r\r\r\n字根,对字根分组,将字根分组定义在西文键盘的不同键位上,构成中文键盘:其字编\r\r\r\r\n ...
- “乙”的五笔编码为什么是nnl
N是乙的字根,再N是折的识别码.最后其实有两个L,它是单笔字的识别码. 又如:"一"字的全码是GGLL 补充: 五笔中,有五个笔划是特殊的.那就是代表五笔的横.竖.撇.捺.折.这五 ...
最新文章
- 动真格!因为论文!138名研究生丧失学位申请资格,导师也被罚……
- WINDOWS XP常用的快捷键组合?
- 零基础也可以实现“机器同传翻译”!
- Thinkphp中Auth认证
- Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
- Oracle 11g ora 15018,oracle 11gR2 RAC root.sh 错误 ORA-15072 ORA-15018
- java_函数的概述
- VC学习笔记:简单绘图
- 仰空以忧繁星,我将君心聆听,我听君心似水清,清冷好似寒冰
- java坦克大战案例_java坦克大战
- Redis命令之scan、sscan、hscan、zcan
- Linux中安装tree命令
- 使用Java的JNI调用C
- [BZOJ4173]数学
- 亚马逊、速卖通、Shopee阿里国际站、mercari、沃尔玛、newegg、美客多等跨境平台卖家如何有效结合测评,补单打破瓶颈
- 编写高效 TS 代码的一些建议
- Qt软件开发交流群分享
- iOS-----GitHub上比较齐全的iOS 工具和App
- 漫威电影和程序员、Git 到底有什么关系?
- Python语言程序设计基础 第二版(嵩天著)课后答案第四章