【C-查找】哈希查找

2024-09-06 10:28
文章标签 查找 哈希

本文主要是介绍【C-查找】哈希查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理


  • 建哈希表(哈希表下标是原数组元素经过哈希函数处理后的哈希值,哈希表值是原数组元素的下标或地址)

  • 将待查找值,经过哈希函数处理后,在哈希表中查询


有可能会触发哈希冲突

哈希冲突:两个不同数组元素,对应的哈希值是一样的,在哈希表的同一位置上

解决哈希冲突:开放寻址法、链表法




性能


时间复杂度:建哈希表O(n),查询O(1)



代码


1.0 哈希表在查找函数内

输入:数组地址,数组长度,待查找的目标

输出:找到就返回目标值的下标,找不到返回-1


#include <string.h>
//哈希表大小
#define MAXKEY 1000//哈希函数,处理数组元素返回哈希表下标
int hash(char *key) {int h = 0, g;while (*key) {h = (h << 4) + *key++;g = h & 0xf0000000;if (g)h ^= g >> 24;h &= ~g;}return h % MAXKEY;
}//输入:数组地址,数组长度,查询值
//输出:找到返回查询值在数组中的下标,或-1
int hash_search(char (*pArr)[100], int len, char *target)
{//建立哈希表//如果需要多次查询,可以将哈希表放在主函数内, 然后用参数引进来int hashTable[MAXKEY] = {0};    //初始化哈希表,所有元素设为-1memset(hashTable, -1, MAXKEY * sizeof(int));//给哈希表赋值//哈希表的下标,是经过哈希函数处理过的数组元素//哈希表的值,是数组元素的下标for (int i = 0; i < len; ++i) {hashTable[hash(pArr[i])] = i;}return hashTable[hash(target)];
}

这篇关于【C-查找】哈希查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141762

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i