Php 确定现有字符串的所有子字符串的最快方法
假设我有字符串Php 确定现有字符串的所有子字符串的最快方法,php,string,algorithm,permutation,combinations,Php,String,Algorithm,Permutation,Combinations,假设我有字符串“嘿”。我希望尽可能将此字符串中存在的所有字符组合确定为fast。生成的算法应生成以下内容: H, e, y, He, ey, Hey 算法不应生成字符串“Hy”,因为它不作为子字符串存在于字符串中。这些子字符串中有O(n^2),长度[1,n],因此任何生成所有的算法都将是O(n^2)*O(n)=O(n^3): (*)参见末尾的Edit2-取决于字符串的实现-复杂性可以从O(n^2)到O(n^3) 伪代码: result <- {} #result is a set if
“嘿”
。我希望尽可能将此字符串中存在的所有字符组合确定为fast。生成的算法应生成以下内容:
H, e, y, He, ey, Hey
算法不应生成字符串“Hy”,因为它不作为子字符串存在于字符串中。这些子字符串中有O(n^2)
,长度[1,n]
,因此任何生成所有的算法都将是O(n^2)*O(n)=O(n^3)
:
(*)参见末尾的Edit2-取决于字符串的实现-复杂性可以从O(n^2)
到O(n^3)
伪代码:
result <- {} #result is a set if dupes should be terminated, otherwise - it is a multiset.
for i from 0 to s.length:
for j from i+1 to s.length:
result.add(s.substring(i,j))
return result
请注意,创建迭代器是O(1)
,每次迭代都是O(n)
——但要实际生成所有元素,需要O(n^2)
步骤,因此总体上复杂性仍然是O(n^3)
,但可以减少应用程序的延迟
编辑:
我编辑了复杂性,声称它是
O(n^2)
是错误的,复杂性是O(n^3)
,因为您需要生成长度可变的字符串,其中一些字符串很长。生成的子字符串中至少有一半长度为n/2
——因此总复杂度为Theta(n^3)
EDIT2:
在某些情况下,它实际上可以是
O(n^2)
——这取决于字符串实现。例如,在java中,它使用一个char[]
,并且只“播放”偏移量和长度,因此在java中,创建实际上是O(n^2)
,因为创建子字符串是O(1)
然而,在C语言中,它是O(n^3)
,因为每个子字符串都需要复制到不同的char[]
检查php中n-grams的实现
在您的示例字符串中:Hey
H、 E,Y是单位格
他,他们是大人物
嘿,三角形是什么?为什么一定要快?一个简单的两个循环的解决方案对我来说似乎足够快…HeyHeyHey的答案是什么?它会有3个“嘿”还是只有一个?@wildplasser:从算法的角度来看,你的建议似乎是最快的解决方案。那么你尝试了什么?您需要多少优化?你需要一个吗?在什么环境下尽可能快,一些语言比其他语言做字符串更好…我知道,但我不想破坏他的家庭作业@TylerJohnson:恐怕我不熟悉php,我不知道如何在php中创建子字符串,但大多数现代语言都不需要复制字符串,但这只是一个猜测。也许php对n-gram有其他含义,但通常被称为术语/单词。1个单词是单字,2个单词是双字,3个单词是三字,。。。例如:Hi-Amit:NGrams可能暗示单词或字符。我不是用PHP编写代码,我一般都会用。我在Lucene搜索引擎中使用NGram索引来分割单词。它也可以是术语/单词或字符。
class MyIterator:
String s
int i,j
MyIterator(String s):
this.s = s
i = 0
j = 0
next():
j = j + 1
if (j >= s.length):
i = i + 1
j = i + 1
if (i >= s.length):
throw exception
return s.substring(i,j)