1078 Hashing

本文介绍了一个关于Quadratic Probing(二次探测)的编程实现案例,并详细解释了如何修正质数判断函数中的错误。文章通过一个具体的C语言程序示例,展示了当哈希表发生冲突时采用二次探测解决冲突的方法,以及正确判断质数的重要性。

水题,

主要是Quadratic probing的定义没搞清,fuck!

注意:判断质数的函数小心2和3:

bool isPrime(int x){
	if(x <= 1){
		return false;
	}
	if(x == 2 || x ==3){//fuck!  1059里判断质数的函数写错了! 
		return true;
	}

	int tmp = sqrt(float(x))+1;

	for(int i = 2; i <= tmp; i++){
		if(x%i == 0){
			return false; 
		}
	}

	return true;
}
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
 

bool isPrime(int x){
	if(x <= 1){
		return false;
	}
	if(x == 2 || x ==3){//fuck!  1059里判断质数的函数写错了! 
		return true;
	}

	int tmp = sqrt(float(x))+1;

	for(int i = 2; i <= tmp; i++){
		if(x%i == 0){
			return false; 
		}
	}

	return true;
}


int msize, n;

int t[10000+10];


int main(){
	freopen("in.txt","r",stdin);

	scanf("%d%d",&msize, &n);	

	while(!isPrime(msize)){
		msize++;
	}

	//tst
	//printf("msize = %d\n",msize);

	memset(t, 0, sizeof(t));
	 

	int key;
	bool flag = true;
	 
	for(int i = 0; i < n; i++){
		
		scanf("%d", &key);
		int hash = key%msize;

		if(t[hash] == 0){
			t[hash] = key;

			if(flag){
				printf("%d",hash);
				flag = false;
			}else{
				printf(" %d", hash);
			}
		}else{
			
			int qua = 1;
			int originalHash = hash;
			 
			while(t[hash] !=  0 && qua < msize){ //二次探测的终止条件是 qua == msize,fuck!
				 
				hash = (originalHash + qua*qua)%msize;//hash += qua*qua;这样写错的!				
				qua++;			
			}

			if(t[hash] ==  0){
				t[hash] = key;
				printf(" %d", hash);
			}else{
				printf(" -");
			}
		}
	
	}



	return 0;
}




转载于:https://my.oschina.net/kaneiqi/blog/306964

### Voxel Hashing 技术详解 Voxel hashing 是一种用于高效存储和访问三维空间数据的技术,在计算机图形学和3D建模领域广泛应用。它通过将连续的三维空间划分为离散的小立方体(即体素),并利用哈希表来快速定位这些体素的位置。 #### 基本原理 Voxel hashing 的核心在于使用稀疏的数据结构表示三维场景中的体素[^1]。由于大多数实际应用中的三维模型并不完全填充整个空间,因此采用稠密数组会浪费大量内存资源。相反,voxel hashing 使用哈希函数将体素映射到一个紧凑的哈希表中,从而显著减少所需的存储量。 #### 数据结构设计 为了支持高效的查询操作,通常需要定义如下几个关键组件: - **Hash Function**: 将三维坐标 `(x, y, z)` 转换为唯一的键值,以便索引对应的哈希桶。 ```cpp uint64_t hash(uint32_t x, uint32_t y, uint32_t z) { const uint64_t prime = 73856093; return (uint64_t(x * prime ^ y * prime ^ z * prime)) % TABLE_SIZE; } ``` - **Table Entry Structure**: 每个哈希表条目保存有关该体素的信息,例如其位置、属性或其他元数据。 ```cpp struct VoxelEntry { int position_x, position_y, position_z; // 体素的空间位置 float density; // 密度或颜色等属性 bool occupied; // 是否被占用标志位 }; ``` #### 查询与更新机制 当程序接收到一个新的点云或者网格顶点时,可以通过以下方式将其分配至最近的体素单元,并执行相应的处理逻辑: 1. 计算目标点所属的体索单元编号; 2. 利用上述提到的哈希函数计算出对应于该体素的哈希槽地址; 3. 如果发现冲突,则尝试线性探测法解决碰撞问题直至找到空闲位置为止;如果未发生冲突则直接写入即可完成新增记录过程[^2]。 此外还需要注意边界条件以及溢出保护措施等问题以免造成错误结果输出甚至崩溃现象的发生。 ```python def insert_voxel(voxels_table, point_position): """Insert a new voxel into the table.""" key = compute_hash(point_position) while voxels_table[key].occupied and not compare_positions(voxels_table[key], point_position): key += 1 # Linear probing to resolve collisions if not voxels_table[key].occupied: initialize_entry(voxels_table[key], point_position) ``` 以上就是关于如何实现基于hash map方法来进行动态管理大规模复杂几何对象集合的一个简单介绍[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值