当前位置: 首页 > news >正文

一站式 wordpress泰安企业网站制作

一站式 wordpress,泰安企业网站制作,清远网站seo公司,合肥地区网站制作哈希表是根据关键码的值而直接进行访问的数据结构。 数组就是⼀张哈希表。 哈希表中关键码就是数组的索引下标#xff0c;然后通过下标直接访问数组中的元素#xff0c;如下图所示#xff1a; 那么哈希表能解决什么问题呢#xff0c;一般哈希表都是用来快速判断⼀个元素是…哈希表是根据关键码的值而直接进行访问的数据结构。 数组就是⼀张哈希表。 哈希表中关键码就是数组的索引下标然后通过下标直接访问数组中的元素如下图所示 那么哈希表能解决什么问题呢一般哈希表都是用来快速判断⼀个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n)但如果使用哈希表的话只需要O(1)就可以做到。 我们只需要初始化把这所学校里学生的名字都存在哈希表里在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。 哈希函数 哈希函数把学生的姓名直接映射为哈希表上的索引然后就可以通过查询索引下标快速知道这位同学是否在这所学校里了。 哈希函数如下图所示通过hashCode把名字转化为数值一般hashcode是通过特定编码方式可以将其他数据格式转化为不同的数值这样就把学生名字映射为哈希表上的索引数字了。 如果hashCode得到的数值大于哈希表的大小了也就是大于tableSize了怎么办呢 此时为了保证映射出来的索引数值都落在哈希表上我们会在再次对数值做一个取模的操作就要我们就保证了学生姓名一定可以映射到哈希表上了。 此时问题又来了哈希表我们刚刚说过就是一个数组。 如果学生的数量大于哈希表的大小怎么办此时就算哈希函数计算的再均匀也避免不了会有几位学生的名字同时映射到哈希表同⼀个索引下标的位置。 接下来哈希碰撞登场 哈希碰撞 如图所示小李和小王都映射到了索引下标 1 的位置这一现象叫做哈希碰撞。 一般哈希碰撞有两种解决方法拉链法和线性探测法。 拉链法 刚刚小李和小王在索引 1 的位置发生了冲突发生冲突的元素都被存储在链表中。这样我们就可以通过索引找到小李和小王了 数据规模是dataSize哈希表的大小为tableSize 其实拉链法就是要选择适当的哈希表的大小这样既不会因为数组空值而浪费大量内存也不会因为链表太长而在查找上浪费太多时间。 线性探测法 使用线性探测法⼀定要保证tableSize大于dataSize。我们需要依靠哈希表中的空位来解决碰撞问题。 例如冲突的位置放了小李那么就向下找⼀个空位放置小王的信息。所以要求tableSize⼀定要⼤于dataSize要不然哈希表上就没有空置的位置来存放冲突的数据了。如图所示 常见的三种哈希结构 当我们想使用哈希法来解决问题的时候我们一般会选择如下三种数据结构。 1.数组 2.set集合 3.map映射 这里数组就没啥可说的了我们来看⼀下set和map。 std::unordered_set底层实现为哈希表std::set和std::multiset的底层实现是红黑树红黑树是⼀种平衡二叉搜索树所以key值是有序的但key不可以修改改动key值会导致整棵树的错乱所以只能删除和增加。 std::unordered_map底层实现为哈希表std::map和std::multimap的底层实现是红黑树。同理std::map和std::multimap的key也是有序的 当我们要使用集合来解决哈希问题的时候优先使用unordered_set因为它的查询和增删效率是最优的如果需要集合是有序的那么就用set如果要求不仅有序还要有重复数据的话那么就用multiset。 那么再来看一下map在map是一个key value的数据结构map中对key是有限制对value没有限制的因为key的存储方式使用红黑树实现的。 虽然std::set、std::multiset的底层实现是红黑树不是哈希表std::set、std::multiset使用红黑树来索引和存储不过给我们的使用方式还是哈希法的使用方式即key和value。所以使用这些数据结构来解决映射问题的方法我们依然称之为哈希法。map也是⼀样的道理。 有效的字母异位词 就是判断 s 和 t 是否是由相同的字符组成 数组其实就是⼀个简单哈希表而且这道题目中字符串只有小写字符那么就可以定义一个数组来记录字符串 s 里字符出现的次数。 定义⼀个数组叫做record用来上记录字符串s里字符出现的次数。 需要把字符映射到数组也就是哈希表的索引下标上因为字符a到字符z的ASCII是26个连续的数值所以字符a映射为下标0相应的字符z映射为下标25。 再遍历字符串s的时候只需要将s[i] - ‘a’所在的元素做1操作即可并不需要记住字符a的ASCII只要求出一个相对数值就可以了。这样就将字符串s中字符出现的次数统计出来了。 那看一下如何检查字符串 t 中是否出现了这些字符同样在遍历字符串t的时候对 t 中出现的字符映射哈希表索引上的数值再做 -1 的操作。 那么最后检查一下record数组如果有的元素不为零0说明字符串 s 和 t 一定是谁多了字符或者谁少了字符return false。 class solution { public:bool cmp(string s, string t){int record[26] { 0 };for (int i 0; i s.size(); i){record[s[i] - a];}for (int i 0; i t.size(); i){record[t[i] - a]--;}for (int i 0; i 26; i){if (record[i] ! 0){return false;}}return true;} }; 两个数组的交集 题意给定两个数组编写一个函数来计算它们的交集。 这道题目主要要学会使用一种哈希数据结构unordered_set这个数据结构可以解决很多类似的问题。 注意题目特意说明输出结果中的每个元素一定是唯一的也就是说输出的结果的去重的同时可以不考虑输出结果的顺序 思路如图所示 代码 # include iostream # include vector # include unordered_set using namespace std;int main() {vectorint nums1;vectorint nums2;int n;int m;cin n m;int x;for (int i 0; i n; i){cin x;nums1.push_back(x);}for (int i 0; i m; i){cin x;nums2.push_back(x);}unordered_setint result;unordered_setint nums(nums1.begin(), nums1.end());for (int num : nums2){if (nums.find(num) ! nums.end())result.insert(num);}} 快乐数 # include iostream # include vector # include unordered_set using namespace std;int made(int x) {int sum 0;while (x 0){sum sum (x % 10) * (x % 10);x x / 10;}return sum; }bool cmp(int x) {unordered_setint last;int s x;while (1){s made(s);if (last.find(s) last.end()){if (s 1)return true;last.insert(s);}else{return false;}} }int main() {int n;cin n;cout bool(n); } 两数之和 首先我在强调一下什么时候使用哈希法当我们需要查询一个元素是否出现过或者一个元素是否在集合里的时候就要第一时间想到哈希法。 本题呢我就需要一个集合来存放我们遍历过的元素然后在遍历数组的时候去询问这个集合某元素是否遍历过也就是是否出现在这个集合。 那么我们就应该想到使用哈希法了。 因为本地我们不仅要知道元素有没有遍历过还要知道这个元素对应的下标需要使用key value结构来存放key来存元素value来存下标那么使用map正合适。 再来看⼀下使用数组和set来做哈希法的局限。 1.数组的大小是受限制的而且如果元素很少而哈希值太大会造成内存空间的浪费。 2.set是⼀个集合里面放的元素只能是⼀个key而两数之和这道题目不仅要判断y是否存在而且还要记录y的下标位置因为要返回x和y的下标。所以set也不能用 此时就要选择另⼀种数据结构mapmap是⼀种key value的存储结构可以用key保存数值用value在保存数值所在的下标。 这道题目中并不需要key有序选择std::unordered_map效率更高 接下来需要明确两点 1.map用来做什么 2.map中key和value分别表示什么 map用来存放我们访问过的元素 数组中的元素作为key有key对应的就是valuevalue用来存下标。 # include iostream # include vector # include unordered_map using namespace std;int main() {int num[100];int n;int target;cin n target;unordered_mapint, int map;for (int i 0; i n; i){cin num[i];}for (int i 0; i n; i){if (map.find(target - num[i]) ! map.end()){auto iter map.find(target - num[i]);cout i iter-second;}map.insert(pairint, int{ num[i], i });} } 四数相加II 例如: 输⼊: A [1,  2] B [ -2, -1] C [-1, 2] D [ 0, 2] 输出: 2 本题是使用哈希法的经典题目这道题目是四个独立的数组只要找到A[i] B[j] C[k] D[l] 0就可以不用考虑有重复的四个元素相加等于0的情况。 # include iostream # include vector # include unordered_map using namespace std;int main() {int n;cin n;int a[500];int b[500];int c[500];int d[500];for (int i 0; i n; i){cin a[i];}for (int i 0; i n; i){cin b[i];}for (int i 0; i n; i){cin c[i];}for (int i 0; i n; i){cin d[i];}unordered_mapint, intmap;for (int i : a){for (int j : b){map[i j];}}int count 0;for (int i : c){for (int j : d){if (map.find(0 - i - j) ! map.end())count count map[0 - i - j];}}cout count; }
http://www.pierceye.com/news/585586/

相关文章:

  • 寿光网站建设思科企业网络拓扑图
  • 中国建设银行河南省分行网站建筑人才服务中心官网
  • 响应式app网站模板单页淘宝客网站2014年行吗
  • 西安网站推广优化高端定制网站开发设计建站流程
  • m版网站开发公司如何做网络推广营销
  • 济宁商城网站开发设计网址源码在线查看
  • 网站建设公司介绍百度电脑怎么用wordpress
  • 宛城区网站建设广东seo推广方案
  • 北京建网站定制价格网站风格总结
  • 如何建设一个购物网站wordpress 优酷插件
  • 你们网站做301网站开发规模和工作量的计算
  • 班级网站建设甘肃住房和城乡建设厅网站
  • 网站建设哪家性价比高住房和城乡建设部网站办事大厅里边
  • 外贸小语种网站建设深圳市保障性住房申请官网
  • 阿里云买域名后怎么做网站wordpress创建空白页面
  • 小型公司建网站腾讯风铃wordpress
  • 广州做模板网站的公司怎么区分营销型和展示型的网站
  • 网站推广服务外包1688阿里巴巴国际站首页
  • 深圳学校网站建设wordpress rossi 汉化
  • 课程网站课程资源建设北京吴勇设计工作室
  • 网站建设费用什么意思软件制作专业
  • 扬中本地网站外国做美食视频网站
  • 深圳手机网站制作价钱阜阳中国建设银行官网站
  • 廊坊建设网站企业安卓开发自学教程
  • 做网站虚拟主机配置汉沽手机网站建设
  • 设计一个网站先做哪些构造姑苏区建设局网站
  • 制造业营销外贸网站建设网站管理的内容包括
  • 看电视剧的免费网站app下载网站等保如何做
  • 如何做网站的营销中山vi设计公司
  • 搜索引擎网站使用的排名规则室内设计联盟网页版