哈希表

1哈希算法

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

2哈希碰撞

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

3哈希表:

  • 构建哈希表存放0-100之间的数据
  • 哈希算法选择:
    • 将0-100之间的数据的各位作为键值

4. 哈希表的实现

        1. 哈希表插入

        

linknode *phashtable[INDEX];
// 一个名为phashtable的指针型数组,一共INDEX个元素 每个元素的值都是linknode*型 指向链表的头节点指针
// phashtable是二级指针哦 指向数组头元素的地址常量(数组内元素都为地址 指向指针的指针则是二级指针)
int insert_hashtable(int tmpdata)
{int key = 0;linknode **pptmpnode = NULL;linknode *pnewnode = NULL;key = tmpdata % INDEX;//*pptmpnode != NULL说明哈希表当前这个元素后面有链表// 注意:你要操作循环的是 存放哈希表的元素指针值(这里变化的i是 二级指针)// pptmpnode等于哈希表里存的元素的地址// 先1 若2 再3(把指针往后挪一个)若2 再3 直到找到存放大于输入的数据的链表位置退出循环for (pptmpnode = &phashtable[key]; *pptmpnode != NULL && (*pptmpnode)->data < tmpdata; pptmpnode = &((*pptmpnode)->pnext)){}// 新建链式空间pnewnode = malloc(sizeof(linknode));if (pnewnode == NULL){perror("fail to malloc");return -1;}pnewnode->data = tmpdata;pnewnode->pnext = *pptmpnode; // 若你插入的数字是62 *pptmpnode则是指向72节点的地址*pptmpnode = pnewnode;        //**ptmpnode 同时也是指向52节点里面pnext的值 改这个值return 0;
}

2. 哈希表遍历

 int show_hashtable(void){int i = 0;linknode *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;}

排序和查找算法:

1.冒泡排序

  • 1. 时间复杂度为O(n^{2})
  • 2. 稳定的排序算法
  • 3. 排序方法:
    • 相邻的两个元素比较,大的向后走,小的向前走
    • 循环找len-1个大的值

int bubble_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;for (j = 0; j < len-1; j++){for (i = 0; i < len-1-j; i++){if (parray[i] > parray[i+1]){tmp = parray[i];parray[i] = parray[i+1];parray[i+1] = tmp;}}}return 0;}

2. 选择排序

  • 1. 时间复杂度O(n^{2})
  • 2. 不稳定排序算法
  • 3. 排序方法:
    • 从前到后找最小值与前面的元素交换
    • 找到len-1个最小值吗,最后一个最大值即排序完成

 int select_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;int min = 0;for (j = 0; j < len-1; j++){min = j;for (i = j+1; i < len; i++){if (parray[i] < parray[min]){min = i;}}if (min != j){tmp = parray[min];parray[min] = parray[j];parray[j] = tmp;}}return 0;}

3.插入排序

  • 1. 时间复杂度O(n^{2}),如果是组有序时间复杂度降低至O(n)
  • 2. 稳定的排序算法
  • 3. 排序方法:
    • 将数组中的每个元素插入到有序数列中
    • 先将要插入的元素取出O(n^{2})
    • 依次和前面元素比较,比元素大的向后走,直到前一个元素比要插入的元素小,或者到 达有序数列开头停止
    • 插入元素即可

 int insert_sort(int *parray, int len){int tmp = 0;int i = 0;int j = 0;for (j = 1; j < len; j++){tmp = parray[j];for (i = j; i > 0 && tmp < parray[i-1]; i--){parray[i] = parray[i-1];}parray[i] = tmp;}return 0;
}

4.希尔排序

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

        

/* 耗时: 5 - 10ms*/int shell_sort(int *parray, int len){int step = 0;int j = 0;int i = 0;int tmp = 0;for (step = len/2; step > 0; step /= 2){for (j = step; j < len; j++){tmp = parray[j];for (i = j; i >= step && tmp < parray[i-step]; i -= 
step){parray[i] = parray[i-step];}parray[i] = tmp;}}return 0;}

5.快速排序

        1. 时间复杂度为O(nlogn)

        2. 不稳定的排序算法

        3. 选择左边的作为键值,从后面找一个比键值小的放前面,从前面找一个比键值大的放后面,键 值放中间

        4. 左右两边有元素则递归调用快速排序

int quick_sort(int *parray, int low, int high){int key = 0;int j = 0;int i = 0;key = parray[low];j = high;i = low;while (i < j){while (i < j && parray[j] >= key){j--;}if (i < j){parray[i] = parray[j];}while (i < j && parray[i] <= key){i++;}if (i < j){parray[j] = parray[i];}    }parray[i] = key;if (i-1 > low){quick_sort(parray, low, i-1);}if (i+1 < high){quick_sort(parray, i+1, high);}return 0;}

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

        时间复杂度O(logn)

 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);}}

7顺序查找

时间复杂度为O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92771.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92771.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92771.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWT与Swing深度对比:架构差异、迁移实战与性能优化

全面对比分析Java AWT与Swing GUI框架的架构差异、性能表现和适用场景&#xff0c;提供完整的AWT到Swing迁移实战指南&#xff0c;包含15代码示例、性能测试数据、最佳实践建议&#xff0c;助你做出明智的技术选型和实现平滑迁移。 Java AWT, Swing, GUI框架对比, 代码迁移, 性…

git仓库检测工具

介绍 Gitleaks 是一款用于检测git 仓库、文件以及任何你想通过 git 传递的信息(例如密码、API 密钥和令牌)的工具stdin。如果你想了解更多关于检测引擎工作原理的信息,请查看这篇博客:正则表达式(几乎)就是你所需要的一切。 ➜ ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入门:自然语言模型 vs 统计语言模型

一句话关系总结 统计语言模型 自然语言模型的“数学基础” &#xff08;就像加减乘除是数学的基础&#xff0c;统计模型是AI学说话的基础工具&#xff09;区别对比表&#xff08;小白版&#xff09;维度统计语言模型自然语言模型本质用数学公式算句子概率用神经网络模仿人脑理…

[激光原理与应用-252]:理论 - 几何光学 - 传统透镜焦距固定,但近年出现的可变形透镜(如液态透镜、弹性膜透镜)可通过改变自身形状动态调整焦距。

一、液态透镜&#xff1a;电润湿效应驱动曲率变化基本结构液态透镜由两种互不相溶的液体&#xff08;如导电水溶液与绝缘硅油&#xff09;封装在透明圆筒形容器中构成。容器壁经疏水处理&#xff0c;使水溶液呈圆顶型聚集在中心&#xff0c;与硅油形成凸状曲面。工作原理电润湿…

wordpress数据库导入时的#1044错误

在wordpress网站数据库文件.sql导入到数据库时&#xff0c;发生错误&#xff0c;错误提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 这个错误表明用户wodepress_com没有权限访问数据库wodepress。以下是解…

微服务ETCD服务注册和发现

1.什么是注册中心 注册中心主要有三种角色&#xff1a; 服务提供者&#xff08;RPC Server&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 服务消费者&#xff08;RPC Client&#xff09;&…

计算机网络---默认网关(Default Gateway)

一、默认网关的定义 默认网关&#xff08;Default Gateway&#xff09;是一个网络设备&#xff08;通常是路由器、防火墙或三层交换机&#xff09;的IP地址&#xff0c;它是本地网络中的设备访问其他网络&#xff08;如外网、其他子网&#xff09;时&#xff0c;数据报文的“第…

OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制

1. libgpio概述与核心定位 libgpio作为OpenBMC中GPIO管理的核心库&#xff0c;扮演着连接硬件驱动与上层应用的桥梁角色。它通过标准化的接口抽象了不同硬件平台的GPIO操作细节&#xff0c;使得电源控制、传感器监控等关键功能能够以统一的方式访问GPIO资源。 1.1 libgpio在Ope…

开放原子开源生态大会:麒麟信安加入openEuler社区AI联合工作组,聚焦操作系统开源实践与行业赋能

7月23日&#xff0c;由开放原子开源基金会主办的2025开放原子开源生态大会在京开幕&#xff0c;大会以“开源赋能产业&#xff0c;生态共筑未来”为主题。工业和信息化部副部长熊继军、北京市人民政府副秘书长许心超出席大会并致辞。作为开放原子开源基金会黄金捐赠人和开源重要…

Lyapunov与SAC算法的数学结构对比:从二次漂移到TD损失

一、李雅普诺夫优化中二次漂移函数的推导 李雅普诺夫优化的核心是通过设计 “李雅普诺夫函数” 和 “漂移项”&#xff0c;保证系统状态收敛到稳定点。以下以线性时不变系统为例&#xff08;非线性系统推导逻辑类似&#xff0c;仅动力学方程更复杂&#xff09;&#xff0c;推导…

WireShark:非常好用的网络抓包工具

文章目录一、写在前面二、安装三、使用1、入门使用&#xff08;1&#xff09;打开软件&#xff08;2&#xff09;右键网卡&#xff0c;Start Capture(开始捕获)2、界面详细介绍3、过滤器设置一、写在前面 Wireshark是使用最广泛的一款「开源抓包软件」&#xff0c;常用来检测网…

WEB技术演进史:从C/S到微服务架构

WEB技术 HTTP协议和B/S 结构 操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。 客户端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc编译的opencv在QT中的配置&#xff0c;opencv可以是官网直接下载的版本&#xff0c;也可以是msvc(例如vs2019)通过cmake编译 contrib功能的opencv版本&#xff0c;这2种版本对qt版本没有严格要求&#xff0c;但是若在cmake中选择了with_qt功能&#xff0c;那…

【listlist模拟】

list&list模拟1.list使用2、list模拟附录1.list使用 list常见接口不做介绍&#xff0c;跟前面vector有相似之处&#xff0c;跟数据结构list基本一样。  因为list使用带头的双向循环链表实现的&#xff0c;不能用小标访问&#xff0c;只能用迭代器或范围for访问 list有成…

在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录

在CentOS 7上将PostgreSQL数据库从默认路径迁移到自定义目录&#xff0c;需遵循以下步骤。假设原数据目录为“/var/lib/pgsql/12/data”&#xff0c;目标目录为“/new/path/pgdata”。 1、步骤概览 停止PostgreSQL服务创建新目录并设置权限复制数据文件&#xff08;保留权限&am…

C语言基础06——结构体(struct)

一、结构体的概念结构体&#xff08;struct&#xff09;是 C 语言中一种自定义数据类型&#xff0c;它允许你将不同类型的数据项组合在一起&#xff0c;形成一个新的复合数据类型。想象一下&#xff1a;如果要表示一个 "学生"&#xff0c;需要包含姓名&#xff08;字…

小白入门指南:Edge SCDN 轻松上手

在互联网飞速发展的当下&#xff0c;网站性能与安全至关重要。对于小白而言&#xff0c;Edge SCDN 可能是个陌生概念&#xff0c;但它却能极大助力网站运营。本文将用简单易懂的语言&#xff0c;带大家了解 Edge SCDN&#xff0c;探讨其运用方法。​一、Edge SCDN 是什么&#…

探秘酵母单杂交技术:解锁基因调控的密码

在生命科学研究领域&#xff0c;基因的表达调控机制一直是科学家们关注的焦点。为了深入探究这一复杂过程&#xff0c;众多先进技术应运而生&#xff0c;酵母单杂交技术便是其中极具价值的一项&#xff0c;它为研究 DNA 与蛋白质之间的相互作用提供了独特视角与有效手段。酵母单…

大模型备案要点一次过【附材料清单详解】

最近&#xff0c;广东省公布了最新一批的大模型备案&#xff08;登记&#xff09;名单&#xff0c;很多准备要做大模型备案的企业都在纷纷咨询&#xff1a;“大模型备案的周期是多久&#xff1f;”“做大模型备案有什么要求&#xff1f;”“做大模型备案一共需要准备多少材料&a…

启保停-----------单相照明灯的接法

一.单相照明灯-K21使用的器材,单相电能表,空开,插座,开关,灯泡二.启 保 停1.需要用到的器材1.空开2.三相电机3.接触器4.熔断器5.按钮2.电路的作用按按钮 运转 在按按钮 停止运转3.电动4.加上辅助触点 控制电路5.在加上按钮 停止电路