哈希表、算法

news2024/9/21 18:54:37

哈希表

hash:

在编程和数据结构中,"hash" 通常指的是哈希函数,它是一种算法,用于将数据(通常是字符

串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要,哈希表是一种通过哈

希函数将键映射到表中位置的数据结构,以实现快速的数据插入和检索。

哈希表(Hash Table):

也称为散列表,是一种通过哈希函数将键(Key)映射到表中一个位置以

便快速访问记录的数据结构。哈希表可以快速地插入和查找数据。

哈希算法:

将要存储的关键字与要存储的位置建立一种联系,这种联系就叫哈希函数/散列函数

哈希表的相关函数:

插入数据

int insert_hashtable(HSDataType data)
{
    int addr = hash_function(data.name[0]);
    
    HSNode_t *hanode = malloc(sizeof(HSNode_t));
    if(NULL == hanode)
    {
        perror("fail malloc");
        return -1;
    }

    hanode->data = data;
    hanode->pnext = NULL;

    hanode->pnext = hashtable[addr];
    hashtable[addr] = hanode;
}

遍历哈希表

void hashtable_for_each()
{
    for(int i = 0;i < HASH_SIZE;++i)
    {
        HSNode_t *p = hashtable[i];
        while(p != NULL)
        {
            printf("**%10s  **%3s\n",p->data.name,p->data.tel);
            p = p->pnext;
        }
    }
    printf("\n");
}

查找数据

int find_key_hashtable(HSDataType data)
{
    int addr = hash_function(data.name[0]);
    HSNode_t *p = hashtable[addr];
    while(p != NULL)
    {
        if(!strcmp(p->data.name,data.name))
        {
            printf("%s  %s\n",p->data.name,p->data.tel);
            return 0;
        }
        p = p->pnext;
    }
    return -1;
}

销毁哈希表

int destory_hashtable()
{
    for(int i = 0;i < HASH_SIZE;++i)
    {
        HSNode_t *p = NULL;
        while(hashtable[i] != NULL)
        {
            p = hashtable[i];
            hashtable[i] = p->pnext;
            free(p);
        }
    }
}

算法

算法即解决特定问题求解步骤

算法的设计

1.正确性

语法正确

合法的输入得到合理的结果

对非法的输入,给出满足要求的规格说明

对精心选择,甚至刁难的测试都能正常运行,结果正确

2.可读性

便于交流,阅读,理解 高内聚,低耦合

3.健壮性

输入非法内容,能进行相应的处理,而不是产生异常

4.高效率(时间复杂度)

算法时间复杂度:

执行这个算法所花时间的度量

将数据量增长和时间增长用函数表示出来,这个函数就叫做时间复杂度。

一般用大0表示法:0(n)------>时间复杂度是关于数据n的一个函数

随着n的增加,时间复杂度增长较慢的算法时间复杂度低

时间复杂度的计算规则

1,用常数1 取代运行时间中的所有加法常数

2,在修改后的运行函数中,只保留最高阶项

3,如果最高阶存在且系数不是1,则去除这个项相乘的常数

5.低存储(空间复杂度)

空间复杂度越低:低存储 越高:高存储

时间复杂度越低:高效率 越高:低效率

几种常见时间复杂度比较

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

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

相关文章

什么是浏览器指纹及其在线跟踪的用途?

互联网常常给人一种广阔的蓝色天空的感觉&#xff0c;在那里你可以自由航行&#xff0c;只有匿名才能提供这种自由。然而&#xff0c;事实并非如此。有一套工具被希望识别谁在访问其网站的企业广泛使用。这套工具被称为浏览器指纹识别&#xff0c;了解它的使用方式很重要。 一…

剑指offer JZ23 链表中环的入口结点

问题描述&#xff1a; 给定一个长度为n的链表&#xff0c;首先判断其是否有环&#xff0c;然后找到环的入口。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度 O(n)。 思路&#xff1a; 1. 投机一点的做法 从头遍历链表&#xff0c;如果有环&#xff0c;那么有些节…

Docker初识(Docker技术集群与应用)

一、基础设施即服务 IaaS&#xff08;Infrastructure as a Service&#xff09; eg&#xff1a;购买的云服务器&#xff0c;就是IaaS 提供给客户的服务是对所有设施的利用&#xff0c;包括处理、存储、网络和其他基本的计算资源。客户能够部署和运行任意软件&#xff0c;包括…

LLM大模型学习:探索LLM的精髓-理解Prompts概念与LangChain快速应用技巧”

LLM 中什么是Prompts&#xff1f;如何使用LangChain 快速实现Prompts 一 Prompt是一种基于自然语言处理的交互方式&#xff0c;它通过机器对自然语言的解析&#xff0c;实现用户与机器之间的沟通。 Prompt主要实现方式是通过建立相应的语料库和语义解析模型&#xff0c;来将自…

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…

Java方法的定义,即“函数“的定义!

方法的作用 提高代码的复用性&#xff0c;写一次&#xff0c;你需要的时候直接去调用即可。 定义一个函数方法 [修饰符1 修饰符2 ...] 返回值类型 方法名(形参){Java语句&#xff1b;... ... ... }初次接触方法的举例&#xff1a;两个整数的求和方法 根据上面的例子我们来分…

虚拟机扩充磁盘空间

本人使用的VMware首先关闭虚拟机在设置中进行磁盘扩展&#xff0c;输入扩展的空间 具体扩展步骤 fdisk /dev/sda输入p&#xff0c;查看分区情况输入n新建一个分区&#xff0c;还有之后两步&#xff0c;全部默认输入w保存分区fdisk -l使用vgdisplay查看卷组信息&#xff1a;vgdi…

动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]

目录 LeNet模型训练 LeNet 总体来看&#xff0c;LeNet&#xff08;LeNet-5&#xff09;由两个部分组成&#xff1a; 卷积编码器&#xff1a;由两个卷积层组成; 全连接层密集块&#xff1a;由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均…

Docker 清理和查看镜像与容器占用情况

查看容器占用磁盘大小 docker system df 查看单个image、container大小&#xff1a; docker system df -v 清理所有废弃镜像与Build Cache docker system prune -a

【解决内存泄漏的问题】 Qt 框架中的父子对象关系会自动管理内存,父对象会在其销毁时自动销毁所有子对象。

修改前的代码 这段代码可能会出现内存泄漏问题&#xff0c;主要原因是构造函数中创建的 LoginDialog 和 RegisterDialog 对象未在合适的地方被正确释放。具体分析如下&#xff1a; 1. 构造函数中的问题 _login_dlg new LoginDialog(); setCentralWidget(_login_dlg); _login…

【北京迅为】《STM32MP157开发板使用手册》- 第十二章 编译Linux内核

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

运算放大器中的反馈

运算放大器中的反馈&#xff1a;原理、类型与应用 运算放大器&#xff08;Operational Amplifier, 简称Op-Amp&#xff09;是现代电子电路中的重要组成部分&#xff0c;被广泛应用于信号处理、放大、滤波等场合。而反馈技术则是运算放大器电路的核心之一&#xff0c;直接影响其…

代码随想录算法训练营第二十二天| 491. 递增子序列、46. 全排列、47. 全排列Ⅱ

今日内容 Leetcode. 491 递增子序列Leetcode. 46 全排列Leetcode. 47 全排列Ⅱ Leetcode. 491 递增子序列 文章链接&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 本题也是一个子集问题&#…

【AI绘画】Midjourney后置指令--seed、--tile、--q、--chaos、--w、--no详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney后置指令--seed测试1测试2如何获取未指定种子图片的随机种子注意点 &#x1f4af;Midjourney后置指令--tile测试 &#x1f4af;Midjourney后置指令--q(or-…

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI&#xff08;简称 RVC&#xff09;模型是一个基于 VITS&#xff08;Variational Inference with adversarial learning for end-to-end Text-to-Speech&#xff09;的简单易用的语音转换框架。 具有以下特点 简单易用&a…

chrome浏览器如何设置自动播放音视频

使用场景&#xff1a; 有些场景需要打开页面后&#xff0c;自动播放视频或者视频流&#xff0c;这时候发现无法播放&#xff0c;打开浏览器控制台发现有下面的错误提示&#xff1a;NotAllowedError: play() failed because the user didnt interact with the document first 。…

顶级出图效果!免费在线使用FLux.1 模型,5s出图无限制!

最近发现一个可以在线免费使用 FLux.1 模型 生成图片的AI工具。 先看效果图&#xff1a; 工具不需要登录即可使用&#xff0c;目前还是完全免费的&#xff0c;国内可以直接使用。 在提示词输入框直接输入提示词即可&#xff0c;选择图片比例之后&#xff0c;直接生图。 出图的…

安全运营之浅谈SIEM告警疲劳

闲谈&#xff1a; 刚开始学习SIEM、态势感知这类产品的时&#xff0c;翻阅老外们的文章总是谈什么真阳性&#xff0c;假阳性告警、告警疲劳&#xff0c;当时在国内资料中没找到很合理的解释&#xff0c;慢慢就淡忘这件事了。随着慢慢深入工作&#xff0c;感觉大概理解了这些概念…

‌技术人必看!如何科学规划,从需求出发打造完美技术方案

引言 在互联网架构师的角色中&#xff0c;我们面临的挑战不仅仅是编写代码&#xff0c;更重要的是深入理解需求、设计系统&#xff0c;并确保我们的解决方案能够稳定、高效地运行。本文将详细介绍从新需求提出到技术方案发布的全过程。 1. 理解现有需求和场景 在开始一个新的…

信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序 最大子矩阵和 给出 m行 n列的整数矩阵&#xff0c;求最大的子矩阵和(子矩阵不能为空)。 输入第一行包含两个整数 m和 n&#xff0c;即矩阵的行数和列数。之后 m行&#xff0c;每行 n个整数&#xff0c;描述整个矩阵。程序最终输出最大的子矩阵和。 &#xff08;最…