在我的一个业余项目上,我试图为以下问题找到最“有效”的解决方案。在描述问题之前,我想说一下我不确定是否必须在https://math.stackexchange.com/部分或https://stackoverflow.com/部分中发布此问题。因此,如果我输入的部分有误,请对此表示抱歉! ;)
问题描述:
我有一个包含元素的文件,这些元素可以用坐标表示。这些坐标由两个无符号整数组成,例如:0,2
6,3
或1,157348
。代表文件中元素的所有坐标对于给定文件都是唯一的。我要实现的是为这些坐标创建一个映射,以便我可以快速访问它们。一个非常简单的解决方案是创建一个将坐标存储为一对的集合。例如:
$collection = [0 => [0,2],1 => [6,3], 2 => [1,157348], ...];
此解决方案的问题是(我假设)文件可以包含大量元素。就我而言,该文件很可能包含成千上万个元素,这给我留下了非常大的映射集合。这可能会导致应用程序出现内存问题,从而导致应用程序崩溃。
我认为将元素的坐标存储为成对数组效率不高。我认为,如果我可以将元素的坐标编码为单个值,并且可以再次解码以获取实际元素的坐标,则将是一种更有效的内存解决方案。
一种解决方案是将坐标存储为字符串。例如:
$collection = [0 => '0;2', 1 => '6;3', 2 => '1;157348', ...];
这给我留下了一维数组,它应该比以前的多维解决方案具有更高的内存效率。太棒了但是此解决方案将需要一些额外的步骤:
写作:
;
)隔开阅读:
;
)。如果可以避免这些步骤,可能会很酷。而且我不认为将坐标存储为浮点数,因为(可能)很大的小数部分。
所以我在想,我无法想象成为第一个遇到这种问题的人,有没有一种方法(例如:算法)能够将两个整数值转换为单个整数值,并且可以重新转换通过计算恢复到原始值。
从我的角度来看,它具有以下优点:
一个缺点是:
相对于内存效率低下的解决方案,我宁愿使用速度较慢的解决方案,因为我希望(简单地说)内存效率低下的解决方案会增加崩溃应用程序的风险,而CPU密集型解决方案只会增加处理系统的时间文件。
那么,有人知道这种算法是否存在吗?还是您有解决此问题的另一种方法的想法,我很高兴听到您的想法。
如果您认为我的假设有误,请以建设性的方式纠正我;-)
答案 0 :(得分:0)
您是否需要将整个集合加载到php中?如果不这样做,则可以使用Redis(https://redis.io/)来存储集合,并仅查询所需的值。如果您将提供一些有关您使用的值的详细信息,将会有所帮助。