用c语言探究冲突处理方法对散列函数平均查找长度的影响规律,给出相应代码及测试数据用例和预期实验结果

时间: 2023-06-19 17:03:36 浏览: 44
散列表是一种用于快速访问数据的数据结构,它通过将数据映射到一个固定范围的索引位置来实现快速访问。散列函数是将数据映射到索引位置的算法,但是当多个数据映射到同一个索引位置时,就会产生冲突。因此,散列函数的冲突处理方法对散列表的性能有很大影响。 常见的冲突处理方法有开放定址法、链地址法和再散列法。开放定址法是在冲突发生时,以一定的步长在散列表中寻找下一个空闲位置。链地址法是将散列到同一位置的数据存储在同一个链表中。再散列法是在冲突发生时,使用另一个散列函数重新计算索引位置。 下面是一份用C语言实现散列表并比较不同冲突处理方法对平均查找长度的影响的代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define TABLE_SIZE 100 #define MAX_LENGTH 20 typedef struct node { char *key; int value; struct node *next; } Node; typedef struct hash_table { Node **table; int size; } HashTable; unsigned int hash(char *str) { unsigned int hash = 5381; int c; while ((c = *str++)) hash = ((hash << 5) + hash) + c; return hash; } Node *create_node(char *key, int value) { Node *node = (Node *) malloc(sizeof(Node)); node->key = key; node->value = value; node->next = NULL; return node; } HashTable *create_table(int size) { HashTable *table = (HashTable *) malloc(sizeof(HashTable)); table->table = (Node **) malloc(sizeof(Node *) * size); table->size = size; for (int i = 0; i < size; i++) table->table[i] = NULL; return table; } void set(HashTable *table, char *key, int value, int method) { unsigned int index = hash(key) % table->size; Node *node = table->table[index]; if (node == NULL) { table->table[index] = create_node(key, value); return; } while (node->next != NULL && strcmp(node->key, key) != 0) node = node->next; if (strcmp(node->key, key) == 0) { node->value = value; return; } Node *new_node = create_node(key, value); if (method == 1) { // 开放定址法 int i = 1; while (node->next != NULL) { index = (hash(key) + i) % table->size; node = table->table[index]; i++; } table->table[index] = new_node; } else if (method == 2) { // 链地址法 node->next = new_node; } else { // 再散列法 unsigned int new_index = (hash(key) * 2 + 1) % table->size; table->table[new_index] = new_node; } } int get(HashTable *table, char *key) { unsigned int index = hash(key) % table->size; Node *node = table->table[index]; while (node != NULL) { if (strcmp(node->key, key) == 0) return node->value; node = node->next; } return -1; } int main() { HashTable *table; char keys[10][MAX_LENGTH] = {"hello", "world", "apple", "banana", "orange", "pear", "watermelon", "grape", "lemon", "peach"}; // 开放定址法 table = create_table(TABLE_SIZE); for (int i = 0; i < 10; i++) set(table, keys[i], i, 1); int sum = 0; for (int i = 0; i < 10; i++) sum += get(table, keys[i]); printf("开放定址法平均查找长度:%f\n", (double) sum / 10); // 链地址法 table = create_table(TABLE_SIZE); for (int i = 0; i < 10; i++) set(table, keys[i], i, 2); sum = 0; for (int i = 0; i < 10; i++) sum += get(table, keys[i]); printf("链地址法平均查找长度:%f\n", (double) sum / 10); // 再散列法 table = create_table(TABLE_SIZE); for (int i = 0; i < 10; i++) set(table, keys[i], i, 3); sum = 0; for (int i = 0; i < 10; i++) sum += get(table, keys[i]); printf("再散列法平均查找长度:%f\n", (double) sum / 10); return 0; } ``` 其中,`set`函数用于插入数据,`get`函数用于查找数据。`method`参数指定了冲突处理方法,1表示开放定址法,2表示链地址法,3表示再散列法。`main`函数测试了三种不同的冲突处理方法,并输出了平均查找长度。 这里给出一个测试数据例子: ``` hello 0 world 1 apple 2 banana 3 orange 4 pear 5 watermelon 6 grape 7 lemon 8 peach 9 ``` 预期实验结果是,开放定址法的平均查找长度应该最小,再散列法的平均查找长度应该略小于链地址法的平均查找长度。但是,这个结果可能会因为数据分布的不同而有所不同。

相关推荐

最新推荐

recommend-type

史上最详细的测试用例的设计方法及案例

思路:输入的集合是无穷的,不能全部都覆盖到等价类:依据需求将输入划分为若干个等价类,从等价类中选出一个测试用例,如果这个测试用例测试通过,则认为所代表的整个等价类测试通过,这样就可以通过较少的测试用例达到...
recommend-type

功能测试用例大全1500条

测试用例的分类 3 文本框需求 4 字段为特殊代码校验: 4 文本框为数值型 4 文本框为日期型 5 文本框为时间型 6 密码框 返回目录 6 单选按钮 7 组合列表框/下拉列表 7 数码框(up-down)控件 8 搜索框填充域测试 8 复...
recommend-type

《软件测试技术》_实验报告_测试用例设计与自动化测试

实验类别:综合性实验 实验目的: 1、 掌握QTP进行功能自动化测试。 2、 掌握LoaderRunner进行性能自动化测试。 3、 掌握其他自动化测试工具。 4、 掌握编写测试报告方法。 实验内容: 实验课前准备一个系统,选择...
recommend-type

性能测试方案及用例.doc

一份实际项目中用于软件项目性能测试方案及用例的模版参考,供有需要的同学参考。如下为部分目录结构: 目 录 1 第一章 引用 1 1.1 编制目的 1 1.2 适用范围 1 1.3 规范性引用资料 1 1.1.1 管理制度 1 1.1.2 ...
recommend-type

【软件测试-实验-4】黑盒测试用例设计(二)

1.掌握黑盒测试用例设计方法; 2.综合运用所学的黑盒测试方法设计进行测试用例设计; 3.掌握测试用例的编写方法。 二. 实验内容 1.使用因果图法对交通一卡通自动充值模拟软件系统进行测试。 基本需求如下: ...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。