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

wordpress super cacheseo关键词优化服务

wordpress super cache,seo关键词优化服务,网页设计与网站建设的理解,百度有做企业网站吗哈希表(散列表)哈希表(散列表):是一种高效的数据结构,通过“键-值”对存储数据,能在平均情况下实现快速的插入、删除和查找操作(时间复杂度接近 O(1))。一、核心原理1.哈…

哈希表(散列表)

        哈希表(散列表):是一种高效的数据结构,通过“键-值”对存储数据,能在平均情况下实现快速的插入、删除和查找操作(时间复杂度接近 O(1))。

一、核心原理

        1.哈希函数:将输入的“键”(Key)转换为一个整数(哈希值),这个整数对应哈希表中的存储位置(索引)。

        例如:用“键”的 ASCII 码之和除以表长取余数,得到索引。

        2.存储结构:哈希表本质是一个数组,哈希值对应数组的索引,“值”(Value)就存在该索引位置。

        3.哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系,这个关系称之为哈希函数。存储数据时,通过对应的哈希函数可以将数据映射到指定的存储位置;查找时,仍可通过该函数找到数据的存储位置。

        4.哈希冲突/哈希矛盾:不同的“键”可能通过哈希函数得到相同的哈希值(冲突)。

二、解决哈希冲突/哈希矛盾的常用方法

链地址法(Chaining)

        1.核心原理:将哈希值相同的冲突元素,通过链表(或其他动态结构,如红黑树)存储在同一个“桶”(哈希表数组的索引位置)中。

        2.存储逻辑 :(1)当插入元素时,先用哈希函数计算键的哈希值,确定对应的桶索引;(2)若该桶为空,直接将元素作为链表头节点存入;(3)若该桶已有元素(发生冲突),则将新元素插入到该桶对应的链表末尾(或头部)。

        3.查找/删除逻辑:先通过哈希值定位到对应桶,再遍历桶中的链表,根据键匹配目标元素。

2. 开放地址法(Open Addressing)

        核心原理:当插入元素发生冲突时,按某种规则(探测序列)在哈希表中寻找下一个空闲位置存储,所有元素都直接存在数组中,不依赖额外数据结构。

两种方法对比:

链地址法开放地址法
存储结构数组+链表(或树)仅数组
空间开销较高(需要存储指针)较低
冲突处理将冲突元素,通过链表(或其他动态结构,如红黑树)存储在同一个“桶”(哈希表数组的索引位置)中。

按探测序列在哈希表中寻找下一个空闲位置存储

常见探测方法:

线性探测,二次探测,双重哈希

删除操作简单:只需从链表中移除节点,无需调整其他元素位置。复杂(需要标记“已删除”)
优点

 处理冲突灵活:冲突元素仅在同一桶的链表中存储,不会影响其他桶,也无需移动已有元素。

        空间利用率高:哈希表容量固定时,链表可动态扩展,适合元素数量不确定的场景(无需预先分配大量空间)。

        删除操作简单:只需从链表中移除节点,无需调整其他元素位置。

 空间效率高:无需存储链表指针,元素直接存在数组中,内存利用率高。

        局部性好:元素存储在连续或邻近的数组位置,缓存命中率高(适合内存受限场景)。

缺点

  额外空间开销:需要存储链表节点的指针/引用,空间利用率略低于开放地址法。

        极端情况效率退化:若哈希函数不佳,某一链表过长(如所有元素哈希到同一桶),查找效率会从 O(1) 退化到 O(n)(可通过链表转红黑树等优化,如 Java HashMap)。

 删除复杂:不能直接删除元素(否则会断裂探测序列),需标记为“已删除”,后续插入可复用该位置,但会影响查找效率。

        聚集效应:线性探测易导致冲突元素集中在某一区域(如插入多个元素后,连续索引被占用),使探测序列变长,效率退化。

        容量限制:哈希表装满后无法插入新元素(需提前扩容,且扩容成本高)

下面使用链地址法实现:1. 创建哈希表 2. 设计哈希函数 3. 插入数据 4. 查找数据 5. 销毁哈希表
6. 遍历

hash.h

#ifndef __HASH_H__
#define __HASH_H__#define HASH_TABLE_MAX_SIZE 27typedef struct per
{char name[32];char tel[32];
}Data_type_t;typedef struct node
{Data_type_t data;struct nod *pnext;
}HSNode_t;

hash.c

#include "hash.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief 哈希函数,根据字符计算哈希地址* @param key 用于计算哈希地址的字符(通常是姓名的首字母)* @return 计算得到的哈希地址(索引值)* @note 字母字符返回对应的0-25索引(a/A对应0,b/B对应1...z/Z对应25),*       非字母字符返回哈希表最大容量减1的索引*/
int hash_function(char key)
{// 处理小写字母if (key >= 'a' && key <= 'z'){return key - 'a';}// 处理大写字母else if (key >= 'A' && key <= 'Z'){return key - 'A';}// 处理非字母字符else{return HASH_TABLE_MAX_SIZE - 1;}
}/*** @brief 向哈希表中插入数据* @param hash_table 哈希表(二级指针,指向指针数组)* @param data 要插入的数据(包含姓名和电话信息)* @return 0表示插入成功,-1表示内存分配失败* @note 插入采用链表头插法的变种,会保持链表内数据按姓名升序排列*/
int insert_hash_table(HSNode_t **hash_table, Data_type_t data)
{// 计算插入位置(哈希地址)int addr = hash_function(data.name[0]);// 申请新节点保存数据HSNode_t *pnode = malloc(sizeof(HSNode_t));if (NULL == pnode){printf("malloc error\n");return -1;}// 初始化新节点数据pnode->data = data;pnode->pnext = NULL;// 若当前哈希地址对应的链表为空,直接插入if (NULL == hash_table[addr]){hash_table[addr] = pnode;}// 若链表非空,按姓名升序插入到合适位置else{// 新节点姓名小于等于头节点姓名,插入到链表头部if (strcmp(pnode->data.name, hash_table[addr]->data.name) <= 0){pnode->pnext = hash_table[addr];hash_table[addr] = pnode;}// 否则找到合适位置插入到链表中间或尾部else{HSNode_t *p = hash_table[addr];// 遍历链表,找到第一个比新节点姓名大的节点的前一个位置while (p->pnext != NULL && strcmp(p->pnext->data.name, pnode->data.name) < 0){p = p->pnext;}// 插入新节点pnode->pnext = p->pnext;p->pnext = pnode;}}return 0;
}/*** @brief 遍历哈希表并打印所有数据* @param hash_table 哈希表(二级指针,指向指针数组)* @note 按哈希地址顺序遍历,每个地址对应的链表数据会依次打印,地址间用空行分隔*/
void hash_for_each(HSNode_t **hash_table)
{// 遍历哈希表所有地址for (int i = 0; i < HASH_TABLE_MAX_SIZE; ++i){HSNode_t *ptmp = hash_table[i];// 遍历当前地址对应的链表while (ptmp){printf("%s : %s\n", ptmp->data.name, ptmp->data.tel);ptmp = ptmp->pnext;}// 每个地址的链表打印完后换行printf("\n");}
}/*** @brief 在哈希表中查找指定姓名的数据* @param hash_table 哈希表(二级指针,指向指针数组)* @param name 要查找的姓名* @return 找到的节点指针,未找到返回NULL* @note 先通过首字母计算哈希地址,再在对应链表中查找*/
HSNode_t *find_hash_table(HSNode_t **hash_table, char *name)
{// 计算查找的哈希地址(根据姓名首字母)int addr = hash_function(name[0]);// 在对应链表中遍历查找HSNode_t *ptmp = hash_table[addr];while (ptmp){// 比较姓名,相等则找到if (0 == strncmp(ptmp->data.name, name, strlen(name))){return ptmp;}ptmp = ptmp->pnext;}// 未找到return NULL;
}/*** @brief 销毁哈希表,释放所有动态分配的内存* @param hash_table 哈希表(二级指针,指向指针数组)* @note 逐个释放每个哈希地址对应的链表中的所有节点*/
void destroy_hash_table(HSNode_t **hash_table)
{// 遍历所有哈希地址for (int i = 0; i < HASH_TABLE_MAX_SIZE; i++){HSNode_t *pdel = hash_table[i];// 释放当前地址链表中的所有节点while (hash_table[i] != NULL){hash_table[i] = pdel->pnext; // 移动头指针到下一个节点free(pdel);                  // 释放当前节点pdel = hash_table[i];        // 更新待释放节点指针}}
}

main.c

#include<stdio.h>
#include"hash.h"int main(void)
{Data_type_t pers[5] = {{"zhangsan","110110"},{"lisi","120120"},{"wanger","119119"},{"zhaowu","122122"},{"maliu","10086"}};HSNode_t *hash_table[HASH_TABLE_MAX_SIZE] = {NULL};insert_hash_table(hash_table, pers[0]);insert_hash_table(hash_table, pers[1]);insert_hash_table(hash_table, pers[2]);insert_hash_table(hash_table, pers[3]);insert_hash_table(hash_table, pers[4]);}
http://www.dtcms.com/a/558559.html

相关文章:

  • Python---数据容器( tuple 元组)
  • 微信小程序在哪里找?seo联盟怎么赚钱
  • Windows上使用WSL2创建Ubuntu系统,实现无缝高效开发的体验
  • 好的活动策划网站华为荣耀官网手机旗舰店
  • Arthas工具快速使用
  • 网站建设要实现的目标外贸添加外链网站
  • psd简单的网站首页wordpress简单统计插件
  • 【AI基础篇】微积分在AI中的核心作用与应用浅析
  • 做网站卖机器怎么弄新能源汽车价格表
  • 免费舆情信息网站网站开发需要掌握的知识
  • 推广网站软文高德地图是国产软件吗
  • 威海网站建设兼职郑州模板建站哪家好
  • 土豆做视频在线观看网站网站建设的多吗
  • 电子商务网站建设摘要旅游做义工的同城网站
  • 网站开发建设费用包括那些郑州高端网站建设哪家好
  • 网站开发税率是多少wordpress选定文字标红
  • dummy|trick
  • 计算机软件开发网站建设取什么名字手机怎样下载安装建设银行网站
  • FreeRTOS 学习:(七)FreeRTOS 中相关的 API 函数的命名规则
  • 如何用博客网站做cpa网站建设哪家公司好网站建设
  • 自动化测试的使用场景有哪些?
  • 安徽哪家公司做网站比较好淘宝上网站开发退款
  • view()与transpose()函数使用注意事项
  • WHAT - 前端自动化测试系列(二)
  • 【代数学】置换群的正规子群与猜拳游戏
  • 南京做网站南京乐识权威京东购物网站怎么做
  • 3.5 介质访问控制【2010统考真题】
  • 网站导航条用什么做邢台123最新事件
  • 网站建设模板免费下载万联芯城网站建设
  • 电商网站 性能目标有哪些桂阳网站制作