1

我有200根弦。每个字符串与每个其他字符串都有关系(通过 0 到 1 之间的浮点数来衡量)。这种关系是双向的;即关系 A/B == 关系 B/A。这会产生 n(n-1)/2 个关系,即 19,800。

我想要做的是将这些关系存储在查找表中,以便给定任何两个单词,我可以快速找到关系值。

我正在使用 c++,所以我可能会使用 std::map 来存储 LUT。问题是,用于此目的的最佳密钥是什么。

密钥必须是唯一的,并且需要能够从两个单词中快速计算出来。

我的方法是为每个单词对创建一个唯一标识符。例如,给定单词“apple”和“orange”,然后我将它们组合在一起作为“appleorange”(字母顺序,最小在前)并将其用作键值。

这是一个好的解决方案还是有人可以提出更聪明的建议?:)

4

5 回答 5

1

基本上,您正在描述两个参数的函数,并添加了参数顺序不重要的属性。

如果您在更改顺序时单词之间没有歧义,您的方法将起作用(我建议在两个单词之间放置一个昏迷或类似以消除可能的歧义)。任何二维数组也可以。

在尝试查找关系值之前,我可能会将每个关键字转换为某个唯一标识符(使用简单的映射),但它与您的提议并没有太大变化。

于 2011-01-17T09:10:54.723 回答
1

如果 boost/tr1 是可以接受的,我会选择一个以字符串对作为键的 unordered_map。那么主要的问题是:字符串的顺序是什么?这可以由散列函数处理,该函数以词法第一个字符串开头。

备注:这只是阅读设计问题后的建议,而不是研究。

于 2011-01-17T09:11:28.083 回答
1

“快”有多快?鉴于您不关心这两个单词的顺序,您可以尝试这样的地图:

std::map<std::set<std::string>, double> lut;

这里key是set两个单词中的a,所以如果插入“apple”和“orange”,那么顺序和“orange”“apple”是一样的,并且给定set支持小于运算符,可以起到key的作用在地图中。注意:考虑到那里的顺序很重要,我故意没有使用 apair作为键...

我将从类似这样的相当基本的东西开始,配置文件并查看查找等的快/​​慢等,然后再查看您是否需要做一些更聪明的事情......

于 2011-01-17T09:20:03.830 回答
0

如果您的 200 个字符串在一个数组中,那么您的 20,100 个相似值也可以在一个一维数组中。这完全取决于您如何索引该数组。假设 x 和 y 是您想要相似度的字符串的索引。必要时交换 x 和 y,使 y>=x,然后查看大数组中的条目 i= x + y(y+1)/2。

(x,y) 的 (0,0),(0,1),(1,1),(0,2),(1,2),(2,2),(0,3),(1 ,3)... 将带您进入 0,1,2,3,4,5,6,7...

因此,这可以最佳地使用空间,并且它提供比地图更快的查找速度。我假设效率对你来说至少有点重要,因为你使用的是 C++!

[如果您对 y=x 的自相似值不感兴趣,请改用 i = x + y(y-1)/2]。

于 2011-01-17T10:57:13.603 回答
0

如果您使用 200 个字符串创建一个排序数组,那么您可以对其进行二进制搜索以找到两个字符串的匹配索引,然后在二维数组中使用这两个索引来查找关系值。

于 2011-01-17T09:21:02.490 回答