数据结构---哈西表、算法

一、哈希表

哈希算法:
    在记录的存储位置和它的关键字之间建立一种去特定的对应关系,使得每个关键字key对应一个存储位置;
    查找时,根据确定的对应关系,找到给定的key的映射。
    
        记录的存储位置 = f(关键字)

我们把这种关系f称为哈希函数(散列函数);
    采用这种散列技术将记录存储在一块连续的存储空间,这块连续存储开空间称为哈希表或散列表。
    
    存储时,通过散列函数计算出记录的散列地址;
    查找时,根据同样的散列函数计算记录的散列地址,并按此散列地址访问记录。
     

#include<head.h>
#include"hash.h"HSNode_t *hashtable[HASH_SIZE]={NULL};                //以全局表量形式表示哈希表/*哈希函数*/
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_SIZE - 1;}
}
/*插入链表*/
int insert_hashtable(HSDataTYpe data)
{int addr = hash_function(data.name[0]);HSNode_t *pnode = malloc(sizeof(HSNode_t));if(NULL == pnode){perror("malloc fail");return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = hashtable[addr];hashtable[addr] = pnode;return 0;
}
/*遍历*/
void printf_hash()
{for(int i= 0;i < 26;++i){HSNode_t *p = hashtable[i];while(p != NULL){printf("%s %s\n",p->data.name,p->data.tel);p = p->pnext;}}
}
/*查找*/
HSNode_t *find_hash(char *name)
{int addr = hash_function(name[0]);HSNode_t *p = hashtable[addr];while(p != NULL){if(strncmp(name,p->data.name,strlen(name)) == 0){return p;}p=p->pnext;}
}/*删除*/ 
int  pop_hash(int i)
{HSNode_t *pdel = hashtable[i];if(NULL == pdel){return 0;}hashtable[i] = pdel->pnext;free(pdel);return 1;
}
/*销毁*/
void destory()
{for(int i=0;i<HASH_SIZE;++i){while(hashtable[i] != NULL){pop_hash(i);}}
}
/********************************************************************/
#ifndef _HASH_H
#define _HASH_H#define HASH_SIZE 27typedef struct per
{char name[64];char tel[32];
}HSDataTYpe;typedef struct hsnode
{HSDataTYpe data;struct hsnode *pnext;
}HSNode_t;extern int insert_hashtable(HSDataTYpe data);
extern void printf_hash();
extern HSNode_t *find_hash(char *name);extern int pop_hash();extern void destory();
#endif

二、算法

1、算法的设计
  

1.正确性,
        语法正确
        合法的输入能得到合理的结果。
        对非法的输入,给出满足要求的规格说明
        对精心选择,甚至刁难的测试都能正常运行,结果正确
    2. 可读性,便于交流,阅读,理解    高内聚 低耦合
    3. 健壮性,输入非法数据,能进行相应的处理,而不是产生异常
    4. 高效率(时间复杂度)
    5. 低存储(空间复杂度)

2、算法时间复杂度
      

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

3、排序算法

1、插入排序

思想:将数组分为已排序区间和未排序区间,初始已排序区间只有一个元素,就是数组的第一个元素。然后,每次从未排序区间中取出第一个元素,在已排序区间中找到相应的位置并插入。

特点

  • 在小规模数据集上,插入排序的性能接近线性排序。
  • 时间复杂度在最好情况下为O(n),最坏情况下为O(n^2)。
  • 插入排序是稳定的排序算法。
  • 不需要额外的存储空间,也是原地排序
     void InsertionSort(int *a,int len)
    {int i,j;for(i=1;i<len;++i){j= i;int t = *(a+i);while(j>0 && (*(a+j-1))>t){*(a+j) = *(a+j-1);--j;}*(a+j) = t;}}
    
     
2、选择排序

思想:遍历数组,每次从未排序的部分找到最小(或最大)的元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

特点

  • 时间复杂度为O(n^2),其中n是数组的长度。
  • 不稳定排序(即相等的元素可能在排序后的序列中改变相对位置)。
  • 不需要额外的存储空间,原地排序。
  • void choiceSort(int *a, int len)
    {int i,j; for(i=0;i<len;++i){for(j=i+1;j<len;++j){if(*(a+i) >*(a+j)){swap(a+i,a+j);}}}
    }
    

                                 

3、冒泡排序

思想:通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这表示该数列已经排序完成。

特点

  • 时间复杂度也是O(n^2)。
  • 也是一种原地排序,且是稳定的排序算法
  • void BubbleSort(int *a,int len)
    {int i,j;for(j=len-1;j>0;--j){for(i=0;i<j;++i){if(*(a+i) > *(a+i+1)){swap(a+i,a+i+1);}}}
    }

                                                                                                                                                                      

4、快速排序

基本思想为:任取待排序元素序列中的某元素作为基准值(pivot),按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。快速排序采用了分治的思想,将一个大问题转化为若干个小问题,然后逐个解决每个小问题,最终达到解决问题的目的。

void qSort(int *begin , int *end)
{if(begin >= end){return ;}int t = *begin;int *p = begin;int *q = end;while(p < q){while(p<q && *q >= t){--q;    }while(p<q && *p <= t){++p;}swap(p,q);}swap(begin,p);qSort(begin,p-1);qSort(p+1,end);
}
5、二分查找
  • 优点
    • 效率高:二分查找的时间复杂度为O(log n),在处理大数据集时非常高效。
    • 适用范围广:只要数组(或类似的数据结构)是有序的,就可以使用二分查找算法来快速定位元素。
    • 稳定性好:二分查找的性能不会受到输入数据分布的影响。
    • 空间复杂度低:不需要额外的存储空间。
  • 缺点
    • 要求有序数组:如果数组无序,则需要先进行排序操作,这可能会增加额外的时间开销。
    • 插入和删除操作效率低:二分查找在查找操作上非常高效,但如果需要在数组中频繁地进行插入和删除操作,则二分查找可能不是最佳选择。
    • 不适用于非数组数据结构:二分查找主要适用于数组或类似数组的数据结构。
    • 边界条件处理复杂:在实现二分查找时,需要正确处理各种边界条件,这可能会使代码变得复杂且容易出错。
int *binaryFind(int *a,int len ,int n)
{int begin =0;int end =len -1;int mid;while(begin <= end){mid = (begin + end) /2;if(*(a+mid) < n){begin = mid +1;}else if(*(a+mid) > n){end = mid -1;}else{return a+mid;}}return NULL;
}

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

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

相关文章

使用 C# WinForm 制作简单的串口调试助手

使用 C# WinForm 制作简单的串口调试助手 很久之前就已经发现了C# WinForm开源的控件界面库Sunny.UI&#xff0c;于是想着做一个Demo来用上Sunny.UI界面库。于是就想着做一个串口调试助手的Demo。 下面我就创建一个工程,并且加载Sunny.UI控件库&#xff0c;我这个项目还加载了…

使用stripe进行在线支付、退款、订阅、取消订阅功能(uniapp+h5)

stripe官网:Stripe 登录 | 登录 Stripe 管理平台 然后在首页当中打开测试模式,使用测试的公钥跟私钥进行开发 测试卡号 4242 4242 4242 4242 1234 567 在线支付 stripe的在线支付有两种,第一种就是无代码,第二中就是使用api进行自定义,一般来说推荐第二种进行开发 无…

哈希表 和 算法

1.哈希表的作用&#xff1a;将我们要存储的数据&#xff0c;通过关键字与位置的关系函数&#xff0c;来确定具体的位置。 2.写哈希表时常出现的问题&#xff1a;哈希冲突/矛盾&#xff1a;当多个数据满足哈希函数的映射时出现 解决的方法为&#xff1a; 1&#xff09;开放地址…

[C#学习笔记]LINQ

视频地址&#xff1a;LINQ入门示例及新手常犯的错误_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、基本概念 语言集成查询(Language-Intergrated Query) 常见用途 .Net原生集合(List&#xff0c;Arra…

SEO 分类策略权威指南

如果你在 SEO 领域工作了一段时间&#xff0c;你可能熟悉网站分类法的概念。这是指网站内容的组织方式以及用户找到他们正在寻找的内容的难易程度。 例如&#xff0c;考虑一个专门从事服装的电子商务网站。结构良好的分类可能包括主要类别&#xff0c;例如男装、女装和配饰&am…

【深度学习讲解笔记】第1章-机器学习基础(2)

模型与函数构造 之前讲到&#xff0c;模型是由机器学习决定参数值的函数&#xff0c;通过训练&#xff0c;机器可以找出最好的一组参数使得函数的输出最优。常见的模型有线性模型&#xff0c;指数模型&#xff0c;对数模型等。在线性模型中&#xff0c;w和b是可学习的参数&…

基于SpringBoot的智能制造云平台系统的设计与实现计算机毕设

一、选题背景与意义&#xff08;300字左右&#xff09; 根据工业4.0智能制造生态链中云工厂在实际生产当中的工作流程进行充分调研和整理出来的&#xff0c;描述最终用户在本系统中对于生产订单的处理、排产、以及生产的完整在线处理流程和业务需求的文档。 针对制造业而言&a…

TikTok直播为什么要用独立IP

TikTok直播作为一种受欢迎的社交媒体形式&#xff0c;吸引了越来越多的用户和内容创作者。在进行TikTok直播时&#xff0c;选择使用独立IP地址是一种被广泛推荐的做法。本文将探讨为什么在TikTok直播中更推荐使用独立IP&#xff0c;并解释其优势和应用。 独立IP是指一个唯一的互…

基于CNN卷积神经网络迁移学习的图像识别实现

基于CNN卷积神经网络迁移学习的图像识别实现 基于CNN卷积神经网络迁移学习的图像识别实现写在前面一&#xff0c;原理介绍迁移学习的基本方法1.样本迁移&#xff08;Instance based TL&#xff09;2.特征迁移&#xff08;Feature based TL&#xff09;3.模型迁移&#xff08;Pa…

C#多线程进阶

多线程和异步的区别和联系 多线程和异步编程是两种用于提高程序性能和响应能力的技术&#xff0c;它们都可以用来处理并发任务&#xff0c;但它们在实现方式和使用场景上有所不同。 多线程&#xff08;Multithreading&#xff09; 定义&#xff1a;多线程是指在单个程序中同时…

C++(一)----C++基础

1.C的发展史 C语言诞生后&#xff0c;很快普及使用&#xff0c;但是随着编程规模增大且越来越复杂&#xff0c;并且需要高度的抽象和建模时&#xff0c;C语言的诸多短板便表现了出来&#xff0c;为了解决软件危机&#xff0c;上世纪八十年代&#xff0c;计算机界提出了oop&…

如何理解有效值电流?电流的均方根值

电流的有效值就是电流的均方根。 有效值电流定义&#xff1a;将一直流电与一交流电分别通过相同阻值的电阻&#xff0c;如果相同时间内两电流通过电阻产生的热量相同&#xff0c;就说这一直流电的电流值是这一交流电的有效值。 如果说电流就是直流电&#xff0c;那么电流的有效…

Flutter MacOS 去掉窗口导航栏

操作步骤 用xcode打开Flutter项目&#xff0c;点击Runner——>Runner——>Resources——>MainMenu 点击APP_NAME&#xff0c;在右侧勾选窗口选项来控制是否有窗口或者关闭缩小按钮。我这里并没有取消勾选Show Title Bar&#xff0c;因为当我取消勾选后&#xff0c;窗…

已经存在的项目如何变成git的一个repository

已经存在的项目如何被git管理 背景&#xff1a; 有一套代码很敏感&#xff0c;可能动不动就要不能正常工作(硬件开发常事)&#xff0c;那改动一下下就要有个记录&#xff0c;就决定用git管理 已经有了服务里里docker里运行的gitbucket,已经有了开发用的电脑上的git客户端&…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

【项目】云备份

云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…

k8s执行crictl images报错

FATA[0000] validate service connection: CRI v1 image API is not implemented for endpoint "unix:///run/containerd/containerd.sock": rpc error: code Unimplemented desc unknown service runtime.v1.ImageService 解决方法&#xff1a; vim /etc/contai…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法&#xff1a;文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项&#xff0c;可以跟着下面路径把该选项调出来 &#xff1a;工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

【C++ Primer Plus习题】14.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

传知代码-机器情绪及抑郁症算法(四)!(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 计算机来理解你的情绪&#xff1a;情感计算的发展 近年来&#xff0c;多模态情感分析&#xff08;MSA&#xff09;受到越来越多的关注&#xff0c;多模态情感分析是一个综合了视觉、听觉等语言和非语言信息的重要…