Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 为字符串处理挑战寻找的算法(或指向文献的指针)_String_Algorithm_Complexity Theory_Time Complexity_Partitioning - Fatal编程技术网

String 为字符串处理挑战寻找的算法(或指向文献的指针)

String 为字符串处理挑战寻找的算法(或指向文献的指针),string,algorithm,complexity-theory,time-complexity,partitioning,String,Algorithm,Complexity Theory,Time Complexity,Partitioning,一群有趣的学生只通过剽窃威廉·沙克斯佩尔全集的部分内容来撰写论文。在天平的一端,一篇文章可能只包含独白的逐字复制。。。另一方面,人们可能会看到这部作品如此新颖,以至于在使用普通字母表时,威尔在文章中没有相邻的两个字符 论文需要评分。在完整作品的纯文本中可以找到(一个字一个字相同)的任何文章都得1分。任何作品,只要能在完整作品中用不少于两个不同的段落(一个字符一个字符相同)成功完成,就得2分,以此类推。。。对于一篇有N个字符的文章,当且仅当文章中没有相邻的两个字符在完整的作品中相邻放置时,其得分为

一群有趣的学生只通过剽窃威廉·沙克斯佩尔全集的部分内容来撰写论文。在天平的一端,一篇文章可能只包含独白的逐字复制。。。另一方面,人们可能会看到这部作品如此新颖,以至于在使用普通字母表时,威尔在文章中没有相邻的两个字符

论文需要评分。在完整作品的纯文本中可以找到(一个字一个字相同)的任何文章都得1分。任何作品,只要能在完整作品中用不少于两个不同的段落(一个字符一个字符相同)成功完成,就得2分,以此类推。。。对于一篇有N个字符的文章,当且仅当文章中没有相邻的两个字符在完整的作品中相邻放置时,其得分为N

挑战在于实施一个能够有效(准确)评分论文的程序。虽然任何(可行的)数据结构来表示完整的作品都是可以接受的,但论文是以ASCII字符串的形式呈现的

考虑了一段时间这个挑逗性的问题后,我得出的结论是,这比听起来要困难得多。对于一篇长度为N的文章来说,最简单的解决方案是对整个作品进行2次**(N-1)遍历,这太低了,不实用

当然,我对建议的解决方案很感兴趣——我也希望有人能给我指点任何关于这个问题或类似问题的文献

澄清

也许一些例子(短得多的字符串)有助于澄清“文章”的“分数”

假设Shakespere的完整作品节选为:

"The quick brown fox jumps over the lazy dog."
获得1分的论文包括“自己的狐狸跳跃”和“快速眉毛”。这篇文章“慢跑”得6分(尽管很短),因为它不能在少于6段的完整作品中表现出来。。。它可以分为六个字符串,它们都是完整作品的子字符串,如下所示:“[j][og][g][i][n][g]”。注意:与原始问题相比,为这个简短的例子建立分数是微不足道的,因为在这个例子中“完整的作品”很少有重复

希望此示例分段有助于澄清完整作品中的2*(N-1)子字符串搜索。如果我们考虑分段,文章中的N个字符之间的(N-1)间隙可以是段之间的间隙,或者不是…对整个作品进行~2*(N-1)子串搜索,以检验每个分割假设


如果可行的话,DFA将是一个极好的解决方案。我可以看到如何用这种方式构造解决“子字符串匹配”的东西,但不需要打分。至少从表面上看,得分的状态空间似乎太大了(对于Shakespere的任何实质性完整作品而言)。我欢迎任何有损于我假设的解释,即(N)DFA太大,无法实际计算/存储。

检测剽窃的一般方法是将学生的文本附加到源文本中,由两个文本中均未出现的字符分隔,然后构建后缀树或后缀数组。这将允许您在线性时间内找到学生文本的较大子字符串,这些子字符串也会出现在源文本中

我发现很难更具体,因为我不理解你对分数的解释-上述方法有助于找到学生作品中最长的部分,这是一个准确的引语,但我不理解你的N-是构建学生文本所需的源文本不同部分的数量吗

如果是这样,可能会有一种动态规划方法。在步骤k,我们计算出构建学生文本的前k个字符所需的源文本的最少不同部分。使用仅从源文本或其他方式构建的后缀数组,我们可以找到源文本与学生文本的字符x..k之间的最长匹配,其中x当然尽可能小。那么,构建学生文本的前k个字符所需的源文本节的最少数量就是构建1..x-1(我们已经计算出)加1所需的最少数量。通过对k=1.学生文本的长度运行此过程,我们发现重建整个文本所需的源文本节数最少

(或者你也可以在StackOverflow中搜索学生的文本,理由是学生们现在除了在StackOverflow上发布问题外,什么都不做:-))

我声称,从左到右重复移动目标字符串,使用后缀数组或树在任何时候查找最长的匹配项,将从生成目标字符串的源文本中找到数量最少的不同字符串。我最初是通过寻找一个动态规划递归来发现这一点的,但正如Evgeny Kluev所指出的,这实际上是一个贪婪算法,所以让我们尝试用一个典型的贪婪算法来证明这一点

我想不是。然后,有一个解决方案比每次在当前比赛结束时进行最长比赛的解决方案更好。从左到右比较两个建议的解决方案,第一次查找非贪婪解决方案与贪婪解决方案的不同之处。如果有多个非贪婪的解决方案比贪婪的解决方案好,那么我将要求我们考虑在最后可能的时刻不同于贪婪的解决方案。 如果非贪婪的解决方案比贪婪的解决方案做得更好,并且没有一个非贪婪的解决方案做得更好并且以后有所不同,那么非贪婪的解决方案必须发现,作为交换,它可以在贪婪的解决方案之前断开它的第一个匹配,它可以继续它的下一个匹配超过