【问题标题】:Need Suggestion on how to store large data from a chart需要关于如何存储图表中的大数据的建议
【发布时间】:2014-12-26 15:19:27
【问题描述】:
我正在实现一个混合热公式,但我对如何处理这些数据感到困惑(如上图所示)。
我的程序将包括两个下拉列表,我必须从每个下拉列表中选择一个元素。下拉列表中的一个将表示第一列的值,另一个下拉列表将表示第一行的值(如上图所述)。系统必须从下拉列表中显示这些选定元素的值。
例如。
如果我想从表中获取碳 (C) 和氮 (N) 的值为 -2。我不知道获得该特定值的最简单方法。我应该如何存储这些数据?即我应该使用多维数组、链接列表、字典、数据库等还是任何其他方法。
此图表共有 73 行和 73 列。
该图表采用 XLS 格式。
(上面显示的图片只是该图表的一小部分。)。
【问题讨论】:
标签:
java
c#
c++
arrays
multidimensional-array
【解决方案1】:
我会使用二维数组。在 C++ 中,因为您知道需要多少行/列:
char elementValues[73][73];
原因:
二维数组值具有引用局部性的优势,这意味着它们存储在内存中的值彼此相当接近。这意味着您的访问速度会快得多,因为计算机不必做那么多工作。
为此,链表将是 O(n),而数组访问将仅为 O(1)。原因是每次要查找值时都需要遍历整个列表,而在数组中,您可以直接找到所需的值。
-
字典对哈希值、键值等进行了额外的处理,这些是该特定功能不需要的。
【解决方案2】:
保持原样
public Dictionary<string, Dictionary<string, double>> Data;
这样你就不需要处理索引,而是可以通过使用元素名称来获取结果:
var value = Data["Mg"]["B"];
对于serialize dictionary,您可以将数据转换为二维数组,通过对元素名称进行升序排序(在您的示例中,它们的排序方式不同,这可能不是最佳的,因为您不想存储分子量,等等,每个元素都按那个排序)。
【解决方案3】:
据我所知,您计划根据键存储值,键本身是两个值的组合。在我看来
unordered_map<std::pair<char,char>, value_type>
可以在插入和查找方面为您提供良好的性能。
所以,如果你想让两个字符组成一个键,那就去
unordered_map<std::pair<char,char>, value_type>.
但是,如果您想通过多个键索引相同的数据,那么我建议您使用 Boost.MultiIndex。
unordered_map 是根据哈希表在内部实现的。因此,就插入和查找而言,您将获得良好的性能。