структура данных для подсчета частот в табличном формате - PullRequest
1 голос
/ 13 января 2011

Мне было интересно, существует ли структура данных, оптимизированная для подсчета частот по отношению к данным, которые хранятся в табличном формате базы данных.например, данные поступают в формате (запятая) ниже.

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

Теперь я просто хочу посчитать частоту col1 = x или col1 = x и col2 = зеленый.я хранил данные в таблице базы данных, но в моем профилировании и из эмпирических наблюдений подключение к базе данных является узким местом.я тоже пытался использовать базы данных в памяти, и это работает довольно хорошо;единственная проблема - требования к памяти и причудливые вызовы init / destroy.

Кроме того, я работаю в основном с Java, но имею опыт работы с .net, и мне было интересно, есть ли API для работы с «табличными» даннымиlinq способ с использованием Java.

любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Существует структура данных 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) с (=) как разделитель при добавлении к Мультисеть
  • Я повторяю тот же процесс, чтобы проверить на частоту а
    конкретное значение в данном столбце
0 голосов
/ 13 января 2011

Как насчет вложенного TreeMap?Например, скажем, у вас есть следующие записи:

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

Вы хотите иметь возможность запросить структуру и спросить: «Сколько раз col1 имел значение v?»

Iиспользовать следующий код для вставки значений в структуру:

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);
    }
}
...