设计散列表,实现电话号码查找系统。设电话号码簿长度为n(0≤n≤10000),系统应该实现如下工作: ⑴ 电话号码簿保存在磁盘文件中,每一条电话号码记录包含数据项:编号(唯一),用户名,通信地址,电话号码(手机号) ⑵ 创建散列表:系统运行时,读取磁盘文件的电话号码,构建散列表,用于查询。要求:自选散列函数(至少2种),自选解决冲突的方法(至少2种),分别以电话号码和用户名为关键字,建立散列表。 ⑶ 查询:根据输入的用户名,查找并显示给定用户的信息。
时间: 2024-02-23 14:57:22 浏览: 108
好的,这是一个非常具体的问题,我会尽力回答。首先,散列表是一种用于在数据集中快速查找数据的数据结构。它是由一个数组和一个哈希函数组成的。哈希函数将每个数据元素的键映射到数组中的一个位置。当查找一个元素时,哈希函数将该元素的键映射到对应的位置,并检查该位置上是否存在该元素。如果存在,则返回该元素的值;否则,返回未找到的值。
在本例中,我们可以使用电话号码或用户名作为键。构建散列表的过程包括以下步骤:
1. 从磁盘文件中读取电话号码记录。
2. 对于每个记录,计算它的哈希值,并将它存储在散列表的相应位置。
3. 如果发现冲突,使用选定的解决冲突方法将记录存储在散列表的下一个空闲位置。
4. 存储完所有记录后,散列表就被构建好了。
下面我们来讨论两种不同的哈希函数和解决冲突方法。
1. 哈希函数:
我们可以选择两种不同的哈希函数:
a. 直接定址法:此方法简单地将键值的某个部分作为散列地址。例如,如果我们选择将电话号码的前三个数字作为散列地址,那么电话号码“13812345678”将被映射到散列地址“138”。
b. 除留余数法:该方法取键值除以某个数的余数作为散列地址。例如,如果我们选择将电话号码除以10000的余数作为散列地址,那么电话号码“13812345678”将被映射到散列地址“5678”。
2. 解决冲突方法:
我们可以选择两种不同的解决冲突方法:
a. 线性探测法:该方法在哈希表的下一个空位置中查找,直到找到一个空位置为止。例如,如果我们发现散列地址“138”已经被占用,那么我们将查找散列地址“139”,“140”以此类推,直到找到一个空位置。
b. 链地址法:该方法在哈希表的每个桶中维护一个链表。例如,如果我们发现散列地址“138”已经被占用,那么我们将在该位置的链表中添加一个新节点。
在这个电话号码查找系统中,我们将使用两个散列表,分别以电话号码和用户名作为键。对于每个散列表,我们可以选择不同的哈希函数和解决冲突方法。
当查询一个用户时,我们将输入其用户名,并使用哈希函数计算出其散列地址。然后,我们检查该地址上是否存在该用户。如果存在,我们将返回该用户的信息;否则,返回未找到的值。
希望这个回答对你有所帮助!
阅读全文