Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以类似于数据库表的格式计算频率的数据结构_Java_Data Structures_Data Mining - Fatal编程技术网

Java 以类似于数据库表的格式计算频率的数据结构

Java 以类似于数据库表的格式计算频率的数据结构,java,data-structures,data-mining,Java,Data Structures,Data Mining,我想知道是否有一种数据结构经过优化,可以根据存储在类似数据库表格式的数据计算频率。例如,数据以(逗号)分隔格式出现在下面 col1, col2, col3 x, a, green x, b, blue ... y, c, green 现在我只想计算col1=x或col1=x和col2=green的频率。我一直在将数据存储在数据库表中,但在我的分析和经验观察中,数据库连接是瓶颈。我也尝试过使用内存中的数据库解决方案,效果很好;唯一的问题是内存需求和奇怪的init/destroy调用 另外,我主要

我想知道是否有一种数据结构经过优化,可以根据存储在类似数据库表格式的数据计算频率。例如,数据以(逗号)分隔格式出现在下面

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方式处理“表格”数据


非常感谢您的帮助。

嵌套树形图怎么样?例如,假设您有以下记录:

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);
    }
}
有一个数据结构可以为您跟踪频率。下面是使用该数据结构的示例代码(来自)

void frequencyccounter()
{
Multiset counter=HashMultiset.create();
添加(“col1”+“=”+“x”);
添加(“col2”+“=”+“x”);
添加(“col2”+“=”+“x”);
System.out.println(“col2有多少次值为x?”);
System.out.println(计数器计数(“col2”+“=”+“x”);
}
需要注意的要点

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

您如何使用数据库?有了正确的查询,数据库应该可以很好地完成您正在做的事情……我只需要创建一个数据库表。我知道有一些优化查询的方法(即使用索引),但它们因数据库而异。此外,无法知道要创建哪些索引(在哪些列或列的组合上),因为在运行时,算法会确定哪些列是相关的。此外,程序接受任何表格数据集作为输入,因此我在运行时创建数据库表。如果我使用multiset对象/类,我认为它不会工作。因为每个add都会添加这样的字符串(“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”)作为键?我以前尝试过映射映射来解决这个问题。它的速度非常慢,可能需要非常高的内存要求。例如,如果每列有两个值,而我们有10列,则组合为2^10。但是在这个实现中,不会有2^10个条目。在这段代码中,顶层树中将有10个条目(每个唯一列名对应1个条目)。顶级树的每个节点将包含一个树映射,其中包含两个条目(每个值一个条目)。在本例中,我们总共有20个条目(10列中的每一列都有两个值)。
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"));
}