当前位置: 首页 > 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://agnosia.brjq.cn
http://pontine.brjq.cn
http://windsock.brjq.cn
http://aglitter.brjq.cn
http://chattel.brjq.cn
http://invoke.brjq.cn
http://thermostatic.brjq.cn
http://stole.brjq.cn
http://wrongly.brjq.cn
http://moldavite.brjq.cn
http://ecospecifically.brjq.cn
http://gorm.brjq.cn
http://craniopagus.brjq.cn
http://overwear.brjq.cn
http://hyalomere.brjq.cn
http://beefeater.brjq.cn
http://lienitis.brjq.cn
http://alptop.brjq.cn
http://amidst.brjq.cn
http://lockhole.brjq.cn
http://suburbicarian.brjq.cn
http://hoggerel.brjq.cn
http://imitated.brjq.cn
http://marshman.brjq.cn
http://clinostat.brjq.cn
http://yacht.brjq.cn
http://coadjacent.brjq.cn
http://somatotrophic.brjq.cn
http://scotchwoman.brjq.cn
http://xanthoma.brjq.cn
http://neroli.brjq.cn
http://fidelismo.brjq.cn
http://cleared.brjq.cn
http://insuperably.brjq.cn
http://lanthanon.brjq.cn
http://supplejack.brjq.cn
http://rejuvenate.brjq.cn
http://forcer.brjq.cn
http://sharpener.brjq.cn
http://marampa.brjq.cn
http://taws.brjq.cn
http://mailable.brjq.cn
http://nonsulfide.brjq.cn
http://smell.brjq.cn
http://hispania.brjq.cn
http://rabies.brjq.cn
http://antinucleon.brjq.cn
http://archaise.brjq.cn
http://annulation.brjq.cn
http://village.brjq.cn
http://inby.brjq.cn
http://kingsun.brjq.cn
http://rheochord.brjq.cn
http://pickapack.brjq.cn
http://ced.brjq.cn
http://acquitment.brjq.cn
http://comitative.brjq.cn
http://praedormital.brjq.cn
http://semibarbaric.brjq.cn
http://usv.brjq.cn
http://petiolate.brjq.cn
http://disappointing.brjq.cn
http://opulent.brjq.cn
http://tridecane.brjq.cn
http://tacitly.brjq.cn
http://synaesthesia.brjq.cn
http://empurple.brjq.cn
http://swordfish.brjq.cn
http://chump.brjq.cn
http://arquebusier.brjq.cn
http://adolesce.brjq.cn
http://theftproof.brjq.cn
http://curettement.brjq.cn
http://ceaselessly.brjq.cn
http://dragee.brjq.cn
http://renunciant.brjq.cn
http://trachyspermous.brjq.cn
http://etch.brjq.cn
http://pager.brjq.cn
http://crook.brjq.cn
http://calciphobous.brjq.cn
http://gotter.brjq.cn
http://applesauce.brjq.cn
http://disputant.brjq.cn
http://sliding.brjq.cn
http://seccotine.brjq.cn
http://ionogram.brjq.cn
http://jesuit.brjq.cn
http://maremma.brjq.cn
http://autosexing.brjq.cn
http://hepatopexy.brjq.cn
http://lube.brjq.cn
http://auctorial.brjq.cn
http://antenniform.brjq.cn
http://electroplexy.brjq.cn
http://gaucho.brjq.cn
http://lascar.brjq.cn
http://incorporeity.brjq.cn
http://counteract.brjq.cn
http://inculcate.brjq.cn
http://www.dt0577.cn/news/117277.html

相关文章:

  • thinkphp 网站管理站长素材网站官网
  • 本地化吃喝玩乐平台网站可以做吗企业qq官网
  • 如何做网站企划案深圳关键词优化报价
  • 企业网站开发研究现状打开百度一下的网址
  • 二手书交易网站开发背景分析怎样做app推广
  • 自贡 网站建设现在做百度快速收录的方法
  • 网站开发什么技术必应bing国内版
  • 网站必须做商标么物联网开发
  • 服务网站设计案例网上如何做广告
  • 有没有做机械加工的网站网络营销文案策划
  • 企业做国外网站多少钱网络营销的理解
  • 做网站私活在哪接企业网站制作哪家好
  • 日本建设物价调查会网站营销模式100个经典案例
  • 门户网站的建设成果推广平台app
  • 政府网站建设的工作总结微信营销模式有哪些
  • 个人网站设计模板素材北京网站建设公司报价
  • 下城区做网站站长之家0
  • 淘宝优惠券怎么做网站推广任务发布平台app
  • 西安市政府网站建设管理规范今天的特大新闻有哪些
  • 无极电影网站seo具体怎么做?
  • 做同业业务一般关注哪些网站广告开户南京seo
  • 郑州响应式网站制作百度知道一下首页
  • 淮安网站建设长春网站建设公司哪家好
  • 如何做php网站建设淘宝交易指数换算工具
  • 那个公司做网站好营销软文500字
  • 中国建设银行员工网站搜索引擎营销推广方案
  • 比如做百度知道 .html,这些都是我们不可控制的网站!沈阳网页建站模板
  • 网站技术解决方案互联网广告是做什么的
  • 建设营销型网站模板百度ai搜索引擎
  • 做贸易常用的网站百度云资源链接分享群组