【问题标题】:data structure for counting frequencies in a database table-like format用于以类似数据库表的格式计算频率的数据结构
【发布时间】:2011-06-08 07:01:21
【问题描述】:

我想知道是否有一种数据结构经过优化,可以针对以数据库表格格式存储的数据计算频率。例如,以下数据采用(逗号)分隔格式。

col1, col2, col3
x, a, green
x, b, blue
...
y, c, green

现在我只想计算 col1=x 或 col1=x 和 col2=green 的频率。我一直将数据存储在数据库表中,但在我的分析和经验观察中,数据库连接是瓶颈。我也尝试过使用内存数据库解决方案,效果很好;唯一的问题是内存需求和古怪的 init/destroy 调用。

另外,我主要使用 java,但有使用 .net 的经验,并且想知道是否有任何 api 可以使用 java 以 linq 方式处理“表格”数据。

感谢任何帮助。

【问题讨论】:

  • 你是如何使用数据库的?通过正确的查询,数据库应该可以很好地满足您正在做的事情......
  • 我只是创建了一个数据库表。我知道有一些方法可以优化查询(即使用索引),但它们因数据库而异。此外,无法知道要创建哪些索引(在哪些列或列组合上),因为在运行时,算法会确定哪些列是相关的。此外,该程序接受任何表格数据集作为输入,因此我在运行时创建数据库表。

标签: java data-structures data-mining


【解决方案1】:

有一个Multiset 数据结构可以为您跟踪频率。这是使用该数据结构的示例代码(来自google-guava)。

void frequencyCounter()
{
    Multiset<String> counter = HashMultiset.create();

    counter.add("col1" + "=" + "x");
    counter.add("col2" + "=" + "x");
    counter.add("col2" + "=" + "x");

    System.out.println("how many times did col2 have the value x?");
    System.out.println(counter.count("col2" + "=" + "x"));
}

注意事项。

  • 我正在连接列名 (col1) 及其值 (x) 与 (=) 为 分隔符同时添加到 多集
  • 我正在重复相同的过程 检查频率 a
    给定列中的特定值

【讨论】:

  • 如果我使用多集对象/类,我认为它不会起作用。因为每次添加都会添加这样的字符串(“col1=x,col2=y,col3=green”)。然后我需要 count 能够计算像这样的过滤器 1)col1=x,2)col1=y 和 col2=x,或 3)col3=green,col2=x。请注意,列顺序并不重要,我如何创建过滤器可能会将 col3 放在 col1 或 col2 之前。
  • @user373312 所以你说你想使用 ("col1=x,col2=y,col3=green") 作为键?
【解决方案2】:

嵌套的 TreeMap 怎么样?例如,假设您有以下记录:

col1=v, col2=v2
col1=v, col2=v3

您希望能够查询结构并询问“col1 有多少次具有值 v?”

我将使用以下代码将值插入到结构中:

TreeMap tm = new TreeMap();
//the map hasn't seen this column name yet
if(!tm.containsKey(columnName)){
    //mark the column value as being seen once
    tm.put(columnName, (new TreeMap()).put(colVal, 1));
}else{
    //the map has seen the column name.
    TreeMap valueMap = tm.get(columnName);
    if(valueMap.containsKey(colVal)){
        //we've seen this column value before.
        //Increment the number of times we've seen it
        int valCount = valueMap.get(colVal);
        valueMp.put(colVal, valCount++);
    }else{
        //we've have not seen this column value before.
        valueMap.put(colVal, 1);
    }
}

【讨论】:

  • 我之前尝试过地图地图来解决这个问题。它非常慢,并且可能需要过高的内存要求。例如,如果每列有两个值,而我们有 10 列,则组合为 2^10。
  • 在这个实现中,不会有 2^10 个条目。在此代码中,顶层树中将有 10 个条目(每个唯一列名对应 1 个条目)。顶层树的每个节点将包含一个 TreeMap,其中包含两个条目(每个值一个)。在这种情况下,我们总共有 20 个条目(10 列中的每一列都有两个值)。
猜你喜欢
  • 2016-11-08
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 2012-10-20
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多