【问题标题】:What is the best way to store a table in C++在 C++ 中存储表的最佳方法是什么
【发布时间】:2013-02-15 15:08:33
【问题描述】:

我正在使用 C4.5 algorithm 的略微修改版本在 C++ 中编写决策树。每个节点代表数据集的一个属性或一列,并且每个可能的属性值都有一个子节点。

我的问题是如何存储训练数据集,因为我必须为每个节点使用一个子集,因此我需要一种快速方法来仅选择行和列的子集。

主要目标是尽可能节省内存和时间(按优先级顺序)。

我认为最好的方法是拥有一个数组数组(或 std::vector)或类似的东西,并且每个节点都有一个列表(数组、向量等)或带有 column,line(可能是对该节点有效的元组对。

我现在应该有更好的方法来做到这一点,有什么建议吗?

更新:我需要的是这样的:

一开始我有这个数据:

Paris    4    5.0    True
New York 7    1.3    True
Tokio    2    9.1    False
Paris    9    6.8    True
Tokio    0    8.4    False

但是对于第二个节点,我只需要这些数据:

Paris    4    5.0
New York 7    1.3
Paris    9    6.8

对于第三个节点:

Tokio    2    9.1
Tokio    0    8.4

但对于一个包含数百万条记录和多达数百列的表。

我的想法是将所有数据保存在一个矩阵中,然后为每个节点保存当前列和行的信息。像这样的:

Paris    4    5.0    True
New York 7    1.3    True
Tokio    2    9.1    False
Paris    9    6.8    True
Tokio    0    8.4    False

节点 2:

columns = [0,1,2]
rows = [0,1,3]

节点 3:

columns = [0,1,2]
rows = [2,4]

这样在最坏的情况下我只能浪费

size_of(int) * (number_of_columns + number_of_rows) * node

这比为每个节点拥有一个独立的数据矩阵要少得多。

【问题讨论】:

  • 在 C++ 中,总是在数组之前想到 std::vector
  • @JoachimPileborg 是的,我几乎总是这样做,但我从未使用过向量向量,所以我不确定这是否是个好主意。
  • 为什么不用C5.0算法?
  • @ÖöTiib 在我看来,C5 算法只是提高了一些内存效率,并没有真正生成比 C4.5 或它的前身 ID3 算法更好的决策树。

标签: c++ data-structures decision-tree


【解决方案1】:

使用 at trie 怎么样:http://en.wikipedia.org/wiki/Trie

还有关于如何实现trie的讨论: Trie implementation

【讨论】:

  • 能否详细说明如何使用trie来表示数据表?
猜你喜欢
  • 1970-01-01
  • 2013-05-23
  • 2011-02-27
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2011-06-16
  • 2011-02-28
  • 2020-04-28
相关资源
最近更新 更多