替代嵌套数组(6维),内存间隙保留O(1)访问权限

时间:2012-06-11 17:10:26

标签: c arrays multidimensional-array

我正在阅读运行具有不同配置的程序的统计数据。假设有6种配置(ab,...,f)。配置可能不会线性变化,因此如果您将测量值视为表格,则表格中可能存在间隙。问题是关于在内存中构建这些统计数据。

首先想到的是将这些配置读取到动态分配的6深度数组或数组:

struct data ******measurements;

现在这很好用。您的内存开销非常小(仅实际分配数据的配置),访问时间为O(1)

除了大多数人不喜欢******指针的事实之外,这还有一个缺点,即添加配置意味着向数组添加维度,除非将数组的读/写封装在函数中,否则可能会变得难看。 (写入已经封装好,以便在必要时进行分配,所以这实际上并不是什么大问题。)

想到的另一个想法是使用AVL树或其他东西struct configstruct data的地图(我already have因此没有实施开销)。这解决了扩展配置参数的问题,但减少了O(log(n))的访问时间。

O(log(n))的测试次数可能会相当大,以便有所作为。

我的问题是:这里使用6深嵌套数组是否合理?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

请注意,您当前的设置不是O(1),它是O(k),其中k是维数。使用平衡树,无论如何它都会转到O(log 2 ^ k)== O(k)(我假设每个维度有两个选择;但这并不重要......这只是一个常数)。您可能会或可能不会期望在平衡树的实现上有更大的开销。

您可以做的是尝试使用typedef和getter / setter函数(最好是可内联的)抽象接口,然后使用您想要的任何实现。然后你不必处理那么多的指针,仍然使用里面的任何结构。

答案 1 :(得分:2)

X-trees是高效存储和查找高维数据的常用选择。链接的维基百科文章只是一个存根,但它指向一个更权威的来源。

它们基本上是R-Tree的改进版本,针对最小化的重叠进行了优化。

我不知道手头的c实现。

答案 2 :(得分:1)

真正的性能瓶颈(除了浪费内存)不是计算,而是你将遇到的间接和缓存未命中的数量。这些指数和类似的东西可以占据数百到数千的因数。因此,您最好的选择是减少间接数量并投入一些计算。据我所知,最好通过哈希你的6个指数来完成。这会将你的间接减少到两个,首先查找存储在哈希表中的值(可能是一个指针),然后直接获取你感兴趣的数据。