【问题标题】:How to speed up a CYK Algorithm in C++?如何在 C++ 中加速 CYK 算法?
【发布时间】:2013-03-28 06:32:15
【问题描述】:

我想在 C/C++ 中实现CYK algorithm,但在各种网站上提供的伪代码并不能回答如何有效地实现它。我写了一个版本,它使用了一些 stl 结构,比如 map 和 sets,但是速度很慢。我正在考虑通过仅使用二进制操作来改进我的实现,但我不知道如何用集合存储我的表。假设我们只有 8 个非终端符号和 26 个终端符号。我正在考虑使用无符号字符表(2^8 -> 0-1 的 8 个位置)来存储有关产品的信息,但我不知道如何存储它。

你能给我一些帮助或线索吗?

【问题讨论】:

标签: c++ algorithm stl implementation cyk


【解决方案1】:

您没有提供很多细节,一个简单的实现(甚至是伪代码)可以为您提供很多提示。

来自维基百科:

让输入是一个由 n 个字符组成的字符串 S:a1 ... an。让

为此,您可以使用简单的字符串或字符向量

该文法包含 r 个非终结符 R1 ... Rr。

我会将非终结符存储在一个布尔数组中 std::array 非终结符 {}; 那么由于 yu 有字符,你可以用 true 来初始化对应于 char 的位置。

非终端[static_cast('C')] = true; 你在终端上做同样的事情,你有一个非常快速的查找机制。

这个语法 包含作为起始符号集的子集 Rs。让 P[n,n,r] 是一个布尔数组。将 P 的所有元素初始化为 false。为了 对于每个单位生产 Rj -> ai,每个 i = 1 到 n set P[i,1,j] = true for each i = 2 to n -- 每个 j = 1 到 n-i+1 的跨度长度 -- 跨度开始 对于每个 k = 1 到 i-1 -- span 的分区 对于每个生产 RA -> RB RC 如果 P[j,k,B] 和 P[j+k,ik,C] 则设置 P[j,i,A] = true 如果任何 P[1,n,x] 为真(x 被迭代集合 s,其中 s 是所有 Rs 的索引)然后 S 是语言的成员,否则 S 不是成员 语言

之后的算法看起来很简单。只要确保不要在紧密循环中初始化临时值,就可以了。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2014-06-17
    • 2017-07-11
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多