假设我有n个类:
答:这是,鲑鱼,系统的测试,
B:我喜欢,测试,比目鱼,系统
C:to,test,a,salmon,is,like,to,test,the,iodine,system
我想为每个班级获得最独特的单词,所以有一个排名给我的东西
A:鲑鱼
B:比目鱼
C:碘,鲑鱼(作为他们的第一个元素;它可以是所有单词的排名)
我该怎么做?将有数百个输入类,每个类具有数万个令牌。
我猜这本质上就是任何搜索引擎后端所做的事情,但我想要一个相当简单的独立事物。
答案 0 :(得分:2)
使用像Python这样的语言,你可以用8行有效地编写它。对于数百个团体,每个团体都有成千上万的代币,运行时间听起来最多需要几分钟(尽管我还没有在实际输入中尝试过这种情况)。
创建一个基于哈希的字典,将每个单词映射到其出现次数。
迭代所有群组和群组中的所有字词,然后更新此词典。
对于每个小组,
一个。如果您需要总排名,请将字典中的值排序为critera
湾如果您需要顶部 k ,请使用字典中的值作为条件再次使用order statistics type of algorithm
步骤1 + 2应该预期总字数的线性复杂性。
第3步是每组的 n log(n)总排名,否则为总字数的线性。
以下是顶部 k 的Python代码。假设all_groups
是字符串列表的列表,k = 10
。
from collections import Counter
import heapq
import operator
c = Counter()
for g in all_groups:
c.update(g)
for g in all_groups:
print heapq.nsmallest(k, [(w, c[w]) for w in g], key=operator.itemgetter(1))
答案 1 :(得分:1)
我从你的问题中理解,我将这个解决方案作为每个班级中使用最少的单词与所有其他类相比较。
var a = "this,is,a,test,of,the,salmon,system".split(","),
b = "i,like,to,test,the,flounder,system".split(","),
c = "to,test,a,salmon,is,like,to,test,the,iodine,system".split(","),
map = {},
min,
key,
parse = function(stringArr) {
var length = stringArr.length,
i,count;
for (i = 0; i< length; i++) {
if (count = map[stringArr[i]]) {
map[stringArr[i]] = count + 1;
}
else {
map[stringArr[i]] = 1;
}
}
},
get = function(stringArr) {
min = Infinity;
stringArr.forEach((item)=>{
if (map[item] < min) {
min = map[item];
key = item
}
});
console.log(key);
};
parse(a);
parse(b);
parse(c);
get(a);
get(b);
get(c);
答案 2 :(得分:0)
忽略课程,浏览所有单词并制作频率表。
然后,为每个班级选择频率最低的单词。
Python中的示例(保持非Python用户可读性的略微单一解决方案):
a = "this,is,a,test,of,the,salmon,system".split(",")
b = "i,like,to,test,the,flounder,system".split(",")
c = "to,test,a,salmon,is,like,to,test,the,iodine,system".split(",")
freq = {}
for word in a + b + c:
freq[word] = (freq[word] if word in freq else 0) + 1
print("a: ", min(a, key=lambda w: freq[w]))
print("b: ", min(b, key=lambda w: freq[w]))
print("c: ", min(c, key=lambda w: freq[w]))