Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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
Php 快速查找两个字符串之间常用词的方法_Php_String - Fatal编程技术网

Php 快速查找两个字符串之间常用词的方法

Php 快速查找两个字符串之间常用词的方法,php,string,Php,String,我有一个平均句子长度的字符串,它可以由任意随机单词组成。我还有一个文件(大约600kb),其中包含一些随机单词 我想尽可能有效地找出这两者之间的共同点。现在,我将通过两个循环将字符串中的每个单词与文件中的每个单词进行匹配,但这似乎有点低效。有没有更好更有效的方法来获取常用词?将一个集合加载到数组键中(值可以是任何值)。然后循环另一个集合并测试数组是否具有这些键。通过这种方式,您没有两个嵌套的循环,而是两个独立的循环(加载循环和测试循环),与值查找相比,键查找既简单又快速 如果您针对一个文件测试多

我有一个平均句子长度的字符串,它可以由任意随机单词组成。我还有一个文件(大约600kb),其中包含一些随机单词


我想尽可能有效地找出这两者之间的共同点。现在,我将通过两个循环将字符串中的每个单词与文件中的每个单词进行匹配,但这似乎有点低效。有没有更好更有效的方法来获取常用词?

将一个集合加载到数组键中(值可以是任何值)。然后循环另一个集合并测试数组是否具有这些键。通过这种方式,您没有两个嵌套的循环,而是两个独立的循环(加载循环和测试循环),与值查找相比,键查找既简单又快速

如果您针对一个文件测试多个句子,那么将该文件加载到数组中显然更好。如果你的文件比你的内存大(实际上不应该发生,不是600kb),那么就换一种方式


或者,您可以创建两个数组,然后使用
array\u intersect
array\u intersect\u键
。如果PHP是智能的,
array\u intersect\u keys
将使用上述过程;无论如何,它应该是好的,因为它是用C实现的。缺点是您必须将所有内容加载到内存中(同样,可能不是问题)。

您当前的算法复杂度是O(N*M)。为了改进它,可以使用哈希表来存储文件中的单词。在PHP中,关联数组被实现为哈希表。因此,您的数组将如下所示

$array = ['abc' => true, 'dfg' => true, ]// and so on

并使用
array\u key\u exists
检查单词是否在数组中。这将在验证时为您提供O(1)。最后,你必须重复句子中的单词。它将是O(N),其中N是一个单词数。最后的复杂性是O(N)

将文件移动到数据库中,将句子分解为单词,查询数据库不太复杂,但是?谢谢@Amandan。数组必须是关联数组吗?使用
array\u intersection\u键
返回整个句子,而
array\u intersect
仅返回常用词。