创建一个Hash来存储和检索英语动词

时间:2011-07-28 12:10:07

标签: c++ c data-structures

我正在开发一种产品,它需要一个哈希来存储和检索句子中的动词。我可以得到一些示例代码,可以为我开始。对我来说,关注的是检索速度以及不经常存储的速度。

更新:寻找

a)恒定时间检索O(1) b)有趣的是字符串函数(示例代码)

5 个答案:

答案 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的网站是第二个列出的网站。

在那里你会发现他对完美哈希的实现并且效果相当好。您可以使用他的代码作为参考,以了解如何在产品中实现完美的散列。 (我以前在这方面取得了成功,但是用于研究,而不是用于生产。)