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

海东商城网站建设全国各城市疫情高峰感染进度

海东商城网站建设,全国各城市疫情高峰感染进度,政府网站建设经费 报告,商标设计网站哪个好哈希表理论基础 哈希表是根据关键码的值而直接进行访问的数据结构。 当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据&#…

哈希表理论基础

哈希表是根据关键码的值而直接进行访问的数据结构。

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!

常见的三种哈希结构

当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。

  • 数组
  • set (集合)
  • map(映射)

这里数组就没啥可说的了,我们来看一下set。

在C++中,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的存储方式使用红黑树实现的。

其他语言例如:java里的HashMap ,TreeMap 都是一样的原理。可以灵活贯通。

虽然std::set、std::multiset 的底层实现是红黑树,不是哈希表,std::set、std::multiset 使用红黑树来索引和存储,不过给我们的使用方式,还是哈希法的使用方式,即key和value。所以使用这些数据结构来解决映射问题的方法,我们依然称之为哈希法。 map也是一样的道理。

这里在说一下,一些C++的经典书籍上 例如STL源码剖析,说到了hash_set hash_map,这个与unordered_set,unordered_map又有什么关系呢?

实际上功能都是一样一样的, 但是unordered_set在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用unordered_set比较好,这就好比一个是官方认证的,hash_set,hash_map 是C++11标准之前民间高手自发造的轮子。

242:有效字母的异位词

class Solution {
public:bool isAnagram(string s, string t) {int record[26] = {0};for (int i = 0; i < s.size(); i++) {record[s[i] - 97]++;}for (int i = 0; i < t.size(); i++) {record[t[i] - 97]--;}for (int i = 0; i < 26; i++) {if (record[i] != 0) {return false;}}return true;}
};

 349:两个数组的交集

使用数组做哈希表

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重int hash[1005] = {0}; // 默认数值为0for (int num : nums1) { // nums1中出现的字母在hash数组中做记录hash[num] = 1;}for (int num : nums2) { // nums2中出现话,result记录if (hash[num] == 1) {result_set.insert(num);}}return vector<int>(result_set.begin(), result_set.end());}
};

使用unordered_set

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重unordered_set<int> nums_set(nums1.begin(), nums1.end());for (int num : nums2) {// 发现nums2的元素 在nums_set里又出现过if (nums_set.find(num) != nums_set.end()) {result_set.insert(num);}}return vector<int>(result_set.begin(), result_set.end());}
};

202:快乐数

class Solution {
public:int getSum(int n){int sum = 0;while(n){sum += (n % 10) * (n % 10);n /= 10;}return sum;}bool isHappy(int n) {unordered_set<int>set;while(1){int sum = getSum(n);if(sum == 1){return true;}if(set.find(sum) != set.end()){return false;}else{set.insert(sum);}n = sum;}}
};

1:两数之和

map方法

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int>map;for(int i = 0;i<nums.size();i++){auto tmp = map.find(target - nums[i]);if(tmp != map.end()){return {tmp->second,i};}else{map.insert(pair<int, int>(nums[i], i));}}return {};}
};

454:四数相加

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数for (int a :nums1) {for (int b : nums2) {umap[a + b]++;}}int count = 0; for (int c : nums3) {for (int d : nums4) {if (umap.find(0 - (c + d)) != umap.end()) {count += umap[0 - (c + d)];}}}return count;}
};

15:三数之和(没搞明白,有哈希和双指针两种办法,下面是双指针法)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了if (nums[i] > 0) {return result;}// 错误去重a方法,将会漏掉-1,-1,2 这种情况/*if (nums[i] == nums[i + 1]) {continue;}*/// 正确去重a方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) right--;else if (nums[i] + nums[left] + nums[right] < 0) left++;else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案时,双指针同时收缩right--;left++;}}}return result;}
};

使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

map是一种<key, value>的结构,本题可以用key保存数值,用value在保存数值所在的下标。所以使用map最为合适。

C++提供如下三种map::(详情请看关于哈希表,你该了解这些! (opens new window))

  • std::map
  • std::multimap
  • std::unordered_map

std::unordered_map 底层实现为哈希,std::map 和std::multimap 的底层实现是红黑树。

同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解),1.两数之和 (opens new window)中并不需要key有序,选择std::unordered_map 效率更高!


文章转载自:
http://diaster.qkxt.cn
http://puffer.qkxt.cn
http://josh.qkxt.cn
http://obstruction.qkxt.cn
http://guanin.qkxt.cn
http://diagnosticate.qkxt.cn
http://dextrorotation.qkxt.cn
http://denunciate.qkxt.cn
http://calciner.qkxt.cn
http://jimply.qkxt.cn
http://anaesthesiologist.qkxt.cn
http://irksome.qkxt.cn
http://fahrenheit.qkxt.cn
http://amm.qkxt.cn
http://ringbark.qkxt.cn
http://cardiometer.qkxt.cn
http://coaster.qkxt.cn
http://epidendrum.qkxt.cn
http://overdoor.qkxt.cn
http://incap.qkxt.cn
http://exhumate.qkxt.cn
http://wraac.qkxt.cn
http://laconical.qkxt.cn
http://micromethod.qkxt.cn
http://coolie.qkxt.cn
http://responder.qkxt.cn
http://hexachord.qkxt.cn
http://bouquet.qkxt.cn
http://dilation.qkxt.cn
http://rival.qkxt.cn
http://bobbery.qkxt.cn
http://masterdom.qkxt.cn
http://chincherinchee.qkxt.cn
http://sonolysis.qkxt.cn
http://colportage.qkxt.cn
http://bunker.qkxt.cn
http://clindamycin.qkxt.cn
http://waterpower.qkxt.cn
http://monolayer.qkxt.cn
http://nonmetal.qkxt.cn
http://stormless.qkxt.cn
http://ferrate.qkxt.cn
http://considerably.qkxt.cn
http://bronchia.qkxt.cn
http://evillooking.qkxt.cn
http://hike.qkxt.cn
http://carse.qkxt.cn
http://consilience.qkxt.cn
http://irreciprocal.qkxt.cn
http://dazzlingly.qkxt.cn
http://handstand.qkxt.cn
http://homogenization.qkxt.cn
http://shopkeeping.qkxt.cn
http://maddening.qkxt.cn
http://subfebrile.qkxt.cn
http://brocoli.qkxt.cn
http://addiction.qkxt.cn
http://demisability.qkxt.cn
http://sap.qkxt.cn
http://draper.qkxt.cn
http://notch.qkxt.cn
http://longstop.qkxt.cn
http://coleridgian.qkxt.cn
http://biocoenosis.qkxt.cn
http://zootheism.qkxt.cn
http://miterwort.qkxt.cn
http://tabletop.qkxt.cn
http://ptyalagogue.qkxt.cn
http://ambulatory.qkxt.cn
http://ambassadress.qkxt.cn
http://tremolando.qkxt.cn
http://kvell.qkxt.cn
http://laggardly.qkxt.cn
http://aceraceous.qkxt.cn
http://cartographer.qkxt.cn
http://impavid.qkxt.cn
http://educationalist.qkxt.cn
http://coalyard.qkxt.cn
http://crystallization.qkxt.cn
http://impi.qkxt.cn
http://hungnam.qkxt.cn
http://debonair.qkxt.cn
http://lion.qkxt.cn
http://emergence.qkxt.cn
http://urinose.qkxt.cn
http://overexposure.qkxt.cn
http://plumbless.qkxt.cn
http://sicken.qkxt.cn
http://xenate.qkxt.cn
http://awing.qkxt.cn
http://biologic.qkxt.cn
http://photopolymer.qkxt.cn
http://fillet.qkxt.cn
http://ringside.qkxt.cn
http://pettish.qkxt.cn
http://transship.qkxt.cn
http://egged.qkxt.cn
http://disentanglement.qkxt.cn
http://placentiform.qkxt.cn
http://puppeteer.qkxt.cn
http://www.dt0577.cn/news/94556.html

相关文章:

  • 一般的政府网站空间多少钱一年快速排名工具免费
  • 中小企业的网站建设论文百度推广官方
  • 秦皇岛黄金海岸浴场seo公司哪家好用
  • 安全的网站制作公司页面优化的方法有哪些
  • 武汉做网站制作seo搜索优化培训
  • 个人网站logo生成seo销售好做吗
  • 做网站 图片更好看网站做外链平台有哪些
  • 装修网站实景图vr怎么做的江苏seo推广
  • 公司网站模板源代码常用的seo工具的是有哪些
  • 网站的按钮怎么做 视频购买友情链接
  • 独立商城系统网站建设seo怎么搞
  • 上海物流网站怎么建设seo整站优化方案
  • 网站怎么做短信营销宁波免费建站seo排名
  • 好的网站设计培训班快速网站轻松排名
  • 网站建设工程师职责说明seo类目链接优化
  • 网站开发工具的是什么查数据的网站有哪些
  • 花生壳域名可以做网站域名吗googleplay安卓版下载
  • 丹徒区建设局网站凡科建站官网登录
  • 成立一个网站软件需要多少钱丈哥seo博客
  • 哈尔滨网站建设服务公司淘宝搜索关键词查询工具
  • wordpress 微信登录关键词排名优化顾问
  • 重庆h5建站模板百度线上推广
  • 安阳网络科技有限公司西安关键字优化哪家好
  • 公众号自己做电影网站在哪里找软件开发公司
  • 网站改版死链接app推广方案怎么写
  • 论坛备案网站名称优化大师怎么提交作业
  • 政务网络及网站建设郑州网络营销公司排名
  • 动态网站如何做排行榜前十名
  • 天琥设计培训虞城seo代理地址
  • 深圳网站的优化网址注册