【哈希表】实现结构RandomPool,用O(1)时间完成插入、删除和随机返回的功能

题目:来自脑客爱刷题


//假设key是double类型
class RandomPool
{
public:
	//cur_index记录当前插入的次序,恰好也是哈希表中已有记录的个数 KeyToIndex.size()
	int cur_index;
	//维护两张哈希表
	hash_map<double, int> KeyToIndex;
	hash_map<int, double> IndexToKey;

	//cur_index初始化为0,即第一个插入的key的次序是0
	RandomPool() :cur_index(0){}

	bool Insert(const double key)
	{
		if (KeyToIndex.find(key) != KeyToIndex.end())
			return false;
		KeyToIndex.emplace(key, cur_index);
		IndexToKey.emplace(cur_index, key);
		cur_index++;
	}

	//delete操作是本题关键
	bool Delete(const double key)
	{
		if (KeyToIndex.find(key) == KeyToIndex.end())
			return false;
		int deleteindex = KeyToIndex[key];
		cur_index--;
		double keylast = IndexToKey[cur_index];
		KeyToIndex.erase(key);
		KeyToIndex.erase(keylast);
		IndexToKey.erase(deleteindex);
		IndexToKey.erase(cur_index);
		KeyToIndex.emplace(keylast, deleteindex);
		IndexToKey.emplace(deleteindex, keylast);
		return true;
	}

	double getRandom()
	{
		//随机生成一个数random,范围是 [0,cur_index-1]
		int random = rand() % cur_index;
		return IndexToKey[random];
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值