我正在阅读运行具有不同配置的程序的统计数据。假设有6种配置(a
,b
,...,f
)。配置可能不会线性变化,因此如果您将测量值视为表格,则表格中可能存在间隙。问题是关于在内存中构建这些统计数据。
首先想到的是将这些配置读取到动态分配的6深度数组或数组:
struct data ******measurements;
现在这很好用。您的内存开销非常小(仅实际分配数据的配置),访问时间为O(1)
。
除了大多数人不喜欢******
指针的事实之外,这还有一个缺点,即添加配置意味着向数组添加维度,除非将数组的读/写封装在函数中,否则可能会变得难看。 (写入已经封装好,以便在必要时进行分配,所以这实际上并不是什么大问题。)
想到的另一个想法是使用AVL树或其他东西struct config
到struct data
的地图(我already have因此没有实施开销)。这解决了扩展配置参数的问题,但减少了O(log(n))
的访问时间。
O(log(n))
的测试次数可能会相当大,以便有所作为。
我的问题是:这里使用6深嵌套数组是否合理?或者有更好的方法吗?
答案 0 :(得分:2)
请注意,您当前的设置不是O(1),它是O(k),其中k是维数。使用平衡树,无论如何它都会转到O(log 2 ^ k)== O(k)(我假设每个维度有两个选择;但这并不重要......这只是一个常数)。您可能会或可能不会期望在平衡树的实现上有更大的开销。
您可以做的是尝试使用typedef和getter / setter函数(最好是可内联的)抽象接口,然后使用您想要的任何实现。然后你不必处理那么多的指针,仍然使用里面的任何结构。
答案 1 :(得分:2)
答案 2 :(得分:1)
真正的性能瓶颈(除了浪费内存)不是计算,而是你将遇到的间接和缓存未命中的数量。这些指数和类似的东西可以占据数百到数千的因数。因此,您最好的选择是减少间接数量并投入一些计算。据我所知,最好通过哈希你的6个指数来完成。这会将你的间接减少到两个,首先查找存储在哈希表中的值(可能是一个指针),然后直接获取你感兴趣的数据。