问题背景简介

笔者三年前学会了五笔输入法,在电脑上一直在用五笔输入法,后来手机上也在用,不过现在的手机都是虚拟按键,键位非常小,26键的情况下确实会出现打不准的情况,手机打字速度不高,一直连接到蓝牙键盘也不现实,而9键的五笔几乎不可能好用。前几天从街坊那时听说在用“双拼输入法”,便稍微学了一下,也许比较适合手机上9键输入的。

关于双拼输入法

双拼输入法的基本原理还是拼音,只不过双拼是根据汉语拼音的规则,可以把汉语拼音分为声母和韵母两部分(当然有a,an,e这样没有声母的,规则中设定它是零声母,也可以有一个特定的键),输入一个声母一个韵母即拼出字,每个声母和韵母都只用一个键打出。

以键盘26键的双拼为例,输入某个字时,第一个键是声母,那么u,i作为键面上有的韵母,不可能拼出拼音,双拼就把它映射为双字声母比如sh,ch。输入声母之后,下一部分必是一个韵母,那么普通拼音输入q,w等声母的键就用不上,于是就可以在输入声母以后的q,w映射为韵母iu,ia。这样一个键代替多字节韵母,就提高了键的利用率,从而使每个拼字只需要两键,熟练之后就比普通拼音快很多。当然因为拼音天然的重码率问题不可避免,电脑输入的速度仍比不过五笔输入这样的形码。

然而,手机的输入法就是另一副模样。因为手机屏幕不太,在人眼的同一个视野中可以全看清,首选字和副选字都是需要用手触摸点选,首选与副选的速度差距不再像电脑上首字空格上屏,其它候选字要按数字键那样明显,又加之智能拼音利用云技术智能联想,可以自动调整常用词的词频,这样拼出同音字即便可能不在首字也是第二第三候选字,不会使选字造成太大问题。
那么,在手机输入法中用9键的拼音结合双拼的思路,可以设计一个双拼9键的输入法,用数字1-9代表某些拼音的成分,首字是声母,次字是韵母,则用敲两个数字的方式拼一个字。

输入方案设计

例如:先按默认的字母分布,把韵母a,e,i,o,u排除,就得到

键位 声母
2 b,c
3 d,f
4 g,h
5 j,k,l
6 m,n
7 p,q,r,s
8 t
9 w,x,y,z

这就是最初步的设计方式,不过还没有完,因为拼音还有ch,zh,sh没放进去,同时不难发现8号键只有t一个字母,7和9号键与有4个字,不太均衡。因为现在我们可以自行设计,当然可以调整的均衡一些,例如可以调整成:

键位 声母
2 b,c,NULL
3 d,f,ch
4 g,h,r
5 j,k,l
6 m,n
7 p,q,s
8 t,zh,sh
9 w,x,y,z

2号键的NULL代表零声母(没有声母的拼音如“阿”“安”“鹅”等)
类似的可以组织韵母,比如我设计的易记的初版:

键位 韵母
1 en,eng,in,ing
2 a,ai,ao
3 e,ei,er
4 i,ie,iu
5 ia,iang,an,ang
6 o.ou.ong,iong
7 ue(ve),ui,ua,uo
8 u,v,un,uang
9 ian,iao,uai,uan

根据26个字母在键上的分布,其中韵母a,e,i,o,u分别在2,3,4,6,8上,这个韵母表按音相近且键相近的原则分配。

不考虑同音选字的话,输入一句话,例如“计算机组成原理与系统结构”,则可输入 54 79 54 98 41 99 54 98 94 86 54 46(这里每字用空格分隔,实际输入时可以输入词组更提高准确度)

设计问题与解法

本身拼音就有同音重码的现象,现在同一个键又映射了多个音,使得重码又多了一层,这样一来效率也不会太高。

那么问题来了,如何统计出当前方案的重码数量呢?我们当然可以想到编程解决,就是分出声母和韵母,看一下每个键上一共映射了多少可能的拼音。我们知道并不是所有拼音组合都存在,比如bou,gia,cie等这种组合是不可能的,所以我们需要查一下拼音的合法性,然后统计每个键上总共有多少个拼音。
这里先不考虑拼音的每音调是否有效以及每个音包含字数以及字频问题,只看有效的拼音数是多少。

/*
设计手机双拼9键输入法的方案
统计其重码数
Programming Time:2017-08-24
planA易记,但是重码率比较高,有时一个键上有8个音,会在选音上产生一点麻烦
以后可以调整键位,再做统计
*/#include <stdio.h>
#include <string.h>
#include <stdlib.h>void line(){//画横线int i;for(i=0;i<37;i++)printf("-");printf("\n");
}int planA()
{   FILE *fp;char c[10];int res[101]={0};int N,i,d,f,leftFlag=1;char vowel[8];fp=fopen("in.txt","r");//in.txt之中列出了所有有效的拼音,见后附fscanf(fp,"%s",c);while(N<375){//in.txt共375行,即,共375个有效拼音d=0;f=0;leftFlag=1;//韵母边界,若无声母则为0,双字节声母为2 if(c[1]=='h'){ //zh,ch,sh 的情形 leftFlag=2;if(c[0]=='z' || c[0]=='s')d=8;else if(c[0]=='c')d=3;}else if(c[0]=='a' || c[0]=='e' || c[0]=='o'){ //无声音的情形 d=2;leftFlag=0;}else{ // 其它的一个字节的声母的情形 if(c[0]=='b' || c[0] =='c')d=2;else if(c[0]=='d' || c[0] =='f')d=3;else if(c[0]=='g' || c[0] =='h' || c[0]== 'r')d=4;else if(c[0]=='j' || c[0] =='k' || c[0]== 'l')d=5;else if(c[0]=='m' || c[0] =='n')d=6;else if(c[0]=='p' || c[0] =='q' || c[0]== 's')d=7;else if(c[0]=='t')d=8;else if(c[0]=='w' || c[0] =='x' || c[0]== 'y'|| c[0]== 'z')d=9;        }for(i=0;i<8;i++)vowel[i]='\0';i=leftFlag;while(c[i]!='\0')//从左界始,把c字符的后边韵母部分复制到vowel串当中 vowel[i-leftFlag]=c[i++];if( !strcmp(vowel,"en") || !strcmp(vowel,"eng") || !strcmp(vowel,"in") || !strcmp(vowel,"ing"))f=1;else if( !strcmp(vowel,"a") || !strcmp(vowel,"ai") || !strcmp(vowel,"ao"))f=2;else if( !strcmp(vowel,"e") || !strcmp(vowel,"ei") || !strcmp(vowel,"er") )f=3;else if( !strcmp(vowel,"i") || !strcmp(vowel,"ie") || !strcmp(vowel,"iu") )f=4;else if( !strcmp(vowel,"ia") || !strcmp(vowel,"iang") || !strcmp(vowel,"ang") || !strcmp(vowel,"an") )f=5;        else if( !strcmp(vowel,"o") || !strcmp(vowel,"ou") ||!strcmp(vowel,"iong") ||  !strcmp(vowel,"ong") )f=6;else if( !strcmp(vowel,"ue") || !strcmp(vowel,"ui") ||!strcmp(vowel,"ua") ||  !strcmp(vowel,"uo") )f=7;else if( !strcmp(vowel,"u") || !strcmp(vowel,"v") ||!strcmp(vowel,"un") ||  !strcmp(vowel,"uang") )f=8;else if( !strcmp(vowel,"ian") || !strcmp(vowel,"iao") ||!strcmp(vowel,"uai") ||  !strcmp(vowel,"an") )f=9;res[10*d+f]+=1;fscanf(fp,"%s",c);N++;
}line(); //画一条线 for(i=20;i<100;i++){if((i)%10!=0)printf("|%2d ",res[i]);//画格子 if((i+1)%10==0){printf("|\n");line();}
}fclose(fp);return 0;
}
int main(void){system("color fc");planA();
}

这段程序的运行结果,就是输出了所有从21到99的组合中带的拼音数

可以看到,有的键位如22,47,48的拼音数达到了8个,而44却没有合法的拼音,67也只有1个合法的拼音。这种双拼方案的分布不够均衡,仅是容易记住而已,对九键输入的高效性提高不显著。
将来可以试着调整其它的键位分配,从而使方案改的均衡一些。对于普通的计算机,要自动遍历所有结果并找出最好结果是很难完成的,方案的分配还需要手工调整。利用此程序即进行词频统计,计算机还是很容易且很方便完成的。

反思与改进

确实,C语言处理字符串不是非常方便,用其它语言如Python会方便一些,也更清楚。例如在python当中要判断韵母是不是a,ai,ao中的某个时,可以用如下语句:

if (vowel in ['a','ai','ao']):f=2

要比C语言简洁的多。

另附:
in.txt的内容,所有汉语当中可能出现的有效拼音

a
ai
an
ang
ao
ba
bai
ban
bang
bao
bei
ben
beng
bi
bian
baiao
bie
bin
bing
bo
bu
cai
can
cang
cao
ce
cen
ceng
cha
chai
chan
chang
chao
che
chen
cheng
chi
chong
chou
chu
chuai
chuan
chuang
chui
chun
chuo
ci
cong
cou
cu
cuan
cui
cun
cuo
da
dai
dan
dang
dao
de
deng
di
dian
diao
die
ding
dong
dou
du
duan
dui
dun
duo
e
en
er
fa
fan
fang
fei
fen
feng
fou
fu
gai
gan
gong
gao
ge
gen
geng
gong
gou
gu
gua
guai
guan
guang
gui
gun
guo
hai
han
hang
hao
he
hen
heng
hong
hou
hu
hua
huai
huan
huang
hui
hun
huo
ji
jia
jian
jiang
jiao
jie
jin
jing
jiong
jiu
ju
juan
jue
jun
kai
kan
kang
kao
ke
ken
keng
kong
kou
ku
kua
kuai
kuan
kuang
kui
kun
kuo
la
lai
lan
lang
lao
le
lei
leng
li
lian
liang
liao
lie
lin
ling
liu
long
lou
lu
lv
luan
lve
lun
luo
ma
mai
man
mang
mao
mei
men
meng
mi
mian
miao
mie
min
ming
miu
mo
mou
mu
na
nai
nan
nang
nao
ne
nei
neng
ni
nian
niang
niao
nie
ning
niu
nong
nou
nu
nv
nve
nuo
ou
pa
pai
pan
pang
pao
pei
peng
pi
pian
piao
pie
pin
ping
po
pou
pu
qi
qia
qian
qiang
qiao
qie
qin
qing
qiong
qiu
qu
quan
que
qun
ran
rang
rao
ren
reng
rong
rou
ru
ruan
rui
run
ruo
sa
sai
san
sang
sao
se
sha
shan
shang
shao
she
sheng
sheng
shi
shou
shu
shuai
shuang
shui
shun
shuo
si
song
sou
su
suan
sui
sun
suo
ta
tai
tan
tang
tao
te
teng
ti
tian
tiao
tie
ting
tong
tou
tu
tuan
tui
tun
tuo
wa
wai
wan
wang
wei
wen
weng
wo
wu
xi
xia
xian
xiang
xiao
xie
xin
xing
xiong
xiu
xu
xuan
xue
xun
ya
yan
yang
yao
ye
yi
yin
ying
yong
you
yu
yuan
yue
yun
za
zai
zan
zang
zao
ze
zei
zen
zeng
zha
zhai
zhan
zhang
zhao
zhe
zhen
zheng
zhi
zhong
zhou
zhu
zhua
zhuan
zhuang
zhui
zhun
zhuo
zi
zong
zou
zu
zuan
zui
zun
zuo

[.cpp]统计双拼拼音一种方案的重码数相关推荐

  1. 腾讯在线人数统计_PHP + REDIS 实践:统计在线人数的几种方案分析

    (给PHP开发者加星标,提升PHP技能) 转自:饼bing blog.csdn.net/hao508506/article/details/52496656 在线人数统计业务是我们开发web肯定要设计 ...

  2. 微软双拼拼音加加方案一键注册表导入

    拼音加加双拼 Win10/Win11专业版最新更新的版本,在输入法设置当中出现了双拼方案编辑功能,通过双击注册表文件可以一键导入一直以来我使用拼音加加的双拼方案. 用记事本将下面的文字内容保存为 pi ...

  3. REDIS实践之在线人数统计几种方案分析

    在线人数统计业务是我们开发web肯定要设计的业务逻辑,本文就会给出几种设计方案,来分析下各个方案的优缺点: 使用有序集合 这种方案能够同时储存在线的用户 和 用户上线时间,能够执行非常多的聚合计算,但 ...

  4. 干货 | Elasticsearch 词频统计的四种方案

    1.词频相关实战问题 最近词频统计问题被问到的非常多,词频统计问题清单如下: Q1:Elasticsearch可以根据检索词在doc中的词频进行检索排序嘛? Q2:求教 ES 可以查询某个索引中某个t ...

  5. 数据脱敏的 6 种方案

    一.什么是数据脱敏 英文全称:Data Masking . 先来看看什么是数据脱敏?数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号.银行卡号 等信息,进行转换或者 ...

  6. 多租户数据隔离的三种方案

    一.多租户在数据存储上存在三种主要的方案,分别是: 1. 独立数据库 这是第一种方案,即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本较高. 优点: 为不同的租户提供独立的数据 ...

  7. ITSM-CMDB数据库设计-四种方案任你选

    ITSM-CMDB数据库设计-四种方案任你选 来源 http://kiral.javaeye.com/blog/789467 最近在做CMDB的数据库设计方案,有4种方案,各有利弊,我选方案3,大家可 ...

  8. 服务器监控功能(3种方案)

    服务器监控功能(3种方案) 一.Actuator监控 1. 添加依赖 2. application.yaml配置 3. 启动项目,访问 二.SpringBoot Admin(单体) 1. Admin ...

  9. android微信自动化脚本,聊聊微信自动化的几种方案

    经常有小伙伴后台私信问我,自己每天大量的时间花在微信上,平常很多重复的操作都需要自己去亲力亲为,效率低的同时,人也累的半死,问我能否能做成自动化. 答案是可以的,任何人为操作都能做成自动化,自动化无所 ...

最新文章

  1. python边缘检测代码_python Canny边缘检测算法的实现
  2. 简明Vim练级攻略(转载)
  3. 如何判断对象是否存活之根搜索算法
  4. MySQL-MMM如何调用远程管理卡命令去fence?
  5. sonar findbugs plugin源码研究
  6. HDU - 6971 K - I love max and multiply sosdp
  7. SicilyFunny Game
  8. java学习(157):线程的引入
  9. 数据压缩 第二次作业
  10. java opencv orb_opencv python ORB算法
  11. 用java实现etcd分布式锁_etcd分布式锁及事务
  12. java检测用户是否重复登录_Java web工程判断用户是否重复登录
  13. 【VS开发】VS2010中导入ActiveX控件
  14. 全球英文经典演讲100篇_日语演讲100问(1)即兴演讲不即兴!(理论篇)
  15. 8086汇编学习小记-1
  16. teched2004视频资料下载,又加了5段,全是开发类的
  17. Python爬虫入门教程24:下载某网站付费文档保存PDF
  18. 创建MSN界面式的Ext JS布局
  19. Python编程视频教程零基础从入门到实战自学课程
  20. 电脑使用者必备的文本编辑器,哪款适合你?

热门文章

  1. 表面增强拉曼光谱(SERS)基底的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. M401a armbian下安装cups共享打印机
  3. Android Stuido环境搭建
  4. git从远程下载项目到本地以及本地提交远程
  5. 《经济学人》最新封面评下一个前沿技术:脑机接口正等待远见者的到来
  6. 2021年广东省大数据技术与应用技能大赛 真题测试数据
  7. 线缆种类小结:BNC、RJ45和RJ48
  8. 我们欺骗了活动主办方
  9. Struts2 官方教程之Struts Tags(六)——Generic Tags(Control Tags )
  10. 洛谷P2598 [ZJOI2009]狼和羊的故事