news 2026/8/21 8:03:53

数据结构:哈希表 算法相关 排序算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构:哈希表 算法相关 排序算法

八、哈希表

哈希存储

将要存储数据的关键字和春初位置之间建立对应映射关系,

存储数据时,按照映射关系寻找存储位置;

查找数据,根据关键字和映射关系,寻找原数据的存储位置

映射关系称为哈希函数(散列函数)

目的:提高查找效率

f(key)=key%10:求余法

f(key)=a*key+b:一次函数法

哈希冲突/哈希矛盾:

key1!=key2

f(key1)==f(key2)

解决哈希冲突的方法:

1.开放定址法

2.链地址法

API:

1.创建哈希表

Node_t *hash_table[HASH_SIZE]={NULL};

2.设计哈希函数

int hash_function(char ch) { if(ch>='a' && ch<='z') { return ch-'a'; } if(ch>='A' && ch<='Z') { return ch-'A'; } else { return HASH_SIZE-1; } }

3.哈希表数据插入

int insert_hash_table(Node_t **hash_table,Data_t data) { int addr=hash_function(data.name[0]); Node_t *pnode=malloc(sizeof(Node_t)); if(NULL==pnode) { printf("malloc error\n"); return -1; } pnode->data=data; pnode->pnext=NULL; pnode->pnext=hash_table[addr]; hash_table[addr]=pnode; return 0; }

4.哈希表的查找

Node_t *find_hash(Node_t **hash_table,char *pname) { int addr=hash_function(pname[0]); Node_t *ptmp=hash_table[addr]; while(ptmp!=NULL) { if(strcmp(pname,ptmp->data.name)==0) { return ptmp; } ptmp=ptmp->pnext; } return NULL; }

5.销毁哈希表

void destory_hash(Node_t **hash_table) { for(int i=0;i<HASH_SIZE;++i) { Node_t *ptmp=hash_table[i]; while(ptmp!=NULL) { hash_table[i]=ptmp->pnext; free(ptmp); ptmp=hash_table[i]; } } }

6.遍历哈希表

void show_hash(Node_t **hash_table) { for(int i=0;i<HASH_SIZE;++i) { Node_t *ptmp=hash_table[i]; while(ptmp!=NULL) { printf("%s,%s\n",ptmp->data.name,ptmp->data.tel); ptmp=ptmp->pnext; } printf("\n"); } }

九、算法相关

程序设计=数据结构+算法

算法:解决特定问题的步骤

算法的设计,
1.正确性,
2.可读性,高内聚 低耦合
3.健壮性,输入非法数据,能进行相应的处理,而不是产生异常
4.高效率(时间复杂度)
5.低存储(空间复杂度)
空间复杂度:算法执行过程中额外开辟的空间随数据量n的变化关系。
O(1)
O(n)

时间复杂度
执行这个算法所花时间的度量
将数据量增长和时间增长用函数表示出来,这个函数就叫做时间复杂度。

一般用大o表示法:O(n) 时间复杂度是关于数据n的一个函数随着n的增加,时间复杂度增长较慢的算法时间复杂度低
时间复杂度的计算规则
1,用常数1 取代运行时间中的所有加法常数
2,在修改后的运行函数中,只保留最高阶项。
3,如果最高阶存在且系数不是1,则去除这个项相乘的常数。

排序算法
1.选择排序
2 冒泡排序
3.插入排序(稳定算法)

时间复杂度O(n^2)

空间复杂度O(1)

int a[10]={0,1,2,3,-4,-5,6,-7,8,9}; int tmp,i,j; for(i=1;i<10;++i) { tmp=a[i]; j=i; while(j>0 && tmp<a[j-1]) { a[j]=a[j-1]; --j; } a[j]=tmp; }

4.希尔排序(不稳定)

时间复杂度O(nlogn)~ O(n^2)

空间复杂度O(1)

int inc=0,i=0,j=0,tmp=0; for(inc=len/2;inc>0;inc/=2) { for(i=inc;i<len;++i) { tmp=a[i]; j=i; while(j>=inc && tmp<a[j-inc]) { a[j]=a[j-inc]; j-=inc; } a[j]=tmp; } }

5.快速排序(不稳定)

时间复杂度O(nlogn)

空间复杂度O(logn)~O(n)

void quick_sort(int *a,int begin,int end) { if(begin>=end) { return ; } int i=begin; int j=end; int key=a[i]; while(i<j) { while(i<j && key<=a[j]) { --j; } a[i]=a[j]; while(i<j && key>=a[i]) { ++i; } a[j]=a[i]; } a[i]=key; quick_sort(a, i+1, end); quick_sort(a, begin, i-1); }

6.二分查找

前提条件:序列有序

时间复杂度:O(logn)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 8:03:51

影刀RPA三大逻辑结构实战:顺序、分支与循环详解

你是不是觉得RPA&#xff08;机器人流程自动化&#xff09;听起来很酷&#xff0c;但一看到“逻辑”、“流程控制”这些词就有点发怵&#xff1f;觉得那是程序员才需要懂的东西&#xff0c;自己零基础根本玩不转&#xff1f; 别担心&#xff0c;这正是绝大多数RPA新手&#xf…

作者头像 李华
网站建设 2026/8/21 8:01:41

数学建模竞赛获奖论文逆向工程:从理论到代码的深度学习方法

1. 从获奖论文到实战工具箱&#xff1a;如何真正“消化”一份数模竞赛作品如果你正在准备数学建模竞赛&#xff0c;无论是美赛&#xff08;MCM/ICM&#xff09;、国赛还是校赛&#xff0c;手头有几篇往年的获奖论文&#xff0c;尤其是像2016年HIMCM B题“购物和运输问题”这种典…

作者头像 李华
网站建设 2026/8/21 8:00:05

库存建模实战:从业务问题到数学结构的四步拆解法

1. 这不是“套公式”&#xff0c;而是用数学重建真实世界的库存逻辑 很多人看到“存贮模型”四个字&#xff0c;第一反应是翻《运筹学》教材里那个经典的EOQ&#xff08;经济订货批量&#xff09;公式&#xff1a;$$ Q^* \sqrt{\frac{2DS}{H}} $$。抄一遍参数&#xff0c;代入…

作者头像 李华
网站建设 2026/8/21 7:57:27

AI编程提示词优化:避免智能体过度设计与算力浪费

最近在尝试使用编程智能体&#xff08;如 GitHub Copilot、Cursor、Claude Code 等&#xff09;辅助开发时&#xff0c;你是否遇到过这样的情况&#xff1a;明明是一个简单的功能需求&#xff0c;智能体却生成了一段极其复杂、包含大量冗余逻辑的代码&#xff1f;或者&#xff…

作者头像 李华
网站建设 2026/8/21 7:56:15

光谱流式升级|突破传统流式瓶颈,单细胞多色检测迈入全光谱时代

一、技术概述&#xff1a;何为光谱流式&#xff1f;光谱流式是新一代高端流式细胞分析技术&#xff0c;作为传统多色流式的迭代升级方案&#xff0c;其核心原理为采集细胞完整全光谱荧光信号&#xff0c;依靠算法自动拆分荧光信号、完成去串色处理&#xff0c;无需人工手动调节…

作者头像 李华
网站建设 2026/8/21 7:55:28

AI Agent工具管理:为何显式Opt-in机制比全量暴露更高效安全

最近在尝试一些 AI Agent 框架时&#xff0c;我遇到了一个很有意思的现象&#xff1a;很多开发者&#xff0c;包括我自己&#xff0c;都下意识地认为&#xff0c;一个 Agent 能“看到”的 API 越多&#xff0c;它就越聪明、越强大。我们热衷于把各种工具、接口一股脑地暴露给 A…

作者头像 李华