有效存储“坐标”的机制

时间:2018-09-08 12:16:56

标签: php arrays algorithm memory

在我的一个业余项目上,我试图为以下问题找到最“有效”的解决方案。在描述问题之前,我想说一下我不确定是否必须在https://math.stackexchange.com/部分或https://stackoverflow.com/部分中发布此问题。因此,如果我输入的部分有误,请对此表示抱歉! ;)

问题描述:

我有一个包含元素的文件,这些元素可以用坐标表示。这些坐标由两个无符号整数组成,例如:0,2 6,31,157348。代表文件中元素的所有坐标对于给定文件都是唯一的。我要实现的是为这些坐标创建一个映射,以便我可以快速访问它们。一个非常简单的解决方案是创建一个将坐标存储为一对的集合。例如:

$collection = [0 => [0,2],1 => [6,3], 2 => [1,157348], ...];

此解决方案的问题是(我假设)文件可以包含大量元素。就我而言,该文件很可能包含成千上万个元素,这给我留下了非常大的映射集合。这可能会导致应用程序出现内存问题,从而导致应用程序崩溃。

我认为将元素的坐标存储为成对数组效率不高。我认为,如果我可以将元素的坐标编码为单个值,并且可以再次解码以获取实际元素的坐标,则将是一种更有效的内存解决方案。

一种解决方案是将坐标存储为字符串。例如:

$collection = [0 => '0;2', 1 => '6;3', 2 => '1;157348', ...];

这给我留下了一维数组,它应该比以前的多维解决方案具有更高的内存效率。太棒了但是此解决方案将需要一些额外的步骤:

写作:

  1. 将整数编码为字符串,并用令牌(;)隔开

阅读:

  1. 解码字符串,分隔字符串标记(;)。
  2. 将坐标值转换回整数。

如果可以避免这些步骤,可能会很酷。而且我不认为将坐标存储为浮点数,因为(可能)很大的小数部分。

所以我在想,我无法想象成为第一个遇到这种问题的人,有没有一种方法(例如:算法)能够将两个整数值转换为单个整数值,并且可以重新转换通过计算恢复到原始值。

从我的角度来看,它具有以下优点:

  • 不需要int->字符串或字符串-> int转换。
  • 将值存储为整数比存储字符串更有效。

一个缺点是:

  • 将坐标计算为单个值然后返回,将需要更多的CPU能力,从而降低应用程序的速度。

相对于内存效率低下的解决方案,我宁愿使用速度较慢的解决方案,因为我希望(简单地说)内存效率低下的解决方案会增加崩溃应用程序的风险,而CPU密集型解决方案只会增加处理系统的时间文件。

那么,有人知道这种算法是否存在吗?还是您有解决此问题的另一种方法的想法,我很高兴听到您的想法。

如果您认为我的假设有误,请以建设性的方式纠正我;-)

1 个答案:

答案 0 :(得分:0)

您是否需要将整个集合加载到php中?如果不这样做,则可以使用Redis(https://redis.io/)来存储集合,并仅查询所需的值。如果您将提供一些有关您使用的值的详细信息,将会有所帮助。

相关问题