Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 用几种语言保存完整句子的数据结构_Data Structures - Fatal编程技术网

Data structures 用几种语言保存完整句子的数据结构

Data structures 用几种语言保存完整句子的数据结构,data-structures,Data Structures,我计划用某种语言保存大量句子,这样每个元素都有一个指向该句子翻译成不同语言的指针。 通过对句子进行排序,我可以创建一个平衡二叉树,并在O(logn)中添加/删除/搜索。 有没有办法将元素保存在哈希表中?在这种情况下,哈希函数是什么样子的? 我希望能够搜索任何语言的句子,并返回任何其他语言的翻译。 如果我有K种语言,使用平衡树可以得到K种树的O(klogn)搜索时间。 有更好的方法吗?是的,更适合字符串搜索。此外,我还将所有语言的所有句子存储在单个trie中,值为所有可用翻译的列表 这种情况下的搜

我计划用某种语言保存大量句子,这样每个元素都有一个指向该句子翻译成不同语言的指针。
通过对句子进行排序,我可以创建一个平衡二叉树,并在O(logn)中添加/删除/搜索。
有没有办法将元素保存在哈希表中?在这种情况下,哈希函数是什么样子的?
我希望能够搜索任何语言的句子,并返回任何其他语言的翻译。
如果我有K种语言,使用平衡树可以得到K种树的O(klogn)搜索时间。
有更好的方法吗?

是的,更适合字符串搜索。此外,我还将所有语言的所有句子存储在单个trie中,值为所有可用翻译的列表

这种情况下的搜索将是O(k),其中
k
是搜索句子的长度

UPD 如果您只搜索已知语言并翻译为另一种已知的预先语言,则:

使每个都成为trie
Map的值

您将有以下工作流:Find value,它对应于trie中给定的句子。在找到的映射中搜索源语言。若找到,这意味着该句子是目标语言(假设语言之间可能存在冲突)。此时,found Map(内部)表示到目标语言的所有可用翻译。搜索所需的一个

实现这两个映射的最有效的方法是普通数组。其中,
i-th
元素表示
i-th
翻译的值(假设翻译数量有限,并且可以为每个翻译分配不同的索引)。对已知翻译的搜索将是O(1)-仅访问数组中的已知索引。但这种方法也会消耗大量内存,因为如果在映射中有稀疏值,则支持数组仍将消耗固定数量的内存(与所有可能转换的数量成比例)

但这种方法适用于内部映射(据我所知,所有可能语言的翻译都存储在内部映射中)

对于外部贴图(我希望是稀疏的),您有几个选项:

  • 如果不同语言的句子之间的平均冲突数很小(1-2),您可以只存储密钥→列表中的值对。平均搜索时间将保持不变
  • 如果平均冲突数很重要,但仍然不足以使用数组(内部映射的方法),则通过哈希表返回此映射,该大小将是映射中的预期值数-平均冲突数。然后,您将再次得到摊销O(1)搜索时间
  • 地图似乎是密集的-使用数组方法,就像内部地图一样
UPD2示例:

假设您有下一个相互翻译的句子: 你好 你好 哈罗 哈罗[德]

您应该使用以下值将它们全部添加到trie中:

Hello -> Map([en] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo))
Hola -> Map([es] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo))
Hallo -> Map([nl] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo),
             [de] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo))
这里的方括号与数组无关,它们用于直观地区分语言

所以,当您在trie中执行搜索时,您不知道您的句子使用哪种语言。当您从trie(映射图)中获得值时,您可以将句子的原始语言“映射”到所需语言的翻译

回到例子,若你们有一个句子“你好”,你们知道它在[de]中,你们想把它翻译成[en]。 您可以在trie中搜索“Hallo”,并获得:

Map([nl] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo),
             [de] -> Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo))
现在从这个映射中得到[de]的值(正如您在[de]中所想的句子)。您将获得:

Map([en]->Hello, [es]->Hola, [nl]->Hallo, [de]->Hallo)
现在在这个映射([en])中获取目标语言的搜索。你会得到“你好”



当然,您可以使用Map->Trie->Map结构来代替Trie->Map结构,其中第一个Map将源语言映射到相应的字典,由Trie表示。但我认为这是内存效率较低的,因为不同语言中的单词似乎经常共享相同的前缀,因此将它们放在单个trie中将保留内存。但是在性能效率方面是一样的,所以这取决于您。

使用trie,我应该如何用不同的语言搜索它?我能理解trie是否有一种语言,但如果有一个可用的翻译列表,我如何搜索?@yinoneliaz检查我答案的更新。我希望我正确理解了您的工作流程。如果我理解正确,我只能在trie中搜索一种语言。如果我想检查trie中是否有西班牙语的句子,英语是trie的语言,我必须有翻译来搜索trie。我是对的?