基本上,我需要一个双连接的Map,它可以从key和inverse中检索值,我已经检查了这个link,但是也应该根据值进行排序AND应该为单个值取多个值key(我无法保证不同的密钥不会有精确的freq
)。
那么有没有那个标准的结构呢?
以下是强加这种需求的具体问题(也许我在实施时遇到了一些问题,但如果你知道上述问题的答案,那么你可以跳过它):
我想为某些功能实现一个词袋方法。我们的想法是只保留发生频率最高的k
个顶部。
为了使它更具体,让我说我有一个码本
double[10000][d] codebook
和一组功能double[][] features
。对于代表特征的features
中的每一行,我检查codebook
中每行的距离,并将其分配给具有该行的质心的bin。
然后我将此bin的索引递增1,直到使用了所有功能。
然后,我想只保留最高k
个分区作为结果。
我有点卡住的部分是仅保留顶部k
箱的部分。我使用BoundedPriorityQueue<Feature>
集合来实现,但我不确定是否有一些更简单的方法。
public static BoundedPriorityQueue<Feature> boWquantizerLargerK(double[][] codebook, double[][] features, int featureLength, int maxNumWords) {
HashMap<Integer, Integer> boWMap = new HashMap<Integer, Integer>();
BoundedPriorityQueue<Feature> nn = new BoundedPriorityQueue<Feature>(new Feature(), maxNumWords);
for(int i = 0; i < features.length; i++) {
double[] distCodebook = new double[codebook.length];
for(int j = 0; j < codebook.length; j++) {
double[] dist = new double[featureLength];
for(int k = 0; k < featureLength; k++)
dist[k] = (codebook[j][k] - features[i][k])*(codebook[j][k] - features[i][k]);
distCodebook[j] = MathUtils.sum(dist);
}
Integer index = MathUtils.indexOfMin(distCodebook) + 1;
Integer freq;
if((freq = boWMap.get(index)) == null) {
boWMap.put(index, 1);
nn.offer(new Feature(1, index));
}
else {
boWMap.put(index, ++freq);
nn.offer(new Feature(freq, index));
}
}
return nn;
}
Feature
类是Comparator
的简单实现:
public class Feature implements Comparator<Feature> {
private Integer freq;
private Integer word;
public Feature() {}
public Feature(Integer freq, Integer word) {
this.freq = freq;
this.word = word;}
public int compare(Feature o1, Feature o2) {
if ((o1).getFrequency() > (o2).getFrequency())
return -1;
else if ((o1).getFrequency() < (o2).getFrequency())
return 1;
else
return 0;}
public double getFrequency() {
return freq;}
}
总结一下这个问题,我有一个集合,它有成员对的值,第一个代表bin,第二个代表频率。此集合将更新,直到所有功能都已处理完毕,此时我只想保留具有最大值的bin。
我对集合使用HashMap<Integer, Integer>
结构,为BoundedPriorityQueue<Feature>
个顶部使用k
。