• 哈希的使用


    1. 哈希的使用

    map、set和哈希的区别:

    1. map是双向迭代器,哈希表是单向迭代器。
    2. map有序,哈希无序。
    3. map查找是logn,哈希是O(1);

    image-20220910145047999

    1.1 unordered_set

    #include
    #include 
    using namespace std;
    
    void test_set()
    {
    	unordered_set s;
    	//set s;
    	s.insert(2);
    	s.insert(3);
    	s.insert(1);
    	s.insert(2);
    	s.insert(5);
    
    	//unordered_set::iterator it = s.begin();
    	auto it = s.begin();
    	while (it != s.end())
    	{
    		cout << *it << " ";
    		++it;
    	}
    	cout << endl;
    
    	for (auto e : s)
    	{
    		cout << e << " ";
    	}
    	cout << endl;
    }
    
    int main()
    {
        test_set();
        return  0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    1.2 unordered_map

    void test_map()
    {
    	unordered_map dict;
    	dict.insert(make_pair("sort", "排序"));
    	dict.insert(make_pair("left", "左边"));
    	dict.insert(make_pair("left", "剩余"));
    	dict["string"];				  // 插入 默认缺省值""
    	dict["left"] = "剩余"; 		// 修改
    	dict["string"] = "字符串";	   // 修改
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.3 测试效率

    因为rand的随机数有数量限制,超过后会一直重复。

    void test_op()
    {
    	int n = 10000000;
    	vector v;
    	v.reserve(n);
    	srand(time(0));
    	for (int i = 0; i < n; ++i)
    	{
    		//v.push_back(i);
    		//v.push_back(rand()+i);  // 重复少
    		v.push_back(rand());  // 重复多
    	}
    
    	size_t begin1 = clock();
    	set s;
    	for (auto e : v)
    	{
    		s.insert(e);
    	}
    	size_t end1 = clock();
    
    	size_t begin2 = clock();
    	unordered_set us;
    	for (auto e : v)
    	{
    		us.insert(e);
    	}
    	size_t end2 = clock();
    
    	cout << s.size() << endl;
    
    	cout << "set insert:" << end1 - begin1 << endl;
    	cout << "unordered_set insert:" << end2 - begin2 << endl;
    
    
    	size_t begin3 = clock();
    	for (auto e : v)
    	{
    		s.find(e);
    	}
    	size_t end3 = clock();
    
    	size_t begin4 = clock();
    	for (auto e : v)
    	{
    		us.find(e);
    	}
    	size_t end4 = clock();
    	cout << "set find:" << end3 - begin3 << endl;
    	cout << "unordered_set find:" << end4 - begin4 << endl;
    
    	
    	size_t begin5 = clock();
    	for (auto e : v)
    	{
    		s.erase(e);
    	}
    	size_t end5 = clock();
    
    	size_t begin6 = clock();
    	for (auto e : v)
    	{
    		us.erase(e);
    	}
    	size_t end6 = clock();
    	cout << "set erase:" << end5 - begin5 << endl;
    	cout << "unordered_set erase:" << end6 - begin6 << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    image-20220910145815906

    2 练习题

    2.1

    961. 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode)

    class Solution {
    public:
    int repeatedNTimes(vector& A) {
         size_t N = A.size()/2;
         // 用unordered_map统计每个元素出现的次数
         unordered_map m;
         for(auto e : A)
             m[e]++;
         
         // 找出出现次数为N的元素
         for(auto& e : m)
         {
             if(e.second == N)
                 return e.first;
         }
     }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.2

    349. 两个数组的交集 - 力扣(LeetCode)

    class Solution {
    public:
     vector intersection(vector& nums1, vector& nums2) {
         
         // 用unordered_set对nums1中的元素去重
     	 unordered_set s1;
    	 for (auto e : nums1)
    	 s1.insert(e);
         // 用unordered_set对nums2中的元素去重
     	unordered_set s2;
     	for (auto e : nums2)
     	s2.insert(e);
         // 遍历s1,如果s1中某个元素在s2中出现过,即为交集
     	vector vRet;
     	for (auto e : s1)
     	{
     		if (s2.find(e) != s2.end())
     		vRet.push_back(e);
     	}
          return vRet;
     }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    ums2)
    s2.insert(e);
    // 遍历s1,如果s1中某个元素在s2中出现过,即为交集
    vector vRet;
    for (auto e : s1)
    {
    if (s2.find(e) != s2.end())
    vRet.push_back(e);
    }
    return vRet;
    }
    };

    
    
    • 1
  • 相关阅读:
    vue使用甘特图插件dhtmlx-gantt( 简单版)
    Jmeter(116)——写入xls登录案例实战
    Kafka3.x核心速查手册二客户端使用篇-1、从基础的客户端说起
    Origin 导入数据画图使用经验总结
    Java--Object类
    数据库事务四大特性-ACID(原子性、一致性、隔离性、持久性)
    Windows11+Ubuntu24.04双系统安装及配置
    能量原理与变分法笔记02:变分问题 变分和微分运算能交换次序 欧拉方程
    Spark GC日志分析
    《HelloGitHub》第 73 期
  • 原文地址:https://blog.csdn.net/iwkxi/article/details/126813434