1.适用于存储空间受限的设备的通讯录防重构建方法,其特征在于,其包括以下步骤:S1:把所有的需要添加的通讯录数据读入设备的内存中;
S2:根据所述通讯录数据中包含数据种类n_Class,确定需要建立通讯录哈希表的数量n_Directory;每一个所述通讯录哈希表中以其对应种类的数据作为关键码,所述关键码以外的数据作为关联数据、以关联数据地址的形式存储在该表中;
即:n_Class等于n_Directory,且n_Directory、n_Class都为正整数;
S3:构建n_Directory个所述通讯录哈希表;
在每一个所述通讯录哈希表中,每一行的列元素包括:占用标志、数据域、链索引;
所述占用标志的字段用来设置使用标志,表示该占用标志对应行的记录是否已经被使用;
所述数据域的字段用来存放实际数据,所述实际数据包括:关键码数据字段、关联数据地址字段;
所述关联数据地址字段存储了在另外的关联通讯录哈希表中的索引地址,该索引地址存储了与所述关键码设置了索引关系的其他种类的数据;
所述关键码为联系人姓名的所述通讯录哈希表设置为主表,其他种类的所述通讯录哈希表设置为从表;
在所述主表中,所述关键码数据字段和所述关联数据地址字段的数量关系为:1:Num,其中Num为自然数,且Num≥(n_Class‑1);所述主表中的所述关联数据地址字段中,保存了所述关键码以外的其他所有种类的关联数据的索引信息,其中同一种类的所述关联数据地址字段的数量大于等于1;
在所述从表中,所述关键码数据字段和所述关联数据地址字段的数量关系为:1:1;所述从表中的所述关联数据地址字段中,只保存所述主表的关键码的地址;
所述链索引的字段用来支撑拉链法处理冲突,当多条信息需占用同一记录位置时,该字段用来记录下一条记录的索引;
S4:初始化所述通讯录哈希表长度为N+N*y%;
其中,N为哈希表的基本容量,N为正整数;
y%用于处理哈希映射冲突的空间预留率,y为正整数;当新增数据时,如果计算得到索引对应的数据与新增数据发生冲突,需要在基本容量N的后面顺序的挂接一个冲突链,用来放置发生冲突的联系人信息,此时就会使用到基本容量以外的N*y%的空间来构建冲突链;
S5:初始化所有的n_Directory个所述通讯录哈希表的字段;
将每个所述通讯录哈希表的所述占用标志字段设置为:未使用;
将所有的所述链索引字段设置为:无效;
将所有关键码对应的所述关联数据地址字段的使用状态都初始化为:无效;
S6:获取步骤S1中读入所有的需要添加的所述通讯录数据,依次读取每一条通讯录数据,赋值给待处理通讯录数据DirectoryData;
所述待处理通讯录数据DirectoryData包括:关键码数据KeyCode、关联数据LinkCode;
其中,所述关键码数据KeyCode和所述关联数据LinkCode的数量关系为:1:n_Data,其中n_Data为自然数;
根据所述待处理通讯录数据DirectoryData中关键码数据KeyCode的种类,其对应种类的通讯录哈希表作为待处理通讯录哈希表TargetDirectory;
S7:添加所述待处理通讯录数据DirectoryData到所述待处理通讯录哈希表TargetDirectory中;
具体包括以下步骤:
a1:将所述关键码数据KeyCode赋值给待处理关键码TempKeyCode;使用哈希算法计算所述待处理关键码TempKeyCode的哈希码,设定得到的哈希码的值为HASHCODE;
a2:计算所述待处理关键码TempKeyCode的所述链索引;
使用哈希码的值HASHCODE模上N,得到余数INDEX,INDEX即为所述链索引字段的值,具体如下:INDEX=HASHCODE mod N;
a3:在所述待处理通讯录哈希表TargetDirectory中,检查INDEX处的行中对应的所述占用标志位;
如果所述占用标志位的字段为:未使用,则表示其对应的所述数据域中的关键码数据字段没有被使用,则INDEX对应的行设置为待插入行元素,执行步骤a6;
否则,则表示其对应的所述数据域中的关键码数据字段已经被使用,执行步骤a4;
a4:取得所述数据域中的关键码数据字段中的数据,作为对比数据CompareCode与所述待处理关键码TempKeyCode进行比较;
如果CompareCode与TempKeyCode相同,则表示所述待处理关键码TempKeyCode已经存在于哈希表中,不需要再次添加,本次针对待处理关键码TempKeyCode的添加操作结束;
否则,表示所述待处理关键码TempKeyCode在哈希表中没有被存储过,不存在数据重复问题,执行步骤a5;
a5:从所述待处理通讯录哈希表TargetDirectory的基本容量N后面的N*y%区域中顺序的搜索第一个数据域未被占用的行设置为待插入行元素,挂接在所述冲突链的末尾,且把所述冲突链尾部最后一行的索引的值赋值给INDEX;
a6:将所述待处理关键码TempKeyCode,存入所述待插入行元素中所述数据域中的关键码数据的字段中,其对应的所述链索引自动存储INDEX的值;
S8:针对所述待处理关键码TempKeyCode,在同一条所述待处理通讯录数据DirectoryData中找到对应的所述关联数据LinkCode,设置所述待处理关键码TempKeyCode与所述关联数据LinkCode的相互的索引关系:S9:重复步骤S6~S8,直至步骤S1中读入的所有的所述通讯录数据都处理完毕,结束本次构建操作。
2.根据权利要求1所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:步骤S8中,设置所述待处理关键码TempKeyCode与所述关联数据LinkCode的相互的索引关系,包括如下步骤:b1:在所述待处理通讯录数据DirectoryData中,确认所述待处理关键码TempKeyCode的所述关联数据LinkCode的数量n_Data;
如果n_Data=0,则代表所述关联数据LinkCode为空,不需要进行关联索引操作,本次关联索引的操作结束;
否则,执行步骤b2;
b2:确认所述待处理关键码TempKeyCode的种类;
如果所述待处理关键码TempKeyCode的种类为联系人姓名,则执行步骤b3;
否则,执行步骤b7;
b3:在n_Data个所述关联数据LinkCode中顺序的依次取出每一个数据,依次设置为待确认关联数据TempLinkCode;
b4:所述待处理关键码TempKeyCode为主键、其对应的所述待处理通讯录哈希表TargetDirectory为主表,所述待确认关联数据TempLinkCode为从键、其对应的通讯录哈希表为从表;
调用步骤S7,把取出的所述待确认关联数据TempLinkCode按照其种类插入到其对应种类的所述从表中,且记录其在所述从表的索引地址为TempLinkAddress;
b5:带入INDEX作为所述主键在所述主表中的索引地址、TempLinkAddress作为所述从键在所述从表中索引地址,顺序执行以下步骤:在所述从表中建立所述主键和所述从键的索引关系;
在所述主表中建立所述从键和所述主键的索引关系;
b6:重复b4~b5,直至n_Data个所述关联数据LinkCode都被查找完毕;执行步骤b9;
b7:所述待处理关键码TempKeyCode为从键、其对应的所述待处理通讯录哈希表TargetDirectory为从表,所述关联数据LinkCode为主键、其对应的通讯录哈希表为主表;
所述关联数据LinkCode待确认关联数据TempLinkCode;
调用步骤S7,把所述待确认关联数据TempLinkCode插入到所述主表中,且记录其在所述主表的索引地址为TempLinkAddress;
b8:带入TempLinkAddress作为所述主键在所述主表中的索引地址、INDEX作为所述从表在所述从表中的索引地址,顺序执行以下步骤:在所述主表中,建立所述从键和所述主键的索引关系;
在所述从表中,建立所述主键和所述从键的索引关系;
b9:本次关联索引的操作结束。
3.根据权利要求2所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:在所述从表中,建立所述主键和所述从键的索引关系,包括如下步骤:c1:在所述从表中,所述从键对应的所述关联数据地址字段设置为从键关联地址字段;
c2:确认所述从键关联数据地址字段的状态;
如果所述从键关联数据地址字段的状态为:无效,代表所述从键在所述从表中,没有与所述主表中的关键码建立过关联索引,则将所述主键在所述主表中的索引地址存入到所述从键关联数据地址字段中;
执行步骤c4;
否则,代表所述从键在其对应的所述从表中,已经与所述主表中的关键码建立过关联索引,则执行步骤c3;
c3:向用户确认是否要重新建立索引关系;
如果需要重新建立索引关系,则删除现有索引关系,执行步骤c4;
否则执行步骤c5;
c4:在主表中,建立所述从键与所述主键的索引关系;
c5:本次操作结束。
4.根据权利要求2所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:在所述主表中,建立所述从键和所述主键到的索引关系:d1:在所述主表中,将所述主键对应的关联数据地址字段设置为主键关联数据地址字段;
顺序获取所述主键对应的Num个所述主键关联数据地址字段的状态;
d2:确认每一个所述主键关联数据地址字段的状态;
如果所有的所述主键关联数据地址字段的状态都不是无效,则代表所有的所述主键关联数据地址字段都被使用,执行步骤d4;
否则,找到第一个状态为无效的所述主键关联数据地址字段时,停止确认所述主键关联数据地址字段的状态的操作,执行步骤d3;
d3:将所述从键在所述从表中的索引地址存入到此字段中,本次操作结束;
d4:提示用户无法针对所述主键继续添加所述从键,询问客户是否要对所述主键的关联数据进行删除;
如果客户选择是,进入所述主键的管理数据删除流程,本次操作结束;
如果客户选择否,本次操作结束。
5.根据权利要求3所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:步骤c3中,具体包括如下步骤:e1:显示提示信息:该所述从键已经属于其他主键,询问用户是否要修改该从键的关联主键;
如果用户选择:是,则执行步骤e2;
如果用户选择:否,则执行步骤e4;
e2:获取当前所述从键有索引关系的主键,设置为待解除主键;在所述主表中找到所述待解除主键;
e3:在所述待解除主键对应的关联数据地址字段中,检索到所述从键对应的关联数据地址字段,且把其状态设置为:无效;
e4:本次操作结束。
6.根据权利要求1所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:所述通讯录基础哈希表的结构通过数组实现。
7.根据权利要求6所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:所述通讯录数据中包含数据种类n_Class的值为2,所述数据种类包括:联系人姓名、电话号码;所述通讯录哈希表的个数n_Directory为2,所述通讯录哈希表包括联系人姓名哈希表、电话号码哈希表。
8.根据权利要求7所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:所述联系人姓名哈希表中,设哈希表中预计存储的用户个数为X,则所述联系人姓名哈希表的数组元素数量为M:M=(1+x%)*X
式中:x%为根据产品使用环境预设的新增联系人预留率;针对所述联系人姓名哈希表,所述联系人姓名哈希表数组元素数量为M即为其基本容量N。
9.根据权利要求8所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:与所述联系人姓名哈希表对应的所述电话号码哈希表中,所述电话号码哈希表的数组元素量P符合下面的公式:P=M*p
式中:M为所述联系人姓名哈希表的长度,p为一个联系人可拥有电话的最大数量;针对所述电话号码哈希表,所述电话号码哈希表的数组元素量P即为其基本容量N。
10.根据权利要求1所述适用于存储空间受限的设备的通讯录防重构建方法,其特征在于:所述空间预留率y%的取值范围为:20%≤y%≤30%。