1.哈希算法

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

2. 哈希碰撞

        多个数据通过哈希算法得到的键值相同,称为产生哈希碰撞。优秀的哈希算法会尽可能避免哈希碰撞。

3.哈希表(散列存储)

        3.1哈希表的插入

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

        3.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;}

4.排序算法

        4.1冒泡排序

                排序方法: 相邻的两个元素比较,大的向后走,小的向前走,循环找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;}

        4.2选择排序

                排序方法: 从前到后找最小值与前面的元素交换 找到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;}

        4.3插入排序

                比冒泡排序、选择排序更高效(实际移动次数更少),适用于小规模数据或近乎有序的数组(效率接近线性)。

原理:假设对数组 [5, 2, 4, 6, 1, 3] 进行升序排序:

  1. 初始已排序部分:[5],未排序部分:[2, 4, 6, 1, 3]

  2. 插入 2[2, 5]5 向后移动)。

  3. 插入 4[2, 4, 5]5 向后移动)。

  4. 插入 6:直接放到末尾 → [2, 4, 5, 6]

  5. 插入 1:需移动到最前 → [1, 2, 4, 5, 6](所有元素后移)。

  6. 插入 3:放到 2 和 4 之间 → [1, 2, 3, 4, 5, 6]

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.4希尔排序

        希尔排序是 插入排序的改进版,通过将数组分成多个子序列进行插入排序,逐步缩小子序列的间隔(step),最终使整个数组基本有序,最后进行一次标准的插入排序。

        算法思想:

  1. 分组插入排序:选择一个递减的间隔序列(step),将数组分成若干子序列,对每个子序列进行插入排序。

  2. 逐步缩小间隔:随着step 的减小,子序列越来越接近整个数组,最终 step=1 时,相当于一次标准的插入排序,此时数组已经基本有序,排序效率高。

        步骤:

  1. 选择一个初始间隔序列(如 step = n/2, step /= 2, ... 直到 step = 1)。

  2. 对每个 step,将数组分成 step 个子序列,每个子序列进行插入排序。

  3. 重复缩小 step,直到 step = 1,最后进行一次标准插入排序。

       示例

      假设数组 [8, 3, 1, 2, 7, 5, 6, 4],初始 gap = 4

  1. gap=4:分成 4 个子序列 [8,7], [3,5], [1,6], [2,4],分别排序 → [7,3,1,2,8,5,6,4]

  2. gap=2:分成 2 个子序列 [7,1,8,6], [3,2,5,4],分别排序 → [1,2,6,3,7,4,8,5]

  3. gap=1:标准插入排序 → [1,2,3,4,5,6,7,8]

 //希尔排序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;}

        4.5快速排序

                快速排序是一种 分治算法,通过选择一个键值,将数组分成两部分,左边小于键值,右边大于键值,然后递归排序左右两部分。

 算法思想:

  1. 选择键值:通常选第一个、最后一个或随机元素。

  2. 分区

    • 将小于键值 的元素移到左边,大于键值的移到右边。

    • 最终键值位于正确的位置。

  3. 递归排序:对左右子数组重复上述过程,直到子数组长度为 1。

 步骤:

  1. 选择键值(如 arr[high])。

  2. 初始化指针 i(指向小于 键值 的最后一个元素)。

  3. 遍历数组

    • 如果 arr[j] < 键值,交换 arr[i+1] 和 arr[j],并 i++

  4. 交换 pivot 到正确位置 i+1

  5. 递归排序 左右子数组。

 示例:

       对数组 [5, 3, 8, 4, 2, 7, 1, 10] 进行排序(选择 5 作为 键值):

初始:

pivot = 5
[5, 3, 8, 4, 2, 7, 1, 10]↑i                   ↑j

  i 向右找 >5 的元素(8),j 向左找 <5 的元素(1),交换 8 和 1。

[5, 3, 1, 4, 2, 7, 8, 10]↑i     ↑j

  i 继续右移找到 7j 左移找到 2,交换:

[5, 3, 1, 4, 2, 7, 8, 10]↑j ↑i

      此时 i > j,循环终止,交换 pivot 和 arr[j]

[2, 3, 1, 4, 5, 7, 8, 10]

        继续递归调用:左子数组 [2, 3, 1, 4](选 2 为 pivot),右子数组 [7, 8, 10](选 7 为 pivot)

1

5.查找算法

        5.1折半查找(二分查找)

二分查找(折半查找)是一种高效的 有序数组查找算法,它通过 逐步缩小搜索范围 来快速定位目标值。其核心思想是 “分而治之”,每次比较后排除一半的无效数据。

核心思想

  1. 前提条件:数组必须是有序的(升序或降序)。

  2. 查找过程

    每次取数组的 中间元素 与目标值比较。如果中间元素等于目标值,直接返回位置。如果目标值 小于 中间元素,则在 左半部分 继续查找。如果目标值 大于 中间元素,则在 右半部分 继续查找。找到目标值或搜索范围为空(未找到)则终止。

示例

假设有序数组 [1, 3, 5, 7, 9, 11],查找 target = 7

  1. 初始范围low = 0high = 5

    • mid = 2arr[2] = 5 < 7 → 搜索右半部分,low = 3

  2. 新范围[7, 9, 11]low = 3high = 5)。

    • mid = 4arr[4] = 9 > 7 → 搜索左半部分,high = 3

  3. 最终比较low = 3high = 3

    • mid = 3arr[3] = 7 == target → 返回 3

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

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

相关文章

数据结构Java--7

排序排序就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作排序的稳定性假若有以下数组&#xff0c;数组中存在两个5&#xff0c;这里区分标记如果排序之后&#xff0c;红色的5仍然在蓝色的5前面&#xff0c;我们就认为该排序…

《Node.js与 Elasticsearch的全文搜索架构解析》

文档数量跨越百万级门槛,传统数据库的查询方式就像在没有索引的图书馆里逐架翻书,不仅耗费时间,更难以捕捉文字背后的深层关联。此时,由Node.js与Elasticsearch共同构建的全文搜索系统,便成了梳理信息脉络的无形之手——它能在毫秒之间,从海量文档中识别用户的真实意图,…

Python人工智能matplotlib中markers属性介绍

在 Matplotlib 中&#xff0c;marker 用于标记数据点&#xff0c;可通过多种参数自定义样式。以下是详细说明及示例&#xff1a; 1. 基础设置常用 marker 类型&#xff1a; . : 点 , : 像素 o : 圆圈 v : 下三角形 ^ : 上三角形 < : 左三角形 >…

【Mac】MLX:Lora微调工作流

本文详细介绍如何在Mac电脑上使用Apple的MLX框架&#xff0c;通过LoRA&#xff08;低秩适配&#xff09;技术对大语言模型&#xff08;如Qwen3-4B-Instruct&#xff09;进行微调。以下流程适用于8月9日的Mac mini M4 16GB&#xff0c;涵盖模型获取、数据准备、微调、运行及模型…

润乾报表、帆软报表的开源替代品—JimuReport(积木报表)

国产报表工具选型指南&#xff1a;润乾报表 vs 积木报表&#xff08;JimuReport&#xff09; 如果你在寻找润乾报表、帆软报表的替代产品&#xff0c;JimuReport&#xff08;积木报表&#xff09;是一个值得考虑的选择。它不仅功能全面&#xff0c;而且操作简单&#xff0c;非常…

Tiger任务管理系统-12

今天整了一个老虎网站介绍这套任务管理开源系统&#xff0c;防止链接丢失&#xff0c;体验了一把AI编程&#xff0c;虽说确实省了很多事&#xff0c;但源码确实不敢恭维&#xff0c;尤其是修改的时候&#xff0c;真心累&#xff0c;所以还是要自己掌握核心&#xff0c;AI一时爽…

智慧农业-无人机视角庄稼倒伏农作物倒伏识别分割数据集labelme格式541张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数)&#xff1a;541标注数量(json文件个数)&#xff1a;541标注类别数&#xff1a;1标注类别名称:["fall"]每个类别标注的框数&#xff1a;fall co…

电子电气架构 --- 电气/电子架构迁移已拉开帷幕

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

PPT漏斗图,让数据更美观!

PPT漏斗图制作全攻略&#xff1a;从入门到精通的实用技巧和模板推荐 无论你是职场新人还是PPT老手&#xff0c;在做数据报告或者展示项目进度的时候&#xff0c;你总觉得图表太单调&#xff0c;数据太复杂吗&#xff1f;这时&#xff0c;一张逻辑清晰、结构简单的漏斗图&#…

深入解析C++流运算符(>>和<<)重载:为何必须使用全局函数与友元机制

目录 一、为什么需要重载为全局函数 成员函数重载的问题 全局函数的优势 二、实现细节 1、输出运算符<<的重载 关键部分详解 1. 类定义部分 2. 运算符重载实现 3. main函数中的使用 为什么这样设计&#xff1f; 执行流程 输出结果 2、输入运算符>>的重…

ENS-317 Modbus TCP / 通用模式网关

在工业自动化的复杂网络中&#xff0c;以太网设备与串口设备的 “语言不通” 常常成为数据流转的阻碍。上海泗博自动化推出的 ENS-317 Modbus TCP / 通用模式网关&#xff0c;以强大的协议转换能力、灵活的配置方式和工业级可靠性&#xff0c;为设备互联提供一站式解决方案&…

AcWing 6478. 谁进线下了?III

原题链接 6478. 谁进线下了&#xff1f;III - AcWing题库 这是一道睿抗&#xff08;省赛&#xff09;题 一开始睿抗是啥都不知道 然后一看是省赛吓得我不轻 但读完题简简单单 一道很水的模拟题&#xff08;谁能解释一下睿抗啥意思&#xff09; 一起开康康 题目 Xepa Le…

openpnp - 不连接设备,只大概测试一下摄像头是否好使

文章目录openpnp - 不连接设备&#xff0c;只大概测试一下摄像头是否好使概述笔记备注备注ENDopenpnp - 不连接设备&#xff0c;只大概测试一下摄像头是否好使 概述 顶部相机摄像头在拆装过程中&#xff0c;可能被手上的静电打坏了。 现在和电脑连接是正常的&#xff0c;但是…

使用Python提取PDF大纲(书签)完整指南

&#x1f50d; 一、PDF大纲简介&#x1f4cc; ​PDF大纲&#xff08;Outline&#xff09;​​ 是PDF文档中的导航结构&#xff0c;通常显示在阅读器的侧边栏中&#xff0c;方便用户快速跳转到文档的不同部分。大纲通常以层级结构组织&#xff0c;包含标题和对应的页面位置。本文…

第39周——训练自己的数据集

目录 1. 下载数据 2. 配置开发环境 3. 预处理数据 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1. 下载数据 百度网盘&#xff1a;百度网盘 请输入提取码 压缩文件中有两个文件夹&#xff0c;分别是Annot…

CentOS7中Docker的安装与卸载

CentOS7 从零开始:Docker 安装与卸载全指南(新手友好版) 作为一名刚接触 Linux 和容器技术的新手,你是否曾在安装 Docker 时被各种命令和报错搞得一头雾水?比如执行 yum install docker 时提示 “仓库不存在”,或者启动 Docker 后用 docker version 只显示 client 不显示…

解决MinIO上传图片后返回URL无法访问的问题

一、问题现象 上传接口返回了文件的访问路径&#xff0c;比如&#xff1a; http://127.0.0.1:9005/lease/20250808/xxx-uuid.png但是用浏览器直接打开该地址却显示权限拒绝,前端也访问不到:二、问题原因分析 桶权限设置不正确: MinIO默认桶权限是私有的&#xff0c;即使浏览器能…

系统网络端口安全扫描脚本及详解

#!/bin/bash # 系统服务端口安全扫描 - 修正版echo " 系统服务端口安全扫描报告 "# 1. 高风险端口识别 echo "⚠️ 对外开放的高风险端口:" awk /0.0.0.0:21/ {print " 端口 21 - FTP (明文传输)\n &#x1f6a8; 严重安全风险&#xff0c;建议…

DAY 39 图像数据与显存

知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分&#xff0c;也是默认…

从大数据视角理解时序数据库选型:为何选择 Apache IoTDB?

目录一、什么是时序数据库&#xff1f;为什么你需要它&#xff1f;&#x1f527;典型应用场景&#xff1a;二、时序数据库选型维度有哪些&#xff1f;三、为什么推荐 Apache IoTDB&#xff1f;&#x1f9e0; Apache 顶级项目&#xff0c;工业 IoT 场景原生支持&#x1f680; 性…