c++hash实现(+ELF算法)

Simple_Hash:

#pragma once
class Simple_Hash
{
   
	int* data;
	int count;
	int capacity=10000;
public:
	Simple_Hash()
	{
   
		data = new int[capacity]();
		count = 0;
	}

	void insert(int key, int val)
	{
   
		data[key] = val;
		count++;
	}

	void remove(int key)
	{
   
		data[key] = 0;
		count--;
	}

	int search(int key)
	{
   
		return data[key];
	}

	~Simple_Hash()
	{
   
		delete[] data;
	}
};


Hash:

#pragma once
#include <iostream>
class Hash
{
   
	int* data;
	int count;
	int length;
public:
	Hash(int length) :length(length)
	{
   
		data = new int[length]();
		count = 0;
	}
	~Hash()
	{
   
		delete[] data;
	}
	//插入
	bool insert(int key)
	{
   
		if (full())
		{
   
			return false;
		}
		int base = key % length;	//插入位置
		int step=0;	//偏移位置

		int i = base;
		while (data[i] != 0)
		{
   
			if (data[i] == key)	//相等,则插入重复
			{
   
				return false;
			}
			step++;
			i = (base + step) % length;	//循环判断i值
		}
		data[i] = key;	//赋值
		count++;
		return true;
	}
	//判断是否未满
	bool full()
	{
   
		//容器留一个空位
		return count >= length - 1;
	}
	//返回大小
	int size()
	{
   
		return count;
	}
	//判断是否为空
	bool empty()
	{
   
		return count == 0;
	}
	//搜索
	int search(int key)
	{
   
		int base = key % length;
		int step = 0;
		int i = base;
		while (true)
		{
   
			if (
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Geohash是一种将地理位置编码为字符串的方法,它可以将一个点的经纬度坐标编码为一串字符串。以下是C++实现Geohash算法的示例代码: ```c++ #include <bits/stdc++.h> using namespace std; const int MAXN = 100010; char base32[] = "0123456789bcdefghjkmnpqrstuvwxyz"; map<char, int> mp; void init() { for (int i = 0; i < 32; i++) mp[base32[i]] = i; } string Encode(double lat, double lng, int len) { double lat_left = -90, lat_right = 90, lng_left = -180, lng_right = 180; string res; while (len--) { int tmp = 0; for (int i = 0; i < 5; i++) { double mid_lat = (lat_left + lat_right) / 2; double mid_lng = (lng_left + lng_right) / 2; if (lng > mid_lng) { tmp = tmp * 2 + 1; lng_left = mid_lng; } else { tmp = tmp * 2; lng_right = mid_lng; } if (lat > mid_lat) { tmp = tmp * 2 + 1; lat_left = mid_lat; } else { tmp = tmp * 2; lat_right = mid_lat; } } res += base32[tmp]; } return res; } int main() { init(); double lat, lng; int len; scanf("%lf %lf %d", &lat, &lng, &len); printf("%s\n", Encode(lat, lng, len).c_str()); return 0; } ``` 其中,函数`Encode`接受一个经度坐标`lat`和一个纬度坐标`lng`,以及指定的编码长度`len`,返回一个字符串表示的Geohash编码。 具体实现过程如下: 1. 初始化`base32`字符数组和`mp`映射表,用于字符转数字和数字转字符。 2. 初始化`lat_left`、`lat_right`、`lng_left`、`lng_right`四个变量,分别表示纬度和经度的范围,初始值为全球范围。 3. 循环`len`次,每次取前5位进行编码。对于每一位,将经度和纬度的范围二分,根据经度和纬度的大小关系,决定当前位的值。将这5位的值转换为对应的字符,拼接到结果字符串中。 4. 返回结果字符串。 示例: 输入: ``` 39.9087 116.3975 6 ``` 输出: ``` wx4g0j ``` 该输出表示经度为116.3975,纬度为39.9087的点的Geohash编码为"wx4g0j",编码长度为6。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值