我最近被要求创建一个程序来查找文本片段中的最佳匹配。我已经成功编写了这个程序,但我确实对它的时间复杂性有疑问。
问题定义如下。
给定查询,查找文档中查询词的出现次数并突出显示最佳标记。
我的程序需要的时间
O(m + n + p)
这里
m =以字符为单位的文档长度
n =以字符为单位的查询长度
p =文件中的总匹配数
在这种情况下,最大的术语总是会是" m"因为在大多数情况下,文档会比查询本身更大。
我能否安全地推断出我的节目的时间复杂度是O(m)?
答案 0 :(得分:3)
m
是你的算法运行的实际时间的上限,如果有一个常数M
,例如实时总是小于或等于M*m
。假设文档大小为零(空文档)但有人用正数字符号查询它。在这种情况下,上限将是0
(加上常量),但程序运行的实际时间可能大于此值。所以你的程序不能说是O(m)
。
换句话说,“大多数情况”是不够的:您必须证明您的算法将在所有案例的上限内执行。
更新:对于p
也可以这样说:常识说p
总是小于m
,但只有搜索条件才会出现这种情况不要重叠。例如,文档aaaaaa
(m = 6)和搜索字词a
,aa
和aaa
(n = 3)。在这种情况下,有a
,aa
中的5个和aaa
中的4个发生,因此p = 15
。即使这是一个非常不可能的场景(对于空文档也是如此),仍然需要在复杂性分析中考虑p
。因此,您的程序必须真正描述为您最初声明的O(m + n + p)
。
答案 1 :(得分:1)
我的程序所用的时间: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是无关紧要的。