我有200个字符串。每个字符串与每个其他字符串都有一个关系(由一个介于0和1之间的浮点测量)。这种关系是双向的;即,关系A / B ==关系B / A.这产生n(n-1)/ 2个关系,或19,800。
我想要做的是将这些关系存储在查找表中,以便给定任意两个单词,我可以快速找到关系值。
我正在使用c ++,所以我可能会使用std :: map来存储LUT。问题是,什么是用于此目的的最佳关键。
密钥必须是唯一的,并且需要能够从两个单词中快速计算出来。
我的方法是为每个单词对创建一个唯一的标识符。例如,给出单词“apple”和“orange”,然后我将它们组合在一起作为“appleorange”(字母顺序,最小的第一个)并将其用作键值。
这是一个很好的解决方案,还是有人可以提出更聪明的建议? :)
答案 0 :(得分:1)
基本上,您正在描述两个参数的函数,其中添加的属性是参数的顺序不重要。
如果在更改顺序时单词之间没有歧义,您的方法将起作用(我建议在两个单词之间放置一个昏迷或类似内容以消除可能的歧义)。任何2D阵列也可以。
在尝试查找关系值之前,我可能会将每个关键字转换为某个唯一标识符(使用简单的地图),但它与您提议的内容相比没有太大变化。
答案 1 :(得分:1)
如果boost / tr1可以接受,我会选择一对字符串作为键的unordered_map。那么主要问题是:字符串的顺序是什么?这可以通过哈希函数来处理,哈希函数以词法第一个字符串开头。
备注:在阅读设计问题后,这只是一个建议,而不是研究。
答案 2 :(得分:1)
如何“快速”快速?如果您不关心这两个单词的顺序,您可以尝试这样的地图:
std::map<std::set<std::string>, double> lut;
这里的关键是两个单词的set
,所以如果你插入“apple”和“orange”,那么顺序与“orange”“apple”相同,并给出{{1} }支持小于运算符,它可以作为映射中的键。注意:我故意没有使用set
作为密钥,因为那里的订单很重要......
我会从这样一个相当基本的东西开始,在查看你是否需要更聪明地做任何事情之前,查看查找等的快/慢等等...
答案 3 :(得分:0)
如果创建一个包含200个字符串的排序数组,则可以二进制搜索它以查找两个字符串的匹配索引,然后在2D数组中使用这两个索引来查找关系值。
答案 4 :(得分: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代替]。