【问题标题】:What is the complexity of the next grammar下一个语法的复杂度是多少
【发布时间】:2012-02-04 18:59:58
【问题描述】:

我正在开发一个通用解析算法,并使用下一条规则对其进行测试

S ::= a | SS

好吧,算法显示了为由n a's 组成的字符串生成的所有树。

例如下表显示了由于a的数量而导致算法使用的时间

length  trees   time(ms)
1           1   1
2           1   1
3           2   2
4           5   2
5           14  2
6           42  2
7           132 5
8           429 13
9           1430    28
10          4862    75
11          16796   225
12          58786   471
13          208012  1877
14          742900  10206

我不知道我的算法是什么O(大 O 表示法)。我如何测量它,因为时间当然取决于三件事:

  1. 要解析的字符串长度
  2. 语法复杂度
  3. 算法的性能

【问题讨论】:

  • programmers.SE 更适合白板问题(例如 Big-O 分析)。确保发布足够多的算法以供分析。

标签: algorithm parsing notation catalan


【解决方案1】:

S 可以匹配所有 a 的任意字符串。

任何具有 n 个叶节点的二叉树都可以是解析树,此类树的数量由 Catalan numbers 给出。

【讨论】:

    【解决方案2】:

    Big-O 不是衡量运行时间的问题。这就是剖析。 Big-O是算法分析的问题,不看算法是不可能的。

    广义上讲,将算法分解为基本操作、循环和递归调用。基本操作具有定义的时间(通常为 O(1))。循环的时间是迭代次数乘以循环体的时间。递归更棘手:您必须根据递归关系定义时间,然后求解显式解决方案。查看process call tree 可以提供关于显式解决方案可能是什么的提示。

    【讨论】:

    • 嗯,通过它在许多运行中显示的图表(元素数量与时间或操作)可以了解算法的行为,并且该算法有点指数,我不喜欢它跨度>
    • @yuryeuceda:这是分析,不是 Big-O,因为它仅用于特定输入,并且可能仅代表最佳情况、平均情况或更坏的情况。 Big-O 是分析的结果,而不是测量的结果。
    【解决方案3】:

    我们也不知道复杂性,因为您没有发布算法。但很明显,您的实现可能会非常糟糕。问题不一定出在算法上,思想上,而在于语法本身。合适的语法预处理器可以将其重写为更自然的形式

    S ::= a | a S
    

    这样处理起来会更有效率。

    【讨论】:

    • 当然!但通过这种方式,我正在改变含义并记住我正在尝试创建一个算法,我认为这是一种非常缓慢的方法,因为增长太多
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多