映射单词至哈希表及其负载率和链数分析

版权申诉
0 下载量 119 浏览量 更新于2024-10-03 收藏 42KB RAR 举报
资源摘要信息:"Ch3_4.rar_The Chain" 知识点一:哈希表基础概念 哈希表(Hash Table)是一种通过哈希函数来访问的数据结构,它允许快速插入和查找数据。哈希函数能够将输入(如单词、数字等)转换成一个固定范围内的索引值,该索引值指向哈希表中的一个位置,称为“槽”(Slot)。每个槽可以存储一个数据项或者指向一个数据项链表的指针。哈希表的性能取决于哈希函数的质量和负载因子(Load Factor)。 知识点二:负载因子 Load Factor 负载因子是哈希表中元素数量与槽数量之比,用来衡量哈希表的使用程度。计算公式为: 负载因子 = 哈希表中元素数量 / 槽数量 当负载因子较低时,哈希表中大部分槽可能为空,导致存储空间的浪费;而当负载因子过高时,可能会引起较多的冲突,即不同的键值通过哈希函数映射到同一个槽上,导致性能下降。因此,合理控制负载因子是哈希表设计中的重要考量。 知识点三:槽占有率 Slot Share 槽占有率是指哈希表中被占用的槽占总槽数的比例。它与负载因子紧密相关,但侧重于描述槽的占用情况。通过计算槽占有率,可以直观地了解哈希表中被使用的存储空间的比例。 知识点四:链数 Chain Count 链数指每个槽上挂接的链表长度,即同一个槽中存储的不同元素的数量。在哈希表中,如果哈希函数设计得不够好或者负载因子过高,可能会导致大量元素映射到同一个槽,形成较链表。链数的增加会降低哈希表的查找效率,因为这实际上变成了在链表中进行线性搜索。 知识点五:哈希冲突解决策略 由于哈希函数无法保证所有输入都能映射到不同的槽中,哈希冲突是不可避免的。常见的冲突解决策略包括开放寻址法(如线性探测、二次探测、双散列)和链地址法(即每个槽上挂一个链表)。本程序通过输出每个槽的链数,反映了哈希表中冲突的分布情况和冲突解决策略的有效性。 知识点六:哈希表的动态扩展 当哈希表中元素数量持续增加,负载因子随之增大,为了保持良好的性能,需要对哈希表进行动态扩展,即创建一个新的更大的哈希表,并将原表中的所有元素重新哈希到新表中。动态扩展需要精心设计,以避免在扩展过程中影响到哈希表的正常访问。 知识点七:程序实现细节 从描述中可以推断,Ch3_4程序应该包含以下几个关键步骤: 1. 将单词映射到哈希表上,这涉及到对单词应用哈希函数,并将结果存储在哈希表的相应槽中。 2. 计算并打印哈希表的负载因子、槽占有率,以及每个槽上的链数。这些数据能够帮助开发者了解哈希表的当前状态,并评估其性能。 3. 为了实现这些功能,程序中需要实现哈希函数、冲突解决策略以及哈希表的动态扩展机制。 通过以上知识点的介绍,我们可以深入理解哈希表的设计与实现细节,以及如何通过程序来评估和优化哈希表的性能。

void PWM_THREAD(void* arg) { uint16_t t = 0; uint16_t key = 0; adc_init(); /* 初始化ADC */ chanl_init(); atmr_tmrx_npwm_chy_init(AUTOLOAD - 1, PRE_DIVIDER - 1); /* 初始化高级定时器PWM输出模式 */ dsp_mos_init(); dsp_rd_init(); DSP_MOS1(1); DSP_MOS2(1); DSP_MOS3(1); DSP_MOS4(1); Temp_data.pwm_ch=5; Temp_data.pwmdutyr=AUTOLOAD/4; // Temp_data.mos_ch = 2; Temp_data.mos_enable = 1; while (1) { osMutexAcquire(tempmutex,osWaitForever); key++; /* 输出5个PWM波(控制TMR8_CH1, 即PC6输出5个脉冲) */ t++; osDelay(1); if (t >= 10) /* 控制LED0闪烁, 提示程序运行状态 */ { t = 0; atmr_tmrx_npwm_chy_set(100); /* 高级定时器设置输出PWM个数 最多255个*/ } if(key>2000) { key=0; if(Temp_data.pwm_ch > 5) Temp_data.pwm_ch=0; Temp_data.tempmax = Temp_data.test_temp[0]; for(uint8_t i =0;i<8;i++) { if(Temp_data.test_temp[i]>Temp_data.tempmax) Temp_data.tempmax = Temp_data.test_temp[i]; } if(Temp_data.receivebuf[1]==WRITEDUTYR||(dutyr>0&&dutyr<AUTOLOAD)) { sutyrcrc = crc16_modbus(Temp_data.receivebuf,6); dutyrcrc_H = (uint16_t)((sutyrcrc&0xFF00)>>8); dutyrcrc_L = (uint16_t)(sutyrcrc&0x00FF); if((dutyrcrc_H == Temp_data.receivebuf[6])&&(dutyrcrc_L == Temp_data.receivebuf[7])) { pwmdutyr_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); pwmdutyr_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.pwmdutyr = (pwmdutyr_H<<8)|pwmdutyr_L; if(Temp_data.pwmdutyr>AUTOLOAD) { Temp_data.pwmdutyr=AUTOLOAD; } if(Temp_data.pwmdutyr==0) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; } pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(dutyr>0&&dutyr<AUTOLOAD) { Temp_data.pwmdutyr = dutyr; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } } else { if(Temp_data.tempmax>25) { Temp_data.pwmdutyr = (uint32_t)(Temp_data.tempmax*2); pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax<25) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax>50) { Temp_data.pwmdutyr = AUTOLOAD; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } // Temp_data.pwm_RD[Temp_data.pwm_ch-1] = readfault_channel(Temp_data.pwm_ch); } readRD(Temp_data.pwm_RD); } osMutexRelease(tempmutex); } },解析这段代码

2023-07-15 上传
2023-06-06 上传