空间散列从输入文件C ++查找最接近的点对

时间:2018-09-19 01:21:58

标签: c++ hash spatial

我有一个家庭作业,不知道从哪里开始或做什么。基本上,我需要使用“空间散列”来组织大约一百万个点,并使用散列表来查找彼此最接近的两个点,然后返回距离。

分配细节是: 要快速找到最接近的一对点,请将包含这些点的单位正方形划分为正方形“单元”的b×b网格,每个网格代表大小为1 / b×1 / b的2D正方形。每个点都应“散列”到包含它的单元格中。例如,如果要将点的x坐标存储在名为x的“双精度”变量中,则(int)(x * b)将按比例将坐标放大b并向下舍入到最接近的整数;结果(范围为0 ... b-1)可用作2D单元格数组的索引之一。仅使用它们的坐标,其他索引的计算方法相同。散列后,只需将每个点与其单元格中的其他点进行比较,并且将其单元格周围的8个单元格进行比较–与仅将每个点与其他点进行比较相比,这将导致更少的比较。您将需要选择一个适当的值1 此实验练习的基础。您可能需要考虑将b设置得太低或太高的危险。在内部,单元格的网格应存储为指向链接列表的二维指针数组,每个链接列表都包含属于单个单元格的点集。必须动态分配单元格数组(使用new命令),然后在程序末尾(使用delete命令)将其取消分配。这意味着,由于表的每个单元格本身都是指向链接列表节点的指针,因此代表2D指针数组的顶级变量将为“ Node ***”类型(带有三个*! ),并假设“节点”是表示链表中一个节点的结构的名称。

您的程序应包括以下主要步骤:

  1. 分配和初始化指向链接列表的2D指针数组。
  2. 读取输入文件,根据它映射到的单元格将每个点插入到适当的链接列表中。
  3. 对于每个点,将其与它的单元格和8个相邻单元格中的所有点进行比较;记住在此过程中获得的最小距离。
  4. 取消分配2D数组和链表。
  5. 打印最小距离。 本实验的一部分还涉及为b的值找出一个好的选择。请在代码的注释中简要说明为什么您认为选择b是一个好选择。

0 个答案:

没有答案