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

Linux学习-数据结构(哈希表)

1.哈希表

1.哈希算法

将数据通过哈希算法映射成一个关键值,存放都在同一位置实现数据的高效存储和查找,将时间复杂度尽可能降低至O(1)

2.哈希碰撞

多个数据通过哈希算法得到的键值相同,称为产生哈希碰撞

3.哈希表

  • 构建哈希表存放0-100之间的数据
  • 哈希算法选择:

1.将0-100之间的数据的个位作为键值

4.哈希表的实现

1.元素插入

int insert_data_hashtable(int tmpdata)
{hashnode **pptmpnode = NULL;hashnode *pnewnode = NULL;int key = 0;key = tmpdata % INDEX;for(pptmpnode = &(phashtable[key]); *pptmpnode != NULL && (*pptmpnode)->data < tmpdata; pptmpnode = &(*pptmpnode)->pnext){}pnewnode = malloc(sizeof(hashnode));if(pnewnode == NULL){perror("fail to malloc");return -1;}pnewnode->data = tmpdata;pnewnode->pnext = *pptmpnode;*pptmpnode = pnewnode;return 0;
}

2.遍历

int show_data_hashtable(void)
{int i = 0;hashnode *ptmpnode = NULL;for(i = 0; i < INDEX; i++){printf("%d:", i);ptmpnode = phashtable[i];while(ptmpnode != NULL){printf("%-2d ", ptmpnode->data);ptmpnode = ptmpnode->pnext;}printf("\n");}return 0;
}

3.元素查找

hashnode *find_data_hashtable(int tmpdata)
{int key = 0;hashnode *ptmpnode = NULL;key = tmpdata % INDEX;ptmpnode = phashtable[key];while(ptmpnode != NULL && ptmpnode->data <= tmpdata){if(ptmpnode->data == tmpdata){return ptmpnode;}ptmpnode = ptmpnode->pnext;}

4.销毁

int destroy_hashtable(void)
{int i = 0;hashnode *ptmpnode = NULL;hashnode *pfreenode = NULL;for(i = 0; i < INDEX; i++){ptmpnode = phashtable[i];pfreenode = phashtable[i];while(ptmpnode != NULL){ptmpnode = ptmpnode->pnext;free(pfreenode);pfreenode = ptmpnode;}phashtable[i] = NULL;}return 0;
}

2.排序和查找算法

1.冒泡排序

  • 时间复杂度o(n^2)
  • 相邻两个元素比较,大的向后走,小的向前走

2.选择排序

  • 时间复杂度o(n^2)
  • 从前到后找最小值与前面的元素交换
  • 找到 len-1个最小值,最后一个最大值即排序完成

3.插入排序

  • 时间复杂度o(n^2),如果数组有序时间复杂度降低至o(n)
  • 将数组中的每个元素插入到有序数列中
  • 先将要插入的元素取出,依次和前面元素比较,比元素大的向后走,直到前一个元素比要插入的元素小,或者到达有序数列开头为止

4.希尔排序

  • 时间复杂度o(nlogn)
  • 通过选择不同的步长,将数组拆分成若干个小的数组实现插入排序
  • 若干个小的数组成为有序数列后,使得数组的数据大致有序
  • 最后再对整体完成一次插入排序

5.快速排序

  • 时间复杂度o(nlogn)
  • 选择左边的作为键值,从后面找一个比键值小的放前面,从前面找一个比键值的放后面,键值放中间
  • 左右两边有元素则递归调用

6.折半查找(二分查找)

int mid_search(int *parray, int low, int high, int tmpdata)
{int mid = 0;if (low > high){return -1;}mid = (low + high) / 2;if (tmpdata == parray[mid]){return mid;}else if (tmpdata > parray[mid]){return mid_search(parray, mid+1, high, tmpdata);}else if (tmpdata < parray[mid]){return mid_search(parray, low, mid-1, tmpdata);}
}

http://www.dtcms.com/a/320610.html

相关文章:

  • K8s 常见故障案例分析
  • Axure基于中继器实现的组件库(导航菜单、动态表格)
  • k8s调度问题
  • 实战:在已有K8S集群如何新增和删除Node节点
  • 【网络自动化】利用Python脚本与计划任务,实现H3C/HPE设备配置无人值守备份
  • 冰蝎--安装、使用
  • BOM(物料清单)详解:定义、类型、差异与作用
  • 【跨国数仓迁移最佳实践5】MaxCompute近线查询解决方案助力物流电商等实时场景实现高效查询
  • Python 属性描述符(方法是描述符)
  • MySQL 配置性能优化赛:核心策略与实战技巧
  • 新客户 | TDengine 时序数据库是怎么在钢厂“撬动”PI 的?
  • [Flutter] v3.24 AAPT:错误:未找到资源 android:attr/lStar。
  • 详解 Seaborn:让数据可视化更简单高效的 Python 库
  • 使用Python爬虫,selenium能否替代requests?
  • centos出现ping: baidu.com: 未知的名称或服务问题
  • 每日五个pyecharts可视化图表:条形图与关系图
  • 【Centos】Redis 单机部署图文步骤
  • Vue3 基本语法
  • 《从零构建大语言模型》学习笔记2,文本数据处理1(以及tiktoken库无法下载gpt2参数,调用get_encoding时SSL超时的解决方法)
  • 【lucene】PostingsEnum.freq()
  • CVRF 是什么?微软弃用 MS 编号后,网络安全的下一个标准
  • C/C++与JavaScript的WebAssembly协作开发指南
  • 电脑定时开关机终极指南
  • 2025小程序怎么快速接入美团核销,实现自动化核销
  • PeiQi网络安全知识文库PeiQi-WIKI-Book保姆式搭建部署教程
  • sqli-labs通关笔记-第38关 GET字符型堆叠注入(单引号闭合 手工注入+脚本注入两种方法)
  • 欧拉角、四元数与旋转矩阵的C语言转换实现
  • 《论文阅读》传统CoT方法和提出的CoT Prompting的区分
  • 手搓MCP全流程指南:从本地开发部署到PyPI公开发布
  • 自由学习记录(79)