自定义实现 Trie、HashSet、LRU

C++中的hash table

  • C++ STL中有四种关联式容器, map ,set, multimap, multiset; 他们底层是RB树, 查找的时间复杂度是O(logN)
  • 他们都有对应的hash table版本, unordered_map, unordered_set, unordered_multimap, unordered_multiset. 他们底层的实现是hash table, 查找时间复杂度O(1).
    • 解决冲突的方法是 链地址法
    • 链地址法 (用一个链表存储所有冲突的记录), 开放地址法 (有冲突, 以当前位置为基准根据探查序列再寻址), 再哈希法

自定义HashSet

  • 一个vector, 每个容器都维持着一个链表, 初始化NULL
  • vector的下标就是对应的hash_key
  • vector存放的是每个链表的头节点, 每个函数都需要单独判断.
    • 删除操作, 需要双指针, 记录删除结点的前一个结点
class MyHashSet
{
   
public:
    struct ListNode
    {
   
        int val;
        ListNode* next;
        ListNode(int v): val(v), next(NULL){
   }
    };

    int range;
    vector<ListNode*> bucket_v;
    
    MyHashSet()
    {
   
        this->range = 769;
        bucket_v.assign(this->range, 0);
    }
    
    void add(int key)
    {
   
        int hash_key = key % this->range;
        ListNode* node = new ListNode(key);
        // 单独判断是否有头节点, 增加key的时候, 如果存在则不添加
        if (bucket_v[hash_key] == NULL) bucket_v[hash_key] = node;
        else
        {
   
            ListNode* temp = bucket_v[hash_key];
            if (temp->val == key) return;
            while(temp->next != NULL)
            {
   
               
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值