我正在开发一种产品,它需要一个哈希来存储和检索句子中的动词。我可以得到一些示例代码,可以为我开始。对我来说,关注的是检索速度以及不经常存储的速度。
更新:寻找
a)恒定时间检索O(1) b)有趣的是字符串函数(示例代码)
答案 0 :(得分:2)
Ideally I would like to store all of the [verb] forms as 1 hash index
你可能认为这几乎可以用所谓的常规动词来使用它们共有的一些块:
happen, happens, happened, happened, happening
但对于所谓的不规则动词来说肯定是不可能的:
eat, eats, ate, eaten, eating
sing, sings, sang, sung, singing
go, goes, went, gone, going
bring, brings, brought, brought, bringing
speak, speaks, spoke, spoken, speaking
还有正交替换变体来处理:
try, tries, tried, tried, trying
cry, cries, cried, cried, crying
以及其他类型的变化:
miss, misses, missed, missed, missing
我建议为每个动词形式创建一个这样的哈希表,指向无限形式;不定形式指向自身:
verb form
infinitive form
例如:
happening
happen
went
go
happen
happen
go
go
ate
eat
然后,给定一个动词形式,您可以通过执行哈希键查找很快找到它的不定式,如果您愿意,可以使用无限形式作为(哈希)键在另一个表中存储该定义
答案 1 :(得分:1)
从我们的观点来看,这可能是(大学)作业,所以如果是,你应该把它标记为“家庭作业”。
在C ++ 0B中有新的官方标准无序映射: http://en.wikipedia.org/wiki/Unordered_map_%28C%2B%2B%29
但如果这是家庭作业,那么您可能需要自己实施!创建一个数组,考虑一个好的哈希函数可能是什么并消失。
答案 2 :(得分:1)
尝试通过定义为给定动词生成唯一值的函数来创建自己的哈希映射。将值用作数组的索引或map
的键。
还在互联网上搜索单词列表构造和词典。许多使用单词列表和字典的程序按字长分解其数据结构,或者字长在哈希计算中涉及。
答案 3 :(得分:0)
一个问题是许多英语单词既可以是动词也可以是名词,只有上下文才能确定它是什么。例如,“你对这种情况有什么看法?”。 “Take”这里是名词,而不是动词。你愿意接受一种导致许多假阳性的蛮力方法吗?
你的意思是“在句子中存储和检索动词”是什么意思?识别句子中的动词,提取它们,然后将它们存储在某种数据库中?也许我误解了你的要求?
答案 4 :(得分:0)
由于存储听起来非常罕见,并且检索听起来像极其需要性能的绝对优势,我建议完美散列。由于您需要重新创建整个哈希值,因此根本不便于存储,但是为了检索,结果将得到保证O(1)。在Google上搜索“完美哈希”,你会看到Bob Jenkin的网站是第二个列出的网站。
在那里你会发现他对完美哈希的实现并且效果相当好。您可以使用他的代码作为参考,以了解如何在产品中实现完美的散列。 (我以前在这方面取得了成功,但是用于研究,而不是用于生产。)