哈希表实现

哈希表与散列表的原理及C++实现 哈希表(Hash Table)是一种高效的数据结构,用于存储键值对(Key-Value Pairs)。它通过哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为散列表)中的某个位置,从而实现快速的插入、查找和删除操作。哈希表的核心思想是通过哈希函数将键转换为数组的索引,从而直接访问对应的值。理想情况下,哈希表的插入、查找和删除操作的时间复杂度都是O(1)。哈希表是一种高效的数据结构,通过哈希函数将键映射到数组索引,从而实现快速的插入、查找和删除操作。 阅读详情

hash_table.h 

//
// Created on 2021/4/14.
//

#ifndef C_HASH_TABLE_H
#define C_HASH_TABLE_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>


    static long long n;

    struct hash_table {
        char *key;
        char *value;

        struct hash_table *next;
    } __attribute__((__packed__));

    struct hash_table *first_point;
    struct hash_table *current_point;

    /**
     * 哈希表根据key,获取值,时间复杂度:O(N)
     * @param key 键
     * @return 值得类型不确定,理论上可以为任何类型
     */
    void *hash_table_get(char *key) {
        struct hash_table *temp = first_point;
        while (temp != NULL) {
            if (temp->key == key) {
                return temp->value;
            } else {
                temp = temp->next;
            }
        }
        return NULL;
    }

    /**
     * 将键值对存入哈希表,时间复杂度:O(1)
     * @param key 键
     * @param value 值
     * @return
     */
    int hash_table_put(char *key, char *value) {
        struct hash_table *temp_hash_table;
        temp_hash_table = (struct hash_table*) malloc(sizeof(struct hash_table));
        temp_hash_table->key = key;
        temp_hash_table->value = value;
        temp_hash_table->next = NULL;

        if (current_point == NULL) {
            first_point = temp_hash_table;
            current_point = temp_hash_table;
        } else {
            current_point->next = temp_hash_table;
            current_point->next->next = NULL;
            current_point = current_point->next;
            current_point->next = NULL;
        }
        return 0;
    }

    /**
     * 移除某个键值对
     * @param key 键
     * @return
     */
    //int remove(char *key);

    /**
     * 哈希表大小,即键的个数,时间复杂度:O(N)
     * @return
     */
    long long hash_table_size() {
        struct hash_table *temp = first_point;
        while (temp != NULL) {
            n += 1;
            temp = temp->next;
        }
        return n;
    }

    /**
     * 判断哈希表是否为空,时间复杂度:O(1)
     * @return
     */
    bool hash_table_isEmpty() {
        return first_point == NULL;
    }

    /**
     * 哈希表所有键值对打印
     * @return
     */
    char *toString();

#ifdef __cplusplus
}
#endif

#endif //C_HASH_TABLE_H

main.c

#include <stdio.h>
#include "include/data_struct/hash_table.h"

int main() {
    printf("Hello, World!\n");
    hash_table_put("1", "2");
    hash_table_put("3", "4");
    hash_table_put("5", "6");
    hash_table_put("8", "9");
    hash_table_put("10", "11");
    hash_table_put("12", "13");
    hash_table_put("17", "18");

    char *value = "";
    value = hash_table_get("13");
    if (value == NULL) {
        printf("The hash table value of key is NULL\n");
    } else {
        printf("The hash table value of key 13 is %s\n", value);
    }

    printf("The hash table size is %ld\n", hash_table_size());

    if (hash_table_isEmpty()) {
        printf("The hash table is empty\n");
        printf("The hash table is %d\n", hash_table_isEmpty());
    } else {
        printf("The hash table is not empty\n");
        printf("The hash table is %d\n", hash_table_isEmpty());
    }
    return 0;
}

待续!

 

散列表/哈希表(C语言简单实现) 散列表/哈希表(C语言简单实现) 本文参考自《大话数据结构》 定义 通过某个函数f计算出记录的存储位置,而不需要通过比较,这就是一种新的存储技术——散列技术。 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key) 。在查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。 我们把这种对应关系f称为散列函数,又称为哈希函数。按照这个思路,采用散列技术将记录存储在一块连续的存储 阅读详情

相关推荐

散列表性质与实现

原文转自:  http://blog.youkuaiyun.com/intrepyd/article/details/4359818

飞扬的青春的专栏 1295

哈希表(散列表)C/C++代码实现

哈希表(散列表): 1,构造散列函数 最常用的方法是除留余数法: H(key) = key%p 这个方法的关键是选取适当的p, 一般情况下,可以选p为小于表长的最大质数。例如表长m=100, 可取p=97。 2,处理冲突 选择一个 “好” 的散列函数可以在一定程度上减少冲突,但在实际应用中,很难完全避免发生冲突 1,开放地址法 (1)线性勘测法 (2)二次探测法 (3)伪随机探测法 线性探测法的优点是:只要散列表未填满,总能 找到一个不发生冲突的地址。缺点是:会产生 ”二次聚集“ 现象。而二次探测法和伪随机

Ycy的博客 1万+

HashSet和HashMap的底层实现——哈希表、散列表

java.lang  类 Object java.lang.Object int hashCode()            返回该对象的哈希码值。 boolean equals(Object obj)           指示某个其他对象是否与此对象“相等”。 一、概述 java最基本的两种数据结构

lpp1234567的专栏 7370

基于散列表(线性探查的哈希表和链式散列)的字典实现

字典的另一种表示是散列。它用一个散列函数(也称哈希函数)把字典的数对映射到一个散列表(也称哈希表)的具体位置。与跳表相比,它把操作的时间提高到渐近等于1,但最坏情况下依然是渐近等于N。但是如果经常输出所有元素或按照顺序查找元素(如查找第10个最小元素之类),跳表的执行效率将优于散列。 基于跳表的字典实现 散列函数和散列表 1.桶和起始桶 当关键字范围太大,不能用理想方法表示时,可以采用并不理想的散...

sinat_40408114的博客 1748

Unity接入Google登录:Credential Manager完整集成指南与避坑实践

在移动应用开发中,第三方登录是提升用户体验和降低注册门槛的关键技术。其核心原理是通过OAuth 2.0等授权协议,安全地获取用户在平台的身份凭证。对于面向海外市场的Unity应用,Google登录因其庞大的用户基数成为首选方案。然而,随着Android系统更新和隐私政策收紧,传统的WebView登录方式面临兼容性挑战。Credential Manager作为Google推出的现代化凭据管理API,通过系统级集成解决了这一问题,它统一了密码、通行密钥和第三方登录的调用接口,显著提升了登录成功率和原生体验。在U

weixin_28025327的博客 320

Dataset - DeepFashion 服装数据集

Dataset - DeepFashion 服装数据集 [Dataset - DeepFashion] [Project - DeepFashion] 1. 服装类别和属性预测集 [Category - Attribute 下载] [百度网盘] 289,222 张服装图片 clothes images; 50 个服装类别 clothing categories 1,000 ...

长风破浪会有时,直挂云帆济沧海 2万+

哈希表(散列表) C++实现

文章目录哈希函数哈希函数的构造方法处理散列冲突的方法散列表性能分析散列表C++代码实现 哈希函数 哈希函数就是 关键字Key 到 值Value 的映射: Value = f(Key) Value反映的是关键字Key的存储地址。 哈希函数的构造方法 直接定址法 f(Key) = a * Key + b 例如存放不同出生年份的人口数量,出生年份是关键字,那么可以用直接定址法。 直接定址法的优点是简单均匀,也不会产生冲突;缺点是该方法适合表比较小且连续的情况,所以 该方法虽然简单但是并不常用。 数

Worthy_Wang的博客 1848

CFD-POST中建立变量的方法

本文以测量文丘里管中全压为例阐述CFD_POST中建立变量的方式 点击进入CFD-POST界面的expressions栏中 2.与expression栏中空白处右键,new-输入新建的表达式名称 3. 在下方的空白栏中右键-varible选择需要的变量,并根据公式进行修改 4.点击进入varibles栏,空白处右击-new-输入变量名totalpressure,在下拉框中找到之前定义的totalpressure 完成后可以在varibles栏中看到新建的...

sidxi的博客 1万+

java实现简单的散列表(哈希表)

前情提要:众所周知,散列表(哈希表)是一种根据关键码值而直接进行访问的数据结构,即通过将关键码值映射到表中的一个位置来访问记录,以加快查找的速度。映射的函数叫散列函数,存放记录的数组叫散列表 使用java的面向对象思维来编写会很好理解:解析都在代码里 import java.util.Scanner; /** * @author Administrator * 2020-04-11-1...

weixin_44157472的博客 359

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7274

自动化上位机开发C#100例:如何用面向对象的方式封装雷赛运动控制卡EtherCAT总线卡(C#代码)

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类。

十多年IT经验,专注机器视觉,智能制造半导体行业 5031

哈希表(散列表)的代码实现及介绍

文章目录一、哈希表(散列表)1.解释2.代码实现二、字典树(前缀树)1.简单介绍2.代码实现三、探讨学习 一、哈希表(散列表) 1.解释 这里引入百度百科的解释: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。 也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地

GGB__的博客 583

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1183

C++ 哈希表实现

什么叫做哈希表?相信大家在很多地方都听过哈希表这三个字。在之前,我看到java之父余胜军装小白面试的时候,对哈希表那是侃侃而谈,非常的羡慕他对哈希表的理解,在学习哈希表过后,我发现他的难度还不一定比得上红黑树,那让我们今天来揭开哈希表的神秘面纱。哈希表跟set和map结构类似,库函数如果是unordered_set,那就是Key模型库函数如果是unordered_map,那就是Key,Value模型。表我们很容易理解,那么什么是哈希?

kkbca的博客 1510

GD32F303标准库开发:Keil5新建GD32标准库工程

GD32F303标准库开发:Keil5新建GD32标准库工程

MQ0522的博客 8902

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

散列表(哈希表)各种方法实现

本文为散列表(哈希表)的源代码,如若想看算法具体介绍请点击下面链接: http://blog.youkuaiyun.com/aytfly/article/details/8986920   /** * @brief Hash Table * @author An * @data 2013.5.28

aytfly的专栏 875

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java实现哈希表(散列表)

Java实现哈希表(散列表)

qq_64431576的博客 2580

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

哈希表(散列表)介绍及实现

提供一个仿函数来把string或者其他自定义类型通过某种映射的方式把他们转换为整形 然后再用这里的映射关系二次映射这里用string来举例我们可以用仿函数的方式来解决但是这种string映射为int的方式是不好的 很容易就发生重复 例如 abc acb bbb他们映射为整形的结果是一模一样的我们可以用下面这种映射关系把string映射为int 这里的131 就是一个质数 是有人专门研究过的 可以最大程度上减小冲突这样哈希表就支持string类型的使用了。

moringlightyn的博客 1132

C++中的unordered_set,unordered_map,哈希表/散列表以及哈希表的模拟实现

本节首先介绍了unordered_set和unordered_map,然后借此引出了哈希/散列和哈希表/散列表的概念;然后着重分析了哈希表这一数据结构,提到了哈希函数和哈希冲突处理方法这两个概念,再分别介绍了常用的哈希函数:直接定址法和除留余数法,常用的哈希冲突处理:闭散列开放定址法(线性探测,二次探测)和开散列哈希桶法,同时就如何支持多种类型的key来使用的问题,以string为例进行了详细分析

tianxhiliangtadi的博客 1294

散列表(哈希表的实现以及详细分析)

看了b站的视频关于散列表的代码实现,我个人又加了自己的理解,注解了散列表各个代码的具体功能,应该比较详细 class HashTable: """哈希表的建立""" def __init__(self): self.size=11 #初始化哈希表的大小,这里建议选取质数作为初始大小(否则在解决冲突时如果使用开放定址法会出现死循环导致数据无法存放的问题) self.slots=[None]*self.size #初始化key的列表 self.da

m0_46377561的博客 290

哈希表(散列表)简单实现

来自百度 若结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。 * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。 * 综上所述,根

ylf13的专栏 1436

散列表/哈希表(hash table)- C++实现

散列表又称哈希表,查找只需要花费常数时间,查找效率极高,对庞大数据的查找很有作用。 散列表解决冲突的方式有多种,这里采用了分离链接法,除此外还有开放地址法和双散列。 Vocabulary类是用来储存单词的类,用于实现一个离线词典的数据方案,当然这并不是最高效的方法,但是我认为是比较容易理解的方法,对于初学哈希表的人来说还是比较容易接受的。 1 /*******************...

weixin_34162401的博客 299

散列表(哈希表)的实现

散列函数直接用key%size的形式,size为散列表的大小。 冲突处理采用平方探测法,为保证可以探测到整个散列表空间,散列表大小设置为4k+3形式的素数。 当散列表中的元素过多时会造成性能下降,这时应该倍增散列表的大小,重新计算原来散列表中每个元素在新的散列表中的位置。 散列表的实现 // HashTable.cpp : 定义控制台应用程序的入口点。 // #inc

Marshall的专栏 1610

链接法(chaining)构建散列表(hash table)(C++实现)

散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名x到首字母F(x)的一个函数关系),在首

hustyangju的足迹 4297

数据结构—散列表(哈希表)的原理以及Java代码的实现

本文详细介绍了散列表的概念、散列函数的选择、散列冲突的解决办法,并且最后提供了一种散列表的Java代码实现。

终生学习践行者 5103
上一篇: shell脚本笔记
下一篇: JAVA实现IP排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值