当前位置: 首页 > wzjs >正文

西安php网站开发培训班电脑优化是什么意思

西安php网站开发培训班,电脑优化是什么意思,黄金软件免费下载,网站建设怎么学哈希表的定义 哈希表(Hash Table)是一种基于哈希函数实现的高效数据结构,用于存储键值对(Key-Value)。它通过哈希函数将键(Key)映射到一个较小范围的整数值(通常是数组的索引&#…
哈希表的定义

哈希表(Hash Table)是一种基于哈希函数实现的高效数据结构,用于存储键值对(Key-Value)。它通过哈希函数将键(Key)映射到一个较小范围的整数值(通常是数组的索引),从而快速定位存储位置。哈希表的核心在于通过哈希函数实现快速的插入、查找和删除操作,其平均时间复杂度接近 O(1),在处理大量数据时表现出极高的效率。

线性探测的定义

线性探测(Linear Probing)是解决哈希冲突的一种方法。当多个键通过哈希函数映射到同一个位置时,会发生冲突。线性探测通过依次检查后续位置(即线性地向后探测)来解决冲突。具体来说,如果位置 i 被占用,则检查位置 i+1,如果仍然被占用,则检查 i+2,依此类推,直到找到一个空闲位置来存储数据。

线性探测的特点
  1. 高效性

    • 哈希表的插入、查找和删除操作的平均时间复杂度接近 O(1),在数据量较大时,性能优势明显。

    • 线性探测通过简单的线性扫描解决冲突,实现逻辑简单,易于理解。

  2. 动态性

    • 哈希表可以根据数据量动态调整大小。当负载因子(即表中已存储的元素数量与表容量的比值)达到一定阈值时,可以通过扩容操作增加表的容量,从而保持高效的性能。

      • 聚集问题

        线性探测的一个主要缺点是容易产生聚集(Clustering)。当多个键映射到相邻的位置时,线性探测会导致大量连续的位置被占用,从而增加后续插入和查找的开销。

      • 例如,如果多个键映射到同一个位置,线性探测会依次检查后续位置,导致大量连续的位置被占用,形成“聚集”。

  3. 简单性

    • 线性探测的实现逻辑简单,不需要复杂的数学运算或额外的数据结构支持。它通过简单的线性扫描解决冲突,易于实现和维护。

线性探测的实现

以下是线性探测在哈希表中的实现逻辑:

  1. 插入操作

    • 计算键的哈希值,确定初始位置。

    • 如果该位置已被占用,则依次检查后续位置,直到找到空闲位置。

    • 将键值对存储到空闲位置,并更新表的大小。

  2. 查找操作

    • 计算键的哈希值,确定初始位置。

    • 如果该位置的键与目标键不匹配,则依次检查后续位置,直到找到目标键或空闲位置。

  3. 删除操作

    • 查找目标键的位置。

    • 删除目标键。

负载因子

负载因子(Load Factor)是衡量哈希表使用效率的一个重要指标,它定义为哈希表中已存储的元素数量与哈希表总容量的比值。负载因子的计算公式为:

负载因子=哈希表的总容量  /   已存储的元素数量​。

对于插入查找删除来说,都会涉及到向哈希数组后进行查找,负载因子小的时候,查找到的空白格快,所以我们会关注哈希表中的负载因子和容量。

下面是C语言实现的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct hashtab
{int *date;//数组指针int size;//现有数据的量int hk;//哈希函数double a;//负载因子int capacity;//总容量大小
}HASH;
HASH* hash_init(int Capacity,double a1);
int add(HASH *hash,int num);
int delete(HASH *hash,int num);
int serch(HASH *hash,int num);
int isfull(HASH *hash);
void expand(HASH *hash);
int main(int argc, char const *argv[])
{HASH *hash=hash_init(5,0.6);add(hash,1);add(hash,4);add(hash,14);add(hash,15);add(hash,11);add(hash,3);add(hash,10);add(hash,19);add(hash,13);add(hash,16);add(hash,22);add(hash,17);add(hash,26);add(hash,18);return 0;
}
HASH* hash_init(int Capacity,double a1)
{HASH *hash=malloc(sizeof(HASH));hash->hk=Capacity;//对13取余hash->size=0;hash->capacity=Capacity;hash->date=malloc(sizeof(int)*hash->capacity);memset(hash->date,-1,sizeof(int)*hash->capacity);hash->a=a1;return hash;
}
int add(HASH *hash,int num)
{printf("尝试存储%d: cap=%d\n", num,  hash->capacity);if (isfull(hash)==1)//如果负载因子超过目标值{expand(hash);//扩容}int pos=num%hash->hk;//取余作为哈希哈数int i=pos;if (hash->date[i]==-1)//如果目标位置没有数值,则则直接插入{hash->date[i]=num;hash->size++;printf("存储成功,size:%d\n",hash->size);return 1;}else//目标位置有数值,向下寻找空位置{do{if (hash->date[i]==-1){hash->date[i]=num;hash->size++;printf("存储成功,size:%d\n",hash->size);return 1;}i=(i+1)%hash->hk;}while (i!=pos);//直到回到原位停止,表示没有空位,无法插入    }return -1;
}
int delete(HASH *hash,int num)
{int pos=num%hash->hk;//取余后的位置int i=pos;do//原位置是该数据则直接删除,如果没有就向后寻找{if (hash->date[i]==-1)return -1;if (hash->date[i]==num){hash->date[i]=-1;hash->size--;return 1;}i=(i+1)%hash->hk;}while (i!=pos);//如果本位置没有return -1;
}
int serch(HASH *hash,int num)
{int pos=num%hash->hk;//取余后的位置int i=pos;do//原位置是该数据则直接返回,如果没有就向后寻找{if (hash->date[i]==-1)return -1;if (hash->date[i]==num){return i;}i=(i+1)%hash->hk;}while (i!=pos);//如果本位置没有return -1;
}
int isfull(HASH *hash)
{double s=(double) hash->size/hash->capacity;//实际负载因子return s >= hash->a ? 1 : 0;//如果大于目标负载因子,返回1
}
void expand(HASH *hash) {int old_capacity = hash->capacity;int *old_date = hash->date;hash->capacity *= 2;hash->hk = hash->capacity; // 更新哈希函数参数hash->date = malloc(sizeof(int) * hash->capacity);memset(hash->date, -1, sizeof(int) * hash->capacity);//重新分配空间hash->size=0;// 重新插入所有元素,手动更新sizefor (int i = 0; i < old_capacity; i++) {if (old_date[i] != -1) //旧数组位置不为空{int pos = old_date[i] % hash->hk;int j = pos;while (hash->date[j] != -1) {j = (j + 1) % hash->hk;}//找到可以插入的位置hash->date[j] = old_date[i];//插入hash->size++;//更新大小}}printf("扩容,新容量:%d\n", hash->capacity);free(old_date);//释放旧空间
}

运行结果:

因为我们的大小更新是在插入以后,所以对负载因子的计算是之后一次的。

本结果主要关注扩容,大家可以试一下其他功能。


文章转载自:

http://ZpWDj9Bt.hxfrd.cn
http://D5YeLtfc.hxfrd.cn
http://tIVFuAjw.hxfrd.cn
http://0clqgCPq.hxfrd.cn
http://Kzoipz9C.hxfrd.cn
http://eKnAFgBq.hxfrd.cn
http://k94sqyxA.hxfrd.cn
http://AQNL5QWo.hxfrd.cn
http://MouSfMhp.hxfrd.cn
http://SLzQnONT.hxfrd.cn
http://CzskKEOy.hxfrd.cn
http://fprsUQ07.hxfrd.cn
http://fMeWY0zN.hxfrd.cn
http://zMNfGY9w.hxfrd.cn
http://DOxhVESp.hxfrd.cn
http://01ZFj9dH.hxfrd.cn
http://elBLHCcu.hxfrd.cn
http://Nm3ikaVE.hxfrd.cn
http://qxyIuVZx.hxfrd.cn
http://pKaELPXD.hxfrd.cn
http://k45013d1.hxfrd.cn
http://Lw7gO4jb.hxfrd.cn
http://m6bZ5opv.hxfrd.cn
http://MgQ62gBp.hxfrd.cn
http://BlST3U8h.hxfrd.cn
http://69lYrIpF.hxfrd.cn
http://llDeKeB1.hxfrd.cn
http://IdKBEii2.hxfrd.cn
http://axDca1wc.hxfrd.cn
http://JOSuYt7D.hxfrd.cn
http://www.dtcms.com/wzjs/715266.html

相关文章:

  • 做网站公司的收费多少北辰天津网站建设
  • 网站平台多少钱山东省最新消息今天
  • 学校网站建设情况介绍会员系统免费版
  • 绵阳新农网的网站是哪个公司做的wordpress首页调用最新文章
  • 建设部网站在哪里看受理做名片上什么网站
  • 佛山顺德网站制作公司哪家好制作ppt的软件手机
  • 公司中英文网站锦绣大地seo
  • 江门专用网站建设建立选区的快捷键
  • 做爰全过程免费的视频网站有声音第四性 wordpress
  • 电商网站建设实训报告心得h5页面制作工具包括
  • 郑州网站建设包括哪些wordpress 开发 表单
  • 如何让公司网站网站建设公司固定ip
  • 钦州市建设网站php综合网站建设论文
  • 做网站卖产品网页制作和网站建设的区别
  • 电商主图设计网站温州在线课堂
  • 临沂做网站价格wordpress禁止ip访问
  • 安徽建设厅网站地址网站开发亿码酷负责
  • 武清网站建设公司怎么用wordpress修改网站源码
  • 盘锦企业网站建设做智能网站系统下载地址
  • 动画设计招聘seo优化官网
  • 高校门户网站建设问题海曙网站设计建设
  • 江西做网站莆田外贸专业建站
  • 手机网站开发公司哪家好顺义广州网站建设
  • 网站的设计页面景区网站建设的意义
  • 网站做多大尺寸网站设计 价格
  • 河北网站建设有限公司如何做seo优化
  • Delphi 网站开发框架四平做网站佳业首页
  • 小程序开发 网站建设株洲高端网站建设工作室
  • 银川哪家网站建设专业xampp里wordpress安装教程
  • 国家网站建设上海建筑设计研究院