1. 程式人生 > >T9輸入法實現原理和步驟

T9輸入法實現原理和步驟

T9輸入法全名為智慧輸入法,字型檔容量九千多字,支援十多種語言,是由美國特捷通訊軟體公司開發的,該輸入法解決了小型掌上裝置的文字輸入問題,已經成為全球手機文字輸入的標準之一。

       一般手機拼音輸入鍵盤如圖:

在這個鍵盤上,我們對比下傳統的輸入法和T9 輸入法,輸入“中國”兩個字需要的按鍵次數。傳統的方法,先按4次9,輸入字母z,再按2 次4 ,輸入字母h ,再按3 次6,輸入字母o,再按2 次6,輸入字母n ,最後按1次4,輸入字母g 。這樣,輸入“中”字,要按鍵12次,接著同樣的方法,輸入“國”字,需要按6次,總共就是18 次按鍵。  如果是 T9,我們輸入“中”字,只需要輸入:9、4、6、6、4,即可實現輸入“中”字,

在選擇中字之後,T9會聯想出一系列同中字組合的次,如文、國、斷、山等。這樣輸入“國”字,我們直接選擇即可,所以輸入“國”字按鍵0次,這樣T9 總共只需要5 次按鍵。 這就是T9 智慧輸入法的優越之處。正因為T9 輸入法高效便捷的輸入方式得到了眾多手機廠商的採用,以至於T9成為了使用頻率最高知名度最大的手機輸入法。

     先將漢語拼音所有可能的組合全部列出來,如下所示:

const u8 PY_mb_space[]={""};

    const u8 PY_mb_a   []={"啊阿醃吖錒厑嗄錒呵醃"};

    const u8 PY_mb_ai[]={"愛埃挨哎唉哀皚癌藹矮艾礙隘捱噯嗌嬡璦曖砈鑀靄"};

    const u8 PY_mb_an  []={"安俺按暗岸案鞍氨諳胺垵揞犴庵桉銨鵪黯"};

我們將這些組合稱之為碼錶,然後將這些碼錶和其對應的數字串對應起來,組成一個拼音索引表,如下所示:

    const py_index py_index3[]=

    {

           {"","",(u8*)PY_mb_space},

    {"2","a",(u8*)PY_mb_a},

           ……

  {"586","lun",(u8*)PY_mb_lun}, 

  {"586","luo",(u8*)PY_mb_luo}, 

  {"586","kun",(u8*)PY_mb_kun}, 

  {"586","kuo",(u8*)PY_mb_kuo}, 

            ……

   {"94664","zhong",(u8*)PY_mb_zhong},

   {"94824","zhuai",(u8*)PY_mb_zhuai},

   {"94826","zhuan",(u8*)PY_mb_zhuan},

    }

    其中py_index 是一個結構體,定義如下:

     typedef struct

     {

          u8 *py_input; //輸入的字串

          u8 *py;      //對應的拼音

         u8 *pymb;    //碼錶

      }py_index;

           py_input是與拼音對應的數字串,比如“94824 ”。py是與py_input 數字串對應的拼音,如果py_input=" 94824 ”,那麼py 就是“zhuai ”。最後pymb,就是我們前面說到的碼錶。注意,一個數字串可以對應多個拼音,也可以對應多個碼錶。

     在有了這個拼音索引表(py_index3)之後,我們只需要將輸入的數字串和py_index3 索引 表裡面所有成員的py_input 對比,將所有完全匹配的情況記錄下來(例如記錄在py_index**matchlist中),然後由使用者選擇可能的拼音組成(假設有多個匹配的專案),再選擇對應的漢字,即完成一次漢字輸入。當然還可能是找遍了索引表,也沒有發現一個完全符合要求的成員,那麼我們會統計匹配數最多的情況,作為最佳結果,反饋給使用者。比如,使用者輸入“323”,找不到完全匹配的情況,那麼我們就將能和“32”匹配的結果返回給使用者。這樣,使用者還是可以得到輸入結果,同時還可以知道輸入有問題,提示使用者需要檢查輸入是否正確。

   一個完整的T9 拼音輸入步驟(過程):

    1)輸入拼音數字串

我們用到的T9 拼音輸入法的核心思想就是對比使用者輸入的拼音數字串,所以必   須先由使用者輸入拼音數字串。

    2 )在拼音索引表裡面查詢和輸入字串匹配的項,並記錄

       在得到使用者輸入的拼音數字串之後,在拼音索引表裡面查詢所有匹配的專案,如果有 完全匹配的專案,就全部記錄下來,如果沒有完全匹配的專案,則記錄匹配情況最好的一個專案。

    3 )顯示匹配清單裡面所有可能的漢字,供使用者選擇.

       將匹配專案的拼音和對應的漢字顯示出來,供使用者選擇。如果有多個匹配項(一個數字串對應多個拼音的情況),則使用者還可以選擇拼音。

    4 )使用者選擇匹配項,並選擇對應的漢字.

       使用者對匹配的拼音和漢字進行選擇,選中其真正想輸入的拼音和漢字,實現一次拼音輸入。

    以上4 個步驟,就可以實現一個簡單的T9 漢字拼音輸入法。 

                 頂一下吧O(∩_∩)O謝謝支援

相關推薦

T9輸入法實現原理步驟

T9輸入法全名為智慧輸入法,字型檔容量九千多字,支援十多種語言,是由美國特捷通訊軟體公司開發的,該輸入法解決了小型掌上裝置的文字輸入問題,已經成為全球手機文字輸入的標準之一。        一般手機拼音輸入鍵盤如圖: 在這個鍵盤上,我們對比下傳統的輸入法和T9 輸入法,輸

[Go] sync.Pool 的實現原理 適用場景

臨時 digg 簡單的 設置 com 運行 之前 結果 官方文檔 摘錄一: Go 1.3 的 sync 包中加入一個新特性:Pool。 官方文檔可以看這裏 http://golang.org/pkg/sync/#Pool 這個類設計的目的是用來保存和復用臨時對象,以減

HashMap實現原理源碼分析

aci 鍵值對 creat 變化 遍歷數組 沖突的解決 查看 seed 二分 作者: dreamcatcher-cx 出處: <http://www.cnblogs.com/chengxiao/>原文:https://www.cnblogs.com/cheng

STL原始碼剖析——stack的實現原理使用方法詳解

Stack 簡介     stack 是堆疊容器,是一種“先進後出”的容器。     stack 是簡單地裝飾 deque 容器而成為另外一種容器。     使用 stack 時需要加上標頭檔案 #include<s

STL原始碼剖析——deque的實現原理使用方法詳解

Deque 簡介     deque是“double—ended queue”的縮寫,和vector一樣都是STL的容器,deque 是雙端陣列,而 vector 是單端的。     deque 在介面上和 vector 非常相似,在許多操作的地方

HashMap的實現原理底層結構 圖解+原始碼分析

 雜湊表(hash table)也叫散列表,是一種非常重要的資料結構,應用場景及其豐富,許多快取技術(比如memcached)的核心其實就是在記憶體中維護一張大的雜湊表,而HashMap的實現原理也常常出現在各類的面試題中,重要性可見一斑。本文會對java集合框架中的對應實現HashMap的實現原理

solr搜尋_商品分類_品牌列表_規格列表的實現思路步驟

第一步: 事先我們已經將itemCat表中的資料放入了solr中,所以這裡可以直接使用solr的分組查詢,查詢商品分類資料     第二步: 將商品分類表全部快取進redis資料庫中 快取的形式是map型別  大key=itemcat&nbs

ThreadLocal 的實現原理應用場景

一、ThreadLocal 是什麼 ThreadLocal 是一個執行緒內部的資料儲存類,通過它可以在指定的執行緒中儲存資料,資料儲存以後,只有在指定執行緒中可以獲取到儲存的資料,對於其他執行緒來說則無法獲取到資料 可以理解成執行緒本地變數或執行緒本地儲存,Th

ThreadLocal實現原理記憶體洩漏問題

1.概述 ThreadLocal不是為了解決多執行緒訪問共享變數,而是為每個執行緒建立一個單獨的變數副本,變數在多執行緒環境下訪問(通過get或set方法訪問)時能保證各個執行緒裡的變數相對獨立於其他執行緒內的變數,ThreadLocal例項通常來說都是private static型別。

Java多執行緒之AQS(AbstractQueuedSynchronizer )實現原理原始碼分析(三)

章節概覽、 1、回顧 上一章節,我們分析了ReentrantLock的原始碼: 2、AQS 佇列同步器概述 本章節我們深入分析下AQS(AbstractQueuedSynchronizer)佇列同步器原始碼,AQS是用來構建鎖或者其他同步元件的基礎框架。

Java多執行緒之Condition實現原理原始碼分析(四)

章節概覽、 1、概述 上面的幾個章節我們基於lock(),unlock()方法為入口,深入分析了獨佔鎖的獲取和釋放。這個章節我們在此基礎上,進一步分析AQS是如何實現await,signal功能。其功能上和synchronize的wait,notify一樣。

演算法---hash演算法原理(java中HashMap底層實現原理原始碼解析)

散列表(Hash table,也叫雜湊表),是依據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。  比如我們要儲存八十八個資料,我們為他申請了100個

JavaScript模板引擎實現原理封裝

這裡以art-template為例 先看例子 <!-- 引入模板引擎js檔案--> <script type="text/javascript" src="arttemplate.js"></script> <div id="content"&g

LinkedList、ArrayList、Vector、Stack的實現原理差異

相互關係 LinkedList、ArrayList、Vector 都繼承自 AbstractList;都實現了 List 介面,主要包括 size(), isEmpty(), contains(Ob

Synchronized實現原理鎖優化

Synchronized及其實現原理Synchronized的基本使用Synchronized是Java中解決併發問題的一種最常用的方法,也是最簡單的一種方法。Synchronized的作用主要有三個:(1)確保執行緒互斥的訪問同步程式碼(2)保證共享變數的修改能夠及時可見(

Python搜尋引擎實現原理方法

如何在龐大的資料中高效的檢索自己需要的東西?本篇內容介紹了Python做出一個大資料搜尋引擎的原理和方法,以及中間進行資料分析的原理也給大家做了詳細介紹。 布隆過濾器 (Bloom Filter) 第一步我們先要實現一個布隆過濾器。 布隆過濾器是大資料領域的一個常見演算法,它的目的是過濾

tornado使用者指引(二)------------tornado協程實現原理使用(一)

摘要:Tornado建議使用協程來實現非同步呼叫。協程使用python的yield關鍵字來繼續或者暫停執行,而不用編寫大量的callback函式來實現。(在linux基於epoll的非同步呼叫中,我們需要自己顯式的為非同步執行結果安裝大量的callback函式).協程的使用和編寫非同步程式碼一樣簡單,而且省去

HashMap的實現原理底層結構

memcached 結點 文章 actor lse get方法 會有 power 整體 哈希表(hash table)也叫散列表,是一種非常重要的數據結構,應用場景及其豐富,許多緩存技術(比如memcached)的核心其實就是在內存中維護一張大的哈希表,而HashMap的實

SpringMVC:攔截器實現原理登入實現

SpringMVC 攔截器的原理圖 springMVC攔截器的實現一般有兩種方式      第一種方式是要定義的Interceptor類要實現了Spring的HandlerInterceptor 介面    &n

StringBuffer與StringBuilder的區別,實現原理擴容

StringBuffer與StringBuilder的區別,及實現原理 區別 1、StringBuffer 與 StringBuilder 中的方法和功能完全是等價的, 2、只是StringBuffer 中的方法大都採用了 synchronized