Java 在干草堆中查找多个针-字符串搜索

Java 在干草堆中查找多个针-字符串搜索,java,php,arrays,algorithm,string-search,Java,Php,Arrays,Algorithm,String Search,问题:如何从具有次线性性能的文档中查找内容体中的字符串,以及要查找的字符串必须按顺序或其关联id(而不是字母顺序)进行查找 我们最好用PHP或JAVA解决这个问题 trie或Knuth-Pratt-Morris或boyer-moore实现或其他类似的算法能否帮助在次线性时间内找到这些匹配,如果可以,请告诉我如何找到 更多细节 列表长度可以是数百万行。 每个字符串可以包含字符a-z0-9和空格,即堆栈溢出、堆栈溢出 每个字符串都有一个唯一的标识符id,它是一个整数。{s:stackoverflow

问题:如何从具有次线性性能的文档中查找内容体中的字符串,以及要查找的字符串必须按顺序或其关联id(而不是字母顺序)进行查找

我们最好用PHP或JAVA解决这个问题

trie或Knuth-Pratt-Morris或boyer-moore实现或其他类似的算法能否帮助在次线性时间内找到这些匹配,如果可以,请告诉我如何找到

更多细节

列表长度可以是数百万行。 每个字符串可以包含字符a-z0-9和空格,即堆栈溢出、堆栈溢出 每个字符串都有一个唯一的标识符id,它是一个整数。{s:stackoverflow,:920001} 匹配或找到的字符串应按其唯一标识符的顺序找到。 也值得注意。字符串列表不会经常更改。内容确实如此

*范例

字符串数组920001唯一字符串和2个文档示例。检查内容中的列表中是否存在字符串。继续查找匹配项,直到找到3个字符串或列表已用尽。当在内容输出中找到字符串时,新数组中的字符串匹配[]

正如您所看到的,字符串stackoverflow在列表的最后一段很长,但在示例2中,我们只匹配字符串,其中一个是stackoverflow,使用简单的循环和字符串数组的匹配需要几秒钟的时间来匹配

为此,请将下面的列表视为包含920001行,并且12和920000之间的行中的字符串不包含任何匹配项

**示例列表

"strings":[
    {"s":"Disney World", "#":"1"}, 
    {"s":"Universal Studios", "#":"2"}, 
    {"s":"Disneyland", "id":"3"}, 
    {"s":"Slide", "id":"4"}, 
    {"s":"Disneyland", "id":"5"}, 
    {"s":"Plane", "id":"6"}, 
    {"s":"Walt Disney World", "#":"7"}, 
    {"s":"Florida", "#":"8"}, 
    {"s":"Puerto Rico", "#":"9"}, 
    {"s":"Dominican Republic", "id":"10"}, 
    {"s":"Las Vegas", "#":"11"},
    {"s":"Mexico", "#":"12"}
    ....
    ....
    {"s":"United States", "#":"920000"}
    {"s":"stackoverflow", "#":"920001"}
]
**内容示例

content = "Bordered on the west by the Gulf of Mexico and on the east by the Atlantic Ocean, Florida has the longest coastline in the contiguous United States and its geography is dominated by water and the threat of frequent hurricanes. Whether you’re a native or just visiting stackoverflow"

content ="tourist attractions and amusement parks. Slide to the seaside hot spots and abundant nightlife, what you need to stay on top of all of the new developments in the Panhandle State today stackoverflow"
在我看来,这就是问题所在。

构建一个内容的后缀树,合并每个内容的所有后缀树,然后在此后缀树中搜索字符串

如果使用,它是线性=On+m,其中n是内容的大小,m是字符串的大小


您无法实现次线性性能,因为如果匹配,您需要至少读取所有内容一次。

更新后列表不能按字母顺序排序,然后在运行查询时将结果按标识符顺序排序的原因是什么?我已尝试循环数组以查找匹配项,即沿函数线排序包含$input,数组$referers{foreach$referers as$referer{if stripos$input,$referer!==false{return true;}}}return false;}如果包含$referer,$valid_referers{//contains}@Jayde我的想法是,在更新后不按字母顺序排序,然后在运行查询时将结果按标识符顺序排序,使用该方法每次都必须遍历整个列表。如果它是按ID顺序传输的,则只需搜索,直到找到所需的匹配数,从而节省时间。这是我的理论。如果字符串按字母顺序排序,您可以对列表进行二进制搜索。之后对几根针进行分类会非常快。这就像在电话簿中搜索10个姓名和电话号码,然后将结果按电话号码顺序排序。当存在数十亿个独特文档时,构建后缀树是否高效快捷?