7-1 整型关键字的散列映射

文章介绍了在C++中如何使用数组和哈希表解决关键字标记问题,重点在于处理输入相同关键字时的正确存储和标记位置,避免重复占用数组空间。

用数组存关键字,mark记位置主要的坑点是输入相同关键字的时候要放在同一位里,要多加一个判断。

代码:

#include <iostream>
using namespace std;

int main()
{
    int n,p;
    cin >> n >> p;
    int* hash = new int[p];
    for (int i = 0; i < p; i++) {
        hash[i] = -1;//初始化数组,不然会出问题
    }
    for (int i = 0; i < n; i++) {
        int temp;
        cin >> temp;
        int mark = temp % p;
        while (hash[mark] != -1&&hash[mark]!=temp) {//该位不为空并且不等于输入的数字
            mark = (mark + 1) % p;//直接加1就行,因为mark会变化,上一轮已经加1了
        }
        hash[mark] = temp;
        if (i != n - 1)
            cout << mark << " ";
        else
            cout << mark;//格式要求
    }
    delete[]hash;
}

### 整型关键字的哈希表实现 #### 创建哈希表类 为了有效地管理键值对并提供高效的查找功能,可以创建一个名为 `HashTable` 的类。该类负责初始化哈希表、插入新项以及查询现有项。 ```cpp #include <vector> using namespace std; template<typename K, typename V> class HashTable { private: vector<pair<K, V>> table; size_t capacity; public: explicit HashTable(size_t cap) : capacity(cap), table(capacity) {} // 插入或更新键值对 void insert(const K& key, const V& value); // 查找指定键对应的值 bool find(const K& key, V &value); }; ``` #### 实现简单哈希函数 针对整数类型的键,可以直接采用模运算作为基本的哈希算法。这种方法能够快速计算出索引位置,并均匀分布各个元素至不同的槽位上[^3]。 ```cpp size_t hashFunction(K key) { return abs(key) % this->capacity; } ``` #### 插入操作 当执行插入时,先利用上面定义好的哈希函数获取目标槽的位置;如果此位置为空,则直接放置新的记录;反之则需考虑解决碰撞的方法之一——开放寻址法中的线性探查策略[^2]。 ```cpp void HashTable::insert(const K& key, const V& value){ auto index = hashFunction(key); while (!table[index].first.empty() && table[index].first != key) { ++index %= capacity; // 线性探测下一个可用空间 } table[index] = make_pair(key, value); } ``` #### 查询操作 同样地,在寻找某个特定键的过程中也需要遵循相同的逻辑路径直到找到匹配项或是遍历完整个环形数组为止[^4]。 ```cpp bool HashTable::find(const K& key, V &value){ auto index = hashFunction(key); do{ if (table[index].first == key){ value = table[index].second; return true; } ++index %= capacity; }while(table[index].first.has_value()); return false; } ``` 以上即为基于整型关键字构建哈希表的方式及其核心方法的具体编码示例。需要注意的是这里仅展示了最基础的形式,实际应用中可能还需要加入更多特性如动态调整容量等以提高性能表现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值