散列的使用

散列

散列简单来说:给N个正整数和M个负整数,问这M个数中的每个数是否在N中出现过。

比如:N:{1,2,3,4},M{2,5,7},其中M的2在N中出现过
对这个问题最直观的思路是:对M中每个欲查的值x,都在N中遍历一次,时间复杂度为 O(NM),但当N和M的值很大时,显然无法承受

所以,我们可以设定一个bool型数据 hashTable[100010],其中hashTable[x]== true 表示正整数x在N个正整数中出现过,而hashTable[x]= false表示正整数x在N个正整数中没有出现过。这样就可以在一开始读入N个正整数时就进行预处理,即当读入的数为x时,就令hashTable[x] = true (说明: hashTable 数组需要初始化为false,表示初始状态下所有数都未出现过)。 于是,对M个欲查询的数,就能直接通过hashTable数组判断出每个数是否出现过。显然这种做法的时间复杂度为O(N+M),代码如下:

#include<cstdio>
const  int  maxn=1;            //见注1  //maxn的值可以取大于0的任意数
bool hashTable[maxn]={false};  //见注2
int main()
{int n,m,x;printf("输入n m的值\n"); scanf("%d%d",&n,&m);      //输入nm两个数组各自的长度for(int i=0;i<n;i++){printf("输入第一组参照的第%d个x的值\n",i+1); scanf("%d",&x);           //键盘输入n的数据hashTable[x]=true; }for(int i=0;i<m;i++){   printf("输入第二组的第%d个值\n",i+1); scanf("%d",&x);       //键盘输入m的数据if(hashTable[x]==true)  //判断数据相同{printf("yes\n");    //相同则返回yes,否则返回no}elseprintf("no\n");}
}

注1:/* const 允许指定一个语义约束,编译器会强制实
施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,
就应该明确使用const,这样可以获得编译器的帮助。 即const是使这个值固定不再改变*/

注2:bool类型 为逻辑型,它的值只有true(1)和false(0)两种值。
空间换时间,定义一个bool型数组hashTable[100010],其中hashTable[x]==true表示正整数x在N个正整数中出现过。这样就可以在一开始读入N个正整数的时候就进行预处理。
同样的,如果题目要求M个欲查询的数中每个数在N个数中出现的次数,那么可以把nastTable数组替换为int型,然后在输入N个数时进行预处理,即当输入的数为x时,就令nhashTable[x]++,这样就可以用O(N + M)的时间复杂度输出每个欲查询的数出现的次数。代码如下:

#include<cstdio>
const  int  maxn=1;       /*  const 允许指定一个语义约束,编译器会强制实
施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,
就应该明确使用const,这样可以获得编译器的帮助。*/
bool hashTable[maxn]={false};
int main()
{int n,m,x;printf("输入n m的值\n"); scanf("%d%d",&n,&m);for(int i=0;i<n;i++){printf("输入第一组参照的第%d个x的值\n",i+1); scanf("%d",&x);hashTable[x]=true; }for(int i=0;i<m;i++){   printf("输入第二组的第%d个值\n",i+1); scanf("%d",&x);if(hashTable[x]==true){printf("yes\n");}elseprintf("no\n");}
}

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

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

相关文章

关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题

关于C中的unordered_map和unordered_set不能直接以pair作为键名的问题 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于红黑树实现的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希实现的&#xff0c;在不要求容器内的键有序&#xff0c…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

Python、C++ lambda 表达式

Python、C lambda 表达式 lambda函数简介 匿名函数lambda&#xff1a;是指一类无需定义标识符&#xff08;函数名&#xff09;的函数或子程序。所谓匿名函数&#xff0c;通俗地说就是没有名字的函数&#xff0c;lambda函数没有名字&#xff0c;是一种简单的、在同一行中定义函…

python 学习2 /输入/ 输出 /列表 /字典

python基础学习第二天 输入输出 xinput("输入内容") print(x)input输出&#xff1a; eval :去掉字符串外围的引号&#xff0c;按照python的语法执行内容 aeval(12) print(a)eval输出样式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;删去…

Linux、Mac 命令行快捷键

Linux、Mac 命令行快捷键 Linux 命令行编辑快捷键&#xff0c;参考了好多个&#xff0c;应该算是比较全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;笔者本人比较常用的也已经红色标出来了&#xff0c;如有错误或遗漏&#xff0c;欢迎留言指出。 光标移动及编辑&#xff…

Python 命令行传参

Python 命令行传参 说到 python 命令行传参&#xff0c;可能大部分人的第一反应就是用 argparse。的确&#xff0c;argparse 在我们需要指定多个预设的参数&#xff08;如深度学习中指定模型的超参数等&#xff09;时&#xff0c;是非常有用的。但是如果有时我们只需要一个参数…

快速排序 C++

快速排序 C 本文图示借鉴自清华大学邓俊辉老师数据结构课程。 快速排序的思想 快速排序是分治思想的典型应用。该排序算法可以原地实现&#xff0c;即空间复杂度为 O(1)O(1)O(1)&#xff0c;而时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 。 算法将待排序的序列 SSS 分为两个子…

Linux命令行下感叹号的几个用法

Linux命令行下 " ! " 的几个用法 ! 在大多数编程语言中表示取反的意思&#xff0c;但是在命令行中&#xff0c;他还有一些其他的神奇用法。熟练掌握这些用法&#xff0c;可以大大提高我们日常命令行操作的效率。 1 执行历史命令 !! ! 在命令行中可以用来执行历史…

三地址码简介

三地址码简介 三地址码&#xff08;Three Address Code&#xff09;是一种最常用的中间语言&#xff0c;编译器可以通过它来改进代码转换效率。每个三地址码指令&#xff0c;都可以被分解为一个四元组&#xff08;4-tuple&#xff09;的形式&#xff1a;&#xff08;运算符&am…

llvm与gcc

llvm与gcc llvm 是一个编译器&#xff0c;也是一个编译器架构&#xff0c;是一系列编译工具&#xff0c;也是一个编译器工具链&#xff0c;开源 C11 实现。 gcc 相对于 clang 的优势&#xff1a; gcc 支持更过语言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手区解题 view_source / robots / backup

1**. view_source** 题目描述&#xff1a;X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 f12查看源码即可发现flag 2. robots 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教…

python参数传递*args和**kwargs

python参数传递*args和**kwargs 和* 实际上真正的Python参数传递语法是 * 和 ** 。*args 和 **kwargs 只是一种约定俗成的编程实践。我们也可以写成 *vars 和 **kvars 。就如同其他常规变量的命名一样&#xff0c; args 和 kwargs 只是一种习惯的名称。 *args 和 **kwargs 一…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次编译,到处运行是如何实现的

Java一次编译&#xff0c;到处运行是如何实现的 转自&#xff1a;https://cloud.tencent.com/developer/article/1415194 &#xff08;排版微调&#xff09; JAVA编译运行总览 Java是一种高级语言&#xff0c;要让计算机执行你撰写的Java程序&#xff0c;也得通过编译程序的…

JIT(动态编译)和AOT(静态编译)编译技术比较

JIT&#xff08;动态编译&#xff09;和AOT&#xff08;静态编译&#xff09;编译技术比较 转自&#xff1a;https://www.cnblogs.com/tinytiny/p/3200448.html Java 应用程序的性能经常成为开发社区中的讨论热点。因为该语言的设计初衷是使用解释的方式支持应用程序的可移植…

python解释器

python解释器 计算机编程语言 本部分参考自&#xff1a;https://zhuanlan.zhihu.com/p/141212114 从计算机编程语言说起&#xff0c;它主要分为三类&#xff1a;机器语言、汇编语言、高级语言。 机器语言是一种计算机可以直接识别并执行的二进制指令集。由于其可以直接交给…

编译型语言与解释型语言

编译型语言与解释型语言 首先要说明&#xff0c;编译型语言与解释型语言这种分类方法是不科学的&#xff0c;或者说已经过时了&#xff0c;但是这种称呼大抵还是能够让人明白我们将要讨论的是什么东西。 文中所列参考是笔者认为比较有帮助的一些扩展阅读内容。 首先贴一个很形…

常见的各种shell及其区别

常见的各种shell及其区别 引子 for((i1;i<10;i)); do echo $(expr $i \* 3 1); done 网上搜到的 shell for循环脚本&#xff0c;别人都能正常运行&#xff0c;我却报错&#xff1a; Syntax error: Bad for loop variable究竟是怎么回事呢&#xff1f; shell简介…

shell脚本 变量

shell脚本 变量类型 什么是Shell变量 用一个固定的字符串去表示不固定的内容。 Shell变量的类型 shell脚本中自定义变量的类型&#xff0c;我们这里分为&#xff1a; 自定义变量环境变量位置变量与定义变量 这四类&#xff0c;它们有一些相同点&#xff0c;但又有些不同点…