我确定这个问题已经有人发过帖子了,但我没有找到一个提出这个确切问题的帖子。考虑以下问题:
以上述方式,我们将得到(0, 1, 2, 3, 4)、(5, 2, 3, 6)和(7, 8, 9, 10, 3, 11, 12)等结果。请注意,3是“is”,我们在发现新单词时添加了新的唯一ID。因此,假设我们获得了一个句子“她的名字是”,那么它将变成(13, 2, 3)。我们想知道,在给定这个上下文的情况下,下一个单词应该是什么。这是我想到的算法,但我认为它不够高效:
按照这种方式继续扫描,直到我们得到的结果>0(如果有的话)。
计算我们收集到的所有剩余链中的下一个单词。我们可以使用哈希表进行计数,每次添加时都会保持跟踪最多的添加单词。最坏情况下建立为O(N),查找最大单词为O(1)。
找到的最大单词是最有可能的,所以返回它。
每次扫描最坏情况下需要O(M*N*S)。这是因为有N个链,每个链有M个数字,并且我们必须检查S个数字是否匹配。最坏情况下扫描S次(从13、2、3开始,然后是2、3,然后是3,共3次扫描=S)。因此,总复杂度为O(S^2 * M * N)。
因此,如果我们有100,000个链和平均句子长度为10个单词,那么我们需要1,000,000*S^2来获取最佳单词。显然,N>>M,因为句子长度通常不随观察到的句子数量而变化,因此M可以是一个常数。然后,我们可以将复杂度降低到O(S^2 * N)。O(S^2 * M * N)可能对于分析更有帮助,因为M可能是一个相当大的“常数”。
这可能是解决此类问题的完全错误方法,但我想分享我的想法,而不仅仅是毫无保留地请求帮助。我之所以按照这种方式扫描,是因为我只想扫描尽可能少的次数。如果没有任何东西包含完整S,只需修剪S直到某些链匹配即可。如果它们永远不匹配,我们就不知道要预测下一个单词!有关减少时间/空间复杂性的建议吗?谢谢!
- 我们有一个可用的单词字典
- 我们会得到许多段落的单词,我希望能够根据这些输入预测句子中的下一个单词。
以上述方式,我们将得到(0, 1, 2, 3, 4)、(5, 2, 3, 6)和(7, 8, 9, 10, 3, 11, 12)等结果。请注意,3是“is”,我们在发现新单词时添加了新的唯一ID。因此,假设我们获得了一个句子“她的名字是”,那么它将变成(13, 2, 3)。我们想知道,在给定这个上下文的情况下,下一个单词应该是什么。这是我想到的算法,但我认为它不够高效:
- 我们有一个N个链条(观察到的句子)的列表,其中一个链可能是3,6,2,7,8。
- 每个链的平均长度为M,其中M是平均句子长度
- 我们获得了一个大小为S的新链,比如13,2,3,我们想知道最有可能的下一个单词是什么?
- 首先扫描整个链表,查找包含完整S输入(在此示例中为13,2,3)的那些链。由于我们必须扫描N个链,每个链的长度为M,并且每次比较S个字母,因此时间复杂度为O(N*M*S)。
按照这种方式继续扫描,直到我们得到的结果>0(如果有的话)。
计算我们收集到的所有剩余链中的下一个单词。我们可以使用哈希表进行计数,每次添加时都会保持跟踪最多的添加单词。最坏情况下建立为O(N),查找最大单词为O(1)。
找到的最大单词是最有可能的,所以返回它。
每次扫描最坏情况下需要O(M*N*S)。这是因为有N个链,每个链有M个数字,并且我们必须检查S个数字是否匹配。最坏情况下扫描S次(从13、2、3开始,然后是2、3,然后是3,共3次扫描=S)。因此,总复杂度为O(S^2 * M * N)。
因此,如果我们有100,000个链和平均句子长度为10个单词,那么我们需要1,000,000*S^2来获取最佳单词。显然,N>>M,因为句子长度通常不随观察到的句子数量而变化,因此M可以是一个常数。然后,我们可以将复杂度降低到O(S^2 * N)。O(S^2 * M * N)可能对于分析更有帮助,因为M可能是一个相当大的“常数”。
这可能是解决此类问题的完全错误方法,但我想分享我的想法,而不仅仅是毫无保留地请求帮助。我之所以按照这种方式扫描,是因为我只想扫描尽可能少的次数。如果没有任何东西包含完整S,只需修剪S直到某些链匹配即可。如果它们永远不匹配,我们就不知道要预测下一个单词!有关减少时间/空间复杂性的建议吗?谢谢!