【问题标题】:Time complexity of a program which involves multiple variables涉及多个变量的程序的时间复杂度
【发布时间】:2012-06-11 00:46:44
【问题描述】:

我最近被要求创建一个程序来查找文本片段中的最佳匹配。我已经成功编写了这个程序,但我对它的时间复杂度有疑问。

问题定义如下。

给定一个查询,在文档中查找查询词的出现并突出显示最佳标记。

我的程序花费的时间

O(m + n + p)

这里

m = 文档长度,以字符为单位

n = 查询的字符长度

p = 文档中的总匹配数

在这种情况下,最大的词总是“m”,因为在大多数情况下,文档会比查询本身大。

我可以安全地推断出我的程序的时间复杂度是 O(m) 吗?

【问题讨论】:

    标签: performance time-complexity computation-theory


    【解决方案1】:

    不,你不能。根据Big-O notation,您的函数m 是算法运行实际时间的上限,如果有一个常数M,例如实时将始终小于或等于M*m。以文档大小为零(一个空文档)但有人用正数字符查询它的情况为例。在这种情况下,上限将是0(加上一个常数),但程序运行的实际时间可能会比这更长。所以你的程序不能说是O(m)

    换句话说,“大多数情况”是不够的:您必须证明您的算法在所有情况下都能在上限范围内执行。

    更新:p 也可以这样说:常识说p 总是小于m,但只有在搜索词不重叠时才会如此。以文档aaaaaa (m=6) 和搜索词aaaaaa (n=3) 为例。在这种情况下,a 出现 6 次,aa 出现 5 次,aaa 出现 4 次,所以 p = 15。即使这是一个非常不可能的情况(对于空文档也是如此),您仍然需要在复杂性分析中考虑p。所以你的程序必须像你最初所说的那样真正描述为O(m + n + p)

    【讨论】:

    • 非常感谢,这很有帮助
    • @Grrrrrr 我的第一个答案让我感到困扰,但花了一段时间才意识到它是什么。原来我所说的关于p 是错误的,请参阅我的更新答案。
    【解决方案2】:

    我的程序花费的时间:O(m + n + p) 首先,我完全不相信你的程序需要这么长时间。

    您被要求解析查询并在文档中查找单词。这是一个复杂的交叉引用问题,因为多个单词中的字符必须以精确的字符序列与随机放置在文档中的相同序列匹配。大多数学生对此进行哈希运算并创建一个 N 平方过程,方法是获取第一个单词并扫描文档以查找该单词的出现,然后对下一个、下一个和下一个执行相同的操作。您需要开发一种交叉引用文档内容和单词的有效方法,否则您将创建一个 N^2 过程。副手,在查询中创建一个单词字典,将文档解析为单词并将它们与要查找的单词字典进行匹配。 那将是 mLogn

    m = number of words the document
    n = number of words in the dictionary you create in an nLogn process.
    

    在我写的一篇文章中提到了你,因为它解决了一个类似但更复杂的单词匹配问题:

    http://www.codeproject.com/Tips/882998/Performance-Solving-WonderWord-Puzzle

    您的第一响应者是正确的,同时假设我没有认为您必须在不使用中断的情况下找到字符,但我认为他的 O 表示法是错误的,因为它们是相乘的,而不是相加的,并且 p 是不相关的。

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2020-11-06
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多