首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C和Java实现哈希表

哈希表是一种常见的数据结构,用于存储键值对。它通过将键映射到一个固定大小的数组索引来实现快速的插入、查找和删除操作。在C和Java中,我们可以使用不同的方法来实现哈希表。

在C中,我们可以使用数组和链表的组合来实现哈希表。具体步骤如下:

  1. 定义一个固定大小的数组,用于存储链表的头节点。
  2. 创建一个哈希函数,将键映射到数组索引。
  3. 当插入一个键值对时,通过哈希函数计算出数组索引,然后将键值对插入到对应链表的末尾。
  4. 当查找或删除一个键值对时,通过哈希函数计算出数组索引,然后在对应链表中遍历查找或删除。

以下是C语言实现哈希表的示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

#define SIZE 10

// 定义哈希表节点
typedef struct Node {
    int key;
    int value;
    struct Node* next;
} Node;

// 创建哈希表
Node** createHashTable() {
    Node** hashTable = (Node**)malloc(sizeof(Node*) * SIZE);
    for (int i = 0; i < SIZE; i++) {
        hashTable[i] = NULL;
    }
    return hashTable;
}

// 哈希函数
int hashFunction(int key) {
    return key % SIZE;
}

// 插入键值对
void insert(Node** hashTable, int key, int value) {
    int index = hashFunction(key);
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->key = key;
    newNode->value = value;
    newNode->next = NULL;

    if (hashTable[index] == NULL) {
        hashTable[index] = newNode;
    } else {
        Node* curr = hashTable[index];
        while (curr->next != NULL) {
            curr = curr->next;
        }
        curr->next = newNode;
    }
}

// 查找键对应的值
int find(Node** hashTable, int key) {
    int index = hashFunction(key);
    Node* curr = hashTable[index];
    while (curr != NULL) {
        if (curr->key == key) {
            return curr->value;
        }
        curr = curr->next;
    }
    return -1;  // 未找到
}

// 删除键值对
void remove(Node** hashTable, int key) {
    int index = hashFunction(key);
    Node* curr = hashTable[index];
    Node* prev = NULL;
    while (curr != NULL) {
        if (curr->key == key) {
            if (prev == NULL) {
                hashTable[index] = curr->next;
            } else {
                prev->next = curr->next;
            }
            free(curr);
            return;
        }
        prev = curr;
        curr = curr->next;
    }
}

// 打印哈希表
void printHashTable(Node** hashTable) {
    for (int i = 0; i < SIZE; i++) {
        printf("Index %d: ", i);
        Node* curr = hashTable[i];
        while (curr != NULL) {
            printf("(%d, %d) ", curr->key, curr->value);
            curr = curr->next;
        }
        printf("\n");
    }
}

int main() {
    Node** hashTable = createHashTable();

    insert(hashTable, 1, 10);
    insert(hashTable, 2, 20);
    insert(hashTable, 11, 30);
    insert(hashTable, 21, 40);

    printf("哈希表:\n");
    printHashTable(hashTable);

    int value = find(hashTable, 11);
    printf("键11对应的值为:%d\n", value);

    remove(hashTable, 2);

    printf("删除键2后的哈希表:\n");
    printHashTable(hashTable);

    return 0;
}

在Java中,我们可以使用Java集合框架中的HashMap类来实现哈希表。HashMap类已经封装了哈希函数和相关操作,使用起来更加方便。以下是Java语言实现哈希表的示例代码:

代码语言:txt
复制
import java.util.HashMap;

public class HashTableExample {
    public static void main(String[] args) {
        HashMap<Integer, Integer> hashTable = new HashMap<>();

        hashTable.put(1, 10);
        hashTable.put(2, 20);
        hashTable.put(11, 30);
        hashTable.put(21, 40);

        System.out.println("哈希表:");
        System.out.println(hashTable);

        int value = hashTable.get(11);
        System.out.println("键11对应的值为:" + value);

        hashTable.remove(2);

        System.out.println("删除键2后的哈希表:");
        System.out.println(hashTable);
    }
}

以上就是用C和Java实现哈希表的方法和示例代码。哈希表在实际开发中广泛应用于数据存储和查找的场景,例如缓存、索引、字典等。腾讯云提供了多种云计算相关产品,如云数据库、云服务器、云存储等,可以根据具体需求选择适合的产品。更多关于腾讯云产品的信息,请参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • C++【哈希的模拟实现

    ,映射 至中对应的位置,实现存储,利用空间换时间,哈希的查找效率非常高,可以达到 O(1),哈希实现主要分为两种:闭散列 与 开散列,本文中将利用这两种方案实现哈希 ---- ️正文 1、模拟实现哈希...传统写法思路:创建一个容量足够的 新,将 原 中的数据映射至 新 中,映射完成后,交换 新 ,目的是为了更新当前哈希对象中的 关于 平衡因子 的控制 根据别人的试验结果,哈希中的存储的有效数据量超过哈希容器的...---- 3、源码 本文中涉及的所有代码位于下面这个 Gitee 仓库中 《哈希的模拟实现》 ---- 总结 以上就是本次关于 C++【哈希的模拟实现】的全部内容了,在本文中,我们主要对哈希的两种实现方式...:闭散列与开散列(哈希桶)进行了简单模拟实现,学习了 线性探测 单链表 这两种哈希冲突的解决方法,之前觉得没什么的单链表,在此处闪闪发光 ---- 相关文章推荐 C...++ 进阶知识 C++【初识哈希C++【一棵红黑树封装 set map】 C++【红黑树】 C++【AVL树】 C++【set map

    22510

    哈希函数哈希

    其核心就是哈希函数哈希的应用! 哈希函数 哈希函数又称为散列函数,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。...哈希就是这么做的,一会再说!...哈希函数映射 哈希 哈希就是利用哈希函数,可以根据关键码而直接进行访问的数据结构,也就是将关键码(Key value)通过哈希函数映射到中的一个位置来进行访问。...因此对于JAVA中(C++标准中没有hashmap,只有第三方的),hashmap的实现也是类似,但是有一点改进,也就是如果发生冲突,将冲突对象添加到链表,假设冲突个数达到了8次,那么就会使用红黑树来代替链表...C++中的hash_map c++的hash_mapmap的用法很类似,但一定要区别,maphash_map虽然都是key-value形式,但是map的底层是红黑树,而hash_map的底层是hash

    1.5K20

    C++】————哈希

    哈希(Hash Table),作为其中一颗璀璨的明珠,以其独特的魅力卓越的性能,在众多数据存储检索场景中大放异彩。 哈希,这个看似神秘却又充满力量的概念,其实与我们的日常生活息息相关。...这背后,哈希都在默默发挥着关键作用。 哈希的神奇之处在于它能够在平均情况下以接近常数的时间复杂度完成数据的插入、查找删除操作,这使得它在处理大规模数据时具有极高的效率。...1.2unordered_set unordered_set在线文档说明 unordered_set中的每个元素都是唯一的,因为它不允许有重复的元素 元素的存储顺序是不确定的,它取决于当前的哈希容器当前的哈希的状态...由于使用的哈希,它提供了平均情况下常数时间复杂度的查找、插入删除操作 这里介绍的两个unordered系列的关联式容器mapset还是有点相似的,我们再来几道题目来熟练掌握它们的使用 重复n次的元素...闭散列: 也叫开放定址法,当发生哈希冲突时,如果哈希未被装满,说明在哈希中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去 线性探测 如果上面讲的一样,现在需要插入元素55

    11710

    哈希函数哈希

    我们将这16字节的输出域分为两半,高八位,低八位是相互独立的(这16位都相互独立)。...故此可以通过以下算式得到1000个哈希函数: f1+2f2=f3 f1+3f2=f4 f1+3*f2=f5 …… Hash 哈希的经典结构 在数据结构中,哈希最开始被描述成一个指针数组,...我们知道,哈希中存入的数据是key,value类型的,哈希能够put(key,value),同样也能get(key,value)或者remove(key,value)。...对于常见的几种数据结构来说,数组的特点是:容易寻址,但是插入删除困难。而链表的特点是:寻址困难,但是插入删除容易。...而对于哈希来说,它既容易寻址,同样插入删除容易,这一点我们从它的数据结构中是显而易见的。

    72530

    Java哈希以及哈希冲突

    文章目录 Java哈希 概念 冲突 避免冲突 哈希函数的设计方法 常见哈希函数 负载因子调节 为什么负载因是0.75 解决哈希冲突两种常见的方法是:闭散列开散列 哈希 java 类集的关系 Java...设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址 该方法进行搜索不必进行多次关键码的比较...已知哈希中已有的关键字个数是不可变的,那我们能调整的就只有哈希中的数组的大小。...的位运算比乘除的效率更高, 所以取3/4在保证hash冲突小的情况下兼顾了效率; 解决哈希冲突两种常见的方法是:闭散列开散列 解决哈希冲突两种常见的方法是:闭散列开散列 哈希 java 类集的关系...HashMap HashSet 即 java 中利用哈希实现的 Map Set java 中使用的是哈希桶方式解决冲突的 java 会在冲突链表长度大于一定阈值后,将链表转变为搜索树(红黑树

    1K20

    C++深度探索】哈希介绍与实现

    哈希函数将输入数据转化为哈希值,这个哈希值通常是一个整数,用来表示原始数据。通过将数据的哈希值与存储空间进行映射,可以使得数据的存储访问更加高效。...该方法进行搜索不必进行多次关键码的比较,因此搜索的速度比较快。 2....}; 因为上述哈希是使用数组来实现的,删除一个数据是将该位置的状态置成DELETE状态,我们不能简单的置为EMPTY,这是因为查找时,如果该位置是空状态我们没办法确定后面有没有值,因为该位置可能被删除了...二次探测:通过使用一个二次函数来计算下一个探测位置,例如: h(k,i) = (h(k) + c1 * i + c2 * i^2) mod M 其中h(k)为元素的哈希值,i为探测序列号,c1c2是用于探测的常数...结语   在C++中,哈希(Hash)是一种常用的数据结构技术,用于将数据转换为固定长度的哈希值。哈希值是唯一的,可以用于快速查找、比较索引。以上就是今天所有的内容啦 ~ 完结撒花 ~

    15310

    C++:哈希:闭散列哈希

    哈希的概念 哈希就是通过哈希映射,让key值与存储位置建立关联。...可以把具有不同关键码而具有相同哈希地址的数据元素称为“同义词”。比如在上面的图中,可以看到24都为哈希冲突现象。...闭散列 为了解决哈希冲突,有闭散列开散列两种常见方法。接下来先介绍闭散列。...闭散列哈希的简单代码实现: 定义哈希存储的节点,使用状态来表示闭散列中元素的删除或空位置。 //定义状态。...负责因子的计算方法是哈希中有效数据个数/哈希的大小。 扩容的方法:创建一个新的哈希对象,然后遍历旧的哈希,根据旧的哈希的数据来重新计算数据的位置。

    43420

    哈希哈希冲突(手动实现哈希桶)

    哈希桶(开散列法) 四、哈希桶的手动代码实现 五、哈希查找算法(基于线性探测法的实现) ---- 一、哈希是什么 哈希(Hash table)又称散列表,是一种存储结构,通常用来存储多个元素。...其它存储结构(线性、树等)相比,哈希查找目标元素的效率非常高。...,这个时候我们就可以将这个所谓的小集合搜索问题继续进行转化,例如: 每个桶的背后是另一个哈希 每个桶的背后是一棵搜索树 四、哈希桶的手动代码实现 /** * 哈希桶解决hash冲突(哈希桶的模拟实现...(基于线性探测法的实现哈希查找算法就是利用哈希查找目标元素的算法。...如下是使用哈希查找算法在 {5, 20, 30, 50, 55} 序列中查找 50 的 Java 程序: public class Demo { //哈希函数 public static int hash

    71530

    C++】哈希封装实现 unordered_map unordered_set

    三、哈希封装实现 unordered_map unorderd_set 四、模拟实现完整代码 1、HashTable.h 2、unordered_map 3、unordered_set 4、test.cpp...(注:Java 中就不存在这个问题,Java 中的 map set 取名为 TreeMap TreeSet,unordered_map unordered_set 取名为 HashMap ...+ Reference (cplusplus.com) ---- 二、哈希的迭代器 红黑树一样,哈希也需要单独定义一个类来实现迭代器,不过由于哈希的迭代器是单向的,所以我们不用实现 operator...类;这是因为我们下面要使用哈希来封装实现 unordered_map unordered_set; 前面 红黑树封装实现 map set 一样,我们通过封装 哈希 的普通迭代器来实现 unordered_map...---- 三、哈希封装实现 unordered_map unorderd_set 哈希封装实现 unordered_map unorderd_set 其实与 红黑树封装实现 map set

    1.4K30

    c++】哈希>unordered容器&&哈希&&哈希桶&&哈希的应用详解

    解决哈希冲突两种常见的方法是:闭散列开散列 2.4.1 闭散列 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希未被装满,说明在哈希中必然还有空位置,那么可以把key存放到冲突位置中的“下一个..., DELETE}; 2.4.1.1.3 线性探测的实现 // 注意:假如实现哈希中元素唯一,即key相同的元素不再进行插入 // 为了实现简单,此哈希中我们将比较直接与元素绑定在一起 template...问题来了,新闻客户端推荐系统如何实现推送去重的? 服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。如何快速查找呢?...哈希存储用户记录,缺点:浪费空间 位图存储用户记录,缺点:位图一般只能处理整形,如果内容编号是字符串,就无法处理 将哈希与位图结合,即布隆过滤器 4.2.2 布隆过滤器概念 布隆过滤器是由布隆...(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是多个哈希函数,将一个数据映射到位图结构中

    18710

    哈希算法 数据结构_实现哈希构造查找算法

    一、什么是哈希 1.概述 哈希(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。...通俗的理解一下: 如果我们有n个元素要存储,那我们就用l个内存单元来存储他们 然后我们有一个哈希函数f(x),我们把元素n函数计算得到哈希值,也就是f(n) f(n)就是存储元素n的那个内存单位的位置...,也就是元素在l中的下标 2.为什么哈希查询速度快 理解了哈希的基本思路,我们也就不难理解为什么哈希查询效率高了: 由于每个元素都能通过哈希函数直接计算获得地址,所以查找消耗时间非常少。...对此我们有两种方法,即开放地址法分离链表法: 开放地址法:如果某一哈希值对应的位置已经被占用了,就找另一个没被占用的位置。...二、代码实现 在这里我们实现一个基于分离链表法的哈希: 1.节点类 /** * @Author:huang * @Date:2020-06-20 10:19 * @Description:节点

    59920

    C++】哈希 ---开散列版本的实现

    1 前言 上一篇文章,我们介绍了哈希的基本概念: 哈希(Hash Table)是一种数据结构,它通过哈希函数将键映射到中的一个位置来访问记录,支持快速的插入查找操作。...如果多个key出现相同的映射位置,此时就发生了哈希冲突,就要进行特殊处理:闭散列开散列。...开散列:又叫链地址法(开链法),其核心是每个位置是以链表结构储存,遇到哈希冲突就将数据进行头插。 我们已经实现了闭散列版本的哈希,今天我们来实现开散列版本的哈希哈希桶)!...2 开散列版本的实现 我们先来分析一下,我们要实现哈希桶需要做些什么工作。开散列本质上是一个数组,每个位置对于了一个映射地址。开散列解决哈希冲突的本质是将多个元素以链表进行链接,方便我们进行寻找。...我们简单实现最基本的工作:插入 , 删除查找就可以。 需要注意的是,我们需要通过对应的哈希函数来将不同类型的数据转换为size_t类型,这样才能映射到数组中 //仿函数!

    11710

    Java数据结构算法(十三)——哈希

    Hash也称散列表,也有直接译作哈希,Hash是一种根据关键字值(key - value)而直接进行访问的数据结构。...我们可能想到每个单词会占用一个数组单元,那么数组的大小是5000,同时可以数组下标存取单词,这样设想很完美,但是数组下标单词怎么建立联系呢?   ...②、装填因子   已填入哈希的数据项长的比率叫做装填因子,比如有10000个单元的哈希填入了6667 个数据后,其装填因子为 2/3。...方法是把关键字用不同的哈希函数再做一遍哈希化,这个结果作为步长。对于指定的关键字,步长在整个探测中是不变的,不过不同的关键字使用不同的步长。   ...hashFunction(key); LinkNode node = hashArray[hashVal].find(key); return node; } }   链地址法中,装填因子(数据项数哈希容量的比值

    1.1K80

    C++】哈希 --- 闭散列版本的实现

    1 C++中的哈希 哈希(Hash Table)是一种数据结构,它通过哈希函数将键映射到中的一个位置来访问记录,支持快速的插入查找操作。 哈希的概念最早可以追溯到1953年,由H. P....他首次描述了使用哈希函数来加速数据检索的过程。随后,这一概念在数据库管理系统编程语言中得到广泛应用。 在计算机科学中,哈希的发展与算法和数据处理的需求紧密相关。...在C++中unordered系列关联式容器是哈希C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 log_2N ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时...) 散列表分为闭散列开散列,这是两种完全不同的方式,但是底层都是数组: 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希未被装满,说明在哈希中必然还有空位置,那么可以把key存放到冲突位置中的...3 闭散列版本的实现 下面我们来实现闭散列版本的哈希 3.1 框架搭建 首先我们需要进行一个简单的框架搭建: 我们需要一个HashData类,来储存数据 HashTable类底层是vector容器

    9410

    C++:哈希unordered系列容器的封装

    最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是 其底层结构不同(哈希...(2) 除留余数法(常用) 设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址 哈希实现就是的这个方法...,其底层的是除留余数法, 解决其哈希冲突的方法有两种,即开放定址法拉链法。...2.4 开放定址法实现简单哈希 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希未被装满,说明在哈希中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。...//自己实现的时候 一定要一步一步来, 先封装哈希 然后再封装简单的mapset 然后再封装迭代器让插入跑起来,然后再去考虑其他的一些细节问题, 不要一下子把所有的模板参数都加上 //要一步一步来

    8610
    领券