一种码分多址无线终端电话号码精确匹配的方法
技术领域
本发明涉及一种CDMA(码分多址)无线终端电话号码的精确匹配的方法。
背景技术
电话本模块涉及大量电话记录的查询、存取、更新和删除操作,所以它的性能对无线终端的性能影响较大,因此从各个角度充分考虑对电话本模块进行优化是十分重要的,尤其是电话本模块的查找功能。特别是来电或去电进行号码匹配以及通话历史和短信模块同电话本模块间的动态匹配等电话本模块相关功能,所需要的电话号码的精确匹配速度,需要满足一定的速度指标要求才能够满足用户的要求。传统的匹配算法是采用顺序查找,由于线性查找的时间与电话记录数量成正比,随着电话本容量不断增大,传统的算法越来越不能满足用户的要求。
现有技术中的电话号码顺序查找匹配方法存在以下缺点:
1)因为电话号码有可能改变,所以每次进入通话历史,短息等模块都需要精确匹配,特别当记录数量比较大,几百或几千个时,模块的初始化需要大量的时间,用户只能等待,这直接影响用户对产品的使用感受。
2)来电或去电进行号码匹配以及通话历史和短信模块等都需要精确匹配,查找比较频繁,使用传统的顺序查找,特别是在记录数比较大的情况下,大大影响终端的性能。
发明内容
本发明所要解决的技术问题是提供一种CDMA(码分多址)无线终端电话号码的精确匹配的方法,完全克服了标准查找接口的缺点,基本做到了号码数量和查询时间线性无关,极大提高了动态匹配的速度,从而直接提高终端的性能与用户的使用满意度。
为解决上述技术问题,本发明提供一种码分多址无线终端电话号码的精确匹配方法,所述电话号码的精确匹配是指以号码为参数,在电话本中查找它所对应的名字,其特征在于,根据电话号码的编码规则,建立散列索引,然后进行快速动态匹配,包括以下步骤:
第一步,为终端的每个号码记录建立索引表;
第二步,为用户卡的每个号码记录建立索引表;
第三步,维护终端对应的索引表和用户卡对应的索引表;
第四步,提供一个精确匹配接口。
所述第一步进一步包括以下步骤:
第A1步,根据终端最大支持的电话号码数,确实索引的维数n;
第A2步,然后使用号码的最后n位映射它对应的索引链表,最后n位相同的号码存放在同一个链表中;
第A3步,依次循环,把各个号码插入到它对应的链表中。
所述第二步进一步包括以下步骤:
第B1步,根据用户卡最大支持的电话号码数,确实索引的维数;
第B2步,采用定时回调机制,把回调读取的号码存放它对应的一个链表;
第B3步,依次循环,直到读取完所有号码。
所述第三步包括增加一个电话号码、删除一个电话号码或修改一个电话号码。
所述第四步是指提供一个以号码为参数的接口,返回它所对应的名字,进一步包括以下步骤:
第C1步,取号码最后的索引维数n位,映射其对应的链表;
第C2步,遍历该链表查找,返回号码所对应的名字。
所述增加一个号码包括以下步骤:
第D1步,保存号码到终端或用户卡,修改对应的缓冲;
第D2步,取号码最后的索引维数n位映射它所对应的链表;
第D3步,在这个链表增加一个结点。
所述删除一个号码包括以下步骤:
第E1步,在终端或用户卡上删除号码,并清空对应的缓冲;
第E2步,取号码最后的索引维数n位映射它所对应的链表;
第E3步,在这个链表查找它对应的结点,最后把所找到的结点删除。
所述修改一个号码包括以下步骤:
第F1步,在终端或用户卡上修改号码,并修改对应的缓冲;
第F2步,取原来号码最后的索引维数n位映射它所对应的链表;
第F3步,在对应的链表查找所对应的结点,删除此结点;
第F4步,取修改号码最后的索引维数n位映射它所对应的链表;
第F5步,在它所对应的链表增加新结点。
本发明的技术方案由于采取散列索引的精确匹配方法,完全克服了标准查找接口的缺点,基本做到了号码数量和查询时间线性无关,极大提高了动态匹配的速度,一方面加快了开机初始化速度,减少了进入通话历史和短信模块的时间,使操作更快速顺畅。另一方面,减少不必要的CPU资源浪费,在没有增加任何硬件成本的条件下有效提高了终端的性能。
附图说明
下面结合附图与具体实施方式对本发明作进一步详细的说明。
图1是终端(用户卡)的每个号码记录建立索引表的流程图。
图2是增加电话号码的流程图。
图3是删除电话号码的流程图。
图4是修改电话号码的流程图。
图5是电话号码精确匹配的流程图。
具体实施方式
下面以建立二维索引表为例对本发明的方法流程进行详细描述。
通过电话号码的最后两位建立二维索引表,实现对号码精确匹配的优化,具体实现方法包括以下步骤:
第A步,定义一个二维数组,用于保存链表的指针,二维数组大小为15*15;
第B步,定义链表结点结构体,用于保存号码和对应的名字信息,结构体包含三个成员,分别为号码、所在的记录ID(通过ID可以获取名字)和下一个结点的指针;
第C步,电话本的初始化包括终端初始化和用户卡记录初始化,因为电话记录数一般比较多,一般采用定时回调,每次读取一条或者几条,每次读取成功后,在所对应链表新增结点,结点信息包含号码和号码的名字。
第D步,取号码最后的索引维数n位,映射其对应的链表,遍历该链表查找,返回号码所对应的名字。
终端记录初始化是指:开机上电启动系统,各个任务初始化成功后进入UI任务初始化,此时调用电话本初始化函数,电话本初始化函数打开电话本数据库,注册一个定时器,并注册回调函数,每次定时器到时,回调函数被调用。回调函数根据数据库指针,读取当前记录后在链表增加相应结点。当读到数据库的最后一个记录,回调函数取消定时器。
用户卡记录初始化是指:在开机上电时,UIM卡初始化成功后,利用回调机制轮询后台读取UIM卡文件EFADN6F3A中的电话记录,将文件的记录状态全部读入到对应的状态缓存结构体数组中。这样,缓存数组中的记录状态就和用户卡中的记录状态一致。
回调初始化的方法是指:在UIM卡初始化函数中,判断UIM卡的pin码(个人标识码)状态,如果为disable,则调用状态缓存初始化函数,否则提示输入pin码,在输入正确的pin码后才调用状态缓存初始化函数。状态缓存初始化函数中首先获取UIM卡中实际的容量,确定回调循环的次数。然后调用回调启动函数,开始回调第一条记录。
图1是终端(用户卡)的每个号码记录建立索引表的流程图。
图中:
1.1、系统上电后,电话本进行初始化;
1.2、注册定时器与电话记录读取的回调函数;
1.3、定时器到启动回调循环,回调读取记录的函数,读取第一条电话记录,将所读取的号码保存到缓存;
1.4、取号码最后两位映射它所对应的链表,在它所对应的链表增在一个结点;
1.5、判断实际容量范围的UIM卡电话记录是否已读完,如果已读完则回调结束,索引链表建立完成;否则进行步骤1.6;
1.6、定时器到读到下一条记录,将所读取的号码保存到缓存;
1.7、取号码最后两位映射它所对应的链表,在它所对应的链表增在一个结点后,进行步骤1.5。
图2是增加电话号码的流程图。
图中:
2.1、保存记录到终端数据库或者用户卡的文件里,然后根据新增加记录的
ID映射保存它的缓冲位置,最后把内容写入缓冲;
2.2、计算新增号码的长度,根据长度取最后两位,然后分另减去’0’,得到它的第一维和第二维索引;
2.3、利用步骤2.2计算出的第一维和第二维索引,在二维链表指针数组时获取它所对应的链表,在这个链表的表头插入这个号码。
图3是删除电话号码的流程图。
图中:
3.1、在终端数据库或者用户卡的文件里删除记录,然后根据删除记录的ID映射保存它的缓冲位置,最后把内容在缓冲里清空;
3.2、计算删除号码的长度,根据长度取最后两位,然后分另减去’0’,得到它的第一维和第二维索引;
3.3、利用步骤3.2计算出的第一维和第二维索引,在二维链表指针数组时获取它所对应的链表,遍历这个链表,当结点成员的号码变量等于删除号码时,则找到它所对应的结点,把这个结点从链表删除,并且释放。
图4是修改电话号码的流程图。
图中:
4.1、在终端或用户卡上修改号码,并修改对应的缓冲;
4.2、取原来号码最后的索引维数n位映射它所对应的链表;
4.3、在对应的链表查找所对应的结点,删除此结点;
4.4、取修改号码最后的索引维数n位映射它所对应的链表;
4.5、在它所对应的链表增加新结点。
图5是电话号码精确匹配的流程图。
图中:
5.1、计算匹配号码的长度,根据长度取最后两位,然后分另减去’0’,得到它的第一维和第二维索引;
5.2、利用步骤5.1计算出的第一维和第二维索引,在二维链表指针数组时获取它所对应的链表,遍历这个链表,当结点成员的号码变量等于匹配号码时,则找到它所对应的结点,把结点成员的记录ID返回,根据ID就可以获取它对应的名字。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进,均应包含在本发明的保护范围之内。